[NETFILTER]: Add nf_conntrack subsystem.
The existing connection tracking subsystem in netfilter can only
handle ipv4. There were basically two choices present to add
connection tracking support for ipv6. We could either duplicate all
of the ipv4 connection tracking code into an ipv6 counterpart, or (the
choice taken by these patches) we could design a generic layer that
could handle both ipv4 and ipv6 and thus requiring only one sub-protocol
(TCP, UDP, etc.) connection tracking helper module to be written.
In fact nf_conntrack is capable of working with any layer 3
protocol.
The existing ipv4 specific conntrack code could also not deal
with the pecularities of doing connection tracking on ipv6,
which is also cured here. For example, these issues include:
1) ICMPv6 handling, which is used for neighbour discovery in
ipv6 thus some messages such as these should not participate
in connection tracking since effectively they are like ARP
messages
2) fragmentation must be handled differently in ipv6, because
the simplistic "defrag, connection track and NAT, refrag"
(which the existing ipv4 connection tracking does) approach simply
isn't feasible in ipv6
3) ipv6 extension header parsing must occur at the correct spots
before and after connection tracking decisions, and there were
no provisions for this in the existing connection tracking
design
4) ipv6 has no need for stateful NAT
The ipv4 specific conntrack layer is kept around, until all of
the ipv4 specific conntrack helpers are ported over to nf_conntrack
and it is feature complete. Once that occurs, the old conntrack
stuff will get placed into the feature-removal-schedule and we will
fully kill it off 6 months later.
Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: Harald Welte <laforge@netfilter.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
2005-11-10 00:38:16 +00:00
|
|
|
#ifndef _NF_CONNTRACK_COMMON_H
|
|
|
|
#define _NF_CONNTRACK_COMMON_H
|
|
|
|
/* Connection state tracking for netfilter. This is separated from,
|
|
|
|
but required by, the NAT layer; it can also be used by an iptables
|
|
|
|
extension. */
|
|
|
|
enum ip_conntrack_info
|
|
|
|
{
|
|
|
|
/* Part of an established connection (either direction). */
|
|
|
|
IP_CT_ESTABLISHED,
|
|
|
|
|
|
|
|
/* Like NEW, but related to an existing connection, or ICMP error
|
|
|
|
(in either direction). */
|
|
|
|
IP_CT_RELATED,
|
|
|
|
|
|
|
|
/* Started a new connection to track (only
|
|
|
|
IP_CT_DIR_ORIGINAL); may be a retransmission. */
|
|
|
|
IP_CT_NEW,
|
|
|
|
|
|
|
|
/* >= this indicates reply direction */
|
|
|
|
IP_CT_IS_REPLY,
|
|
|
|
|
|
|
|
/* Number of distinct IP_CT types (no NEW in reply dirn). */
|
|
|
|
IP_CT_NUMBER = IP_CT_IS_REPLY * 2 - 1
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Bitset representing status of connection. */
|
|
|
|
enum ip_conntrack_status {
|
|
|
|
/* It's an expected connection: bit 0 set. This bit never changed */
|
|
|
|
IPS_EXPECTED_BIT = 0,
|
|
|
|
IPS_EXPECTED = (1 << IPS_EXPECTED_BIT),
|
|
|
|
|
|
|
|
/* We've seen packets both ways: bit 1 set. Can be set, not unset. */
|
|
|
|
IPS_SEEN_REPLY_BIT = 1,
|
|
|
|
IPS_SEEN_REPLY = (1 << IPS_SEEN_REPLY_BIT),
|
|
|
|
|
|
|
|
/* Conntrack should never be early-expired. */
|
|
|
|
IPS_ASSURED_BIT = 2,
|
|
|
|
IPS_ASSURED = (1 << IPS_ASSURED_BIT),
|
|
|
|
|
|
|
|
/* Connection is confirmed: originating packet has left box */
|
|
|
|
IPS_CONFIRMED_BIT = 3,
|
|
|
|
IPS_CONFIRMED = (1 << IPS_CONFIRMED_BIT),
|
|
|
|
|
|
|
|
/* Connection needs src nat in orig dir. This bit never changed. */
|
|
|
|
IPS_SRC_NAT_BIT = 4,
|
|
|
|
IPS_SRC_NAT = (1 << IPS_SRC_NAT_BIT),
|
|
|
|
|
|
|
|
/* Connection needs dst nat in orig dir. This bit never changed. */
|
|
|
|
IPS_DST_NAT_BIT = 5,
|
|
|
|
IPS_DST_NAT = (1 << IPS_DST_NAT_BIT),
|
|
|
|
|
|
|
|
/* Both together. */
|
|
|
|
IPS_NAT_MASK = (IPS_DST_NAT | IPS_SRC_NAT),
|
|
|
|
|
|
|
|
/* Connection needs TCP sequence adjusted. */
|
|
|
|
IPS_SEQ_ADJUST_BIT = 6,
|
|
|
|
IPS_SEQ_ADJUST = (1 << IPS_SEQ_ADJUST_BIT),
|
|
|
|
|
|
|
|
/* NAT initialization bits. */
|
|
|
|
IPS_SRC_NAT_DONE_BIT = 7,
|
|
|
|
IPS_SRC_NAT_DONE = (1 << IPS_SRC_NAT_DONE_BIT),
|
|
|
|
|
|
|
|
IPS_DST_NAT_DONE_BIT = 8,
|
|
|
|
IPS_DST_NAT_DONE = (1 << IPS_DST_NAT_DONE_BIT),
|
|
|
|
|
|
|
|
/* Both together */
|
|
|
|
IPS_NAT_DONE_MASK = (IPS_DST_NAT_DONE | IPS_SRC_NAT_DONE),
|
|
|
|
|
|
|
|
/* Connection is dying (removed from lists), can not be unset. */
|
|
|
|
IPS_DYING_BIT = 9,
|
|
|
|
IPS_DYING = (1 << IPS_DYING_BIT),
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Connection tracking event bits */
|
|
|
|
enum ip_conntrack_events
|
|
|
|
{
|
|
|
|
/* New conntrack */
|
|
|
|
IPCT_NEW_BIT = 0,
|
|
|
|
IPCT_NEW = (1 << IPCT_NEW_BIT),
|
|
|
|
|
|
|
|
/* Expected connection */
|
|
|
|
IPCT_RELATED_BIT = 1,
|
|
|
|
IPCT_RELATED = (1 << IPCT_RELATED_BIT),
|
|
|
|
|
|
|
|
/* Destroyed conntrack */
|
|
|
|
IPCT_DESTROY_BIT = 2,
|
|
|
|
IPCT_DESTROY = (1 << IPCT_DESTROY_BIT),
|
|
|
|
|
|
|
|
/* Timer has been refreshed */
|
|
|
|
IPCT_REFRESH_BIT = 3,
|
|
|
|
IPCT_REFRESH = (1 << IPCT_REFRESH_BIT),
|
|
|
|
|
|
|
|
/* Status has changed */
|
|
|
|
IPCT_STATUS_BIT = 4,
|
|
|
|
IPCT_STATUS = (1 << IPCT_STATUS_BIT),
|
|
|
|
|
|
|
|
/* Update of protocol info */
|
|
|
|
IPCT_PROTOINFO_BIT = 5,
|
|
|
|
IPCT_PROTOINFO = (1 << IPCT_PROTOINFO_BIT),
|
|
|
|
|
|
|
|
/* Volatile protocol info */
|
|
|
|
IPCT_PROTOINFO_VOLATILE_BIT = 6,
|
|
|
|
IPCT_PROTOINFO_VOLATILE = (1 << IPCT_PROTOINFO_VOLATILE_BIT),
|
|
|
|
|
|
|
|
/* New helper for conntrack */
|
|
|
|
IPCT_HELPER_BIT = 7,
|
|
|
|
IPCT_HELPER = (1 << IPCT_HELPER_BIT),
|
|
|
|
|
|
|
|
/* Update of helper info */
|
|
|
|
IPCT_HELPINFO_BIT = 8,
|
|
|
|
IPCT_HELPINFO = (1 << IPCT_HELPINFO_BIT),
|
|
|
|
|
|
|
|
/* Volatile helper info */
|
|
|
|
IPCT_HELPINFO_VOLATILE_BIT = 9,
|
|
|
|
IPCT_HELPINFO_VOLATILE = (1 << IPCT_HELPINFO_VOLATILE_BIT),
|
|
|
|
|
|
|
|
/* NAT info */
|
|
|
|
IPCT_NATINFO_BIT = 10,
|
|
|
|
IPCT_NATINFO = (1 << IPCT_NATINFO_BIT),
|
|
|
|
|
|
|
|
/* Counter highest bit has been set */
|
|
|
|
IPCT_COUNTER_FILLING_BIT = 11,
|
|
|
|
IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT),
|
|
|
|
};
|
|
|
|
|
|
|
|
enum ip_conntrack_expect_events {
|
|
|
|
IPEXP_NEW_BIT = 0,
|
|
|
|
IPEXP_NEW = (1 << IPEXP_NEW_BIT),
|
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
struct ip_conntrack_counter
|
|
|
|
{
|
|
|
|
u_int32_t packets;
|
|
|
|
u_int32_t bytes;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ip_conntrack_stat
|
|
|
|
{
|
|
|
|
unsigned int searched;
|
|
|
|
unsigned int found;
|
|
|
|
unsigned int new;
|
|
|
|
unsigned int invalid;
|
|
|
|
unsigned int ignore;
|
|
|
|
unsigned int delete;
|
|
|
|
unsigned int delete_list;
|
|
|
|
unsigned int insert;
|
|
|
|
unsigned int insert_failed;
|
|
|
|
unsigned int drop;
|
|
|
|
unsigned int early_drop;
|
|
|
|
unsigned int error;
|
|
|
|
unsigned int expect_new;
|
|
|
|
unsigned int expect_create;
|
|
|
|
unsigned int expect_delete;
|
|
|
|
};
|
|
|
|
|
[NETFILTER] x_tables: Abstraction layer for {ip,ip6,arp}_tables
This monster-patch tries to do the best job for unifying the data
structures and backend interfaces for the three evil clones ip_tables,
ip6_tables and arp_tables. In an ideal world we would never have
allowed this kind of copy+paste programming... but well, our world
isn't (yet?) ideal.
o introduce a new x_tables module
o {ip,arp,ip6}_tables depend on this x_tables module
o registration functions for tables, matches and targets are only
wrappers around x_tables provided functions
o all matches/targets that are used from ip_tables and ip6_tables
are now implemented as xt_FOOBAR.c files and provide module aliases
to ipt_FOOBAR and ip6t_FOOBAR
o header files for xt_matches are in include/linux/netfilter/,
include/linux/netfilter_{ipv4,ipv6} contains compatibility wrappers
around the xt_FOOBAR.h headers
Based on this patchset we're going to further unify the code,
gradually getting rid of all the layer 3 specific assumptions.
Signed-off-by: Harald Welte <laforge@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2006-01-12 21:30:04 +00:00
|
|
|
/* call to create an explicit dependency on nf_conntrack. */
|
|
|
|
extern void need_conntrack(void);
|
|
|
|
|
[NETFILTER]: Add nf_conntrack subsystem.
The existing connection tracking subsystem in netfilter can only
handle ipv4. There were basically two choices present to add
connection tracking support for ipv6. We could either duplicate all
of the ipv4 connection tracking code into an ipv6 counterpart, or (the
choice taken by these patches) we could design a generic layer that
could handle both ipv4 and ipv6 and thus requiring only one sub-protocol
(TCP, UDP, etc.) connection tracking helper module to be written.
In fact nf_conntrack is capable of working with any layer 3
protocol.
The existing ipv4 specific conntrack code could also not deal
with the pecularities of doing connection tracking on ipv6,
which is also cured here. For example, these issues include:
1) ICMPv6 handling, which is used for neighbour discovery in
ipv6 thus some messages such as these should not participate
in connection tracking since effectively they are like ARP
messages
2) fragmentation must be handled differently in ipv6, because
the simplistic "defrag, connection track and NAT, refrag"
(which the existing ipv4 connection tracking does) approach simply
isn't feasible in ipv6
3) ipv6 extension header parsing must occur at the correct spots
before and after connection tracking decisions, and there were
no provisions for this in the existing connection tracking
design
4) ipv6 has no need for stateful NAT
The ipv4 specific conntrack layer is kept around, until all of
the ipv4 specific conntrack helpers are ported over to nf_conntrack
and it is feature complete. Once that occurs, the old conntrack
stuff will get placed into the feature-removal-schedule and we will
fully kill it off 6 months later.
Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: Harald Welte <laforge@netfilter.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
2005-11-10 00:38:16 +00:00
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
|
|
|
|
#endif /* _NF_CONNTRACK_COMMON_H */
|