状态匹配

状态匹配

  • 连接跟踪机制,状态机制
    • 运行连接跟踪的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙。状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。
    • 在 iptables 里面,报文适合连接跟踪的四种状态相关,分别是 NEW,ESTABLISHED, RELATED and INVALID。我们后面对一种状态都会深入探讨,通过使用 --state 参数我们就能够轻易的控制谁或者什么能够发起新的会话。
    • 所有连接跟踪都是通过内核中一个叫做 conntrack 的框架来实现,conntrack 可以被编译进内核,也可以作为一个模块存在。大部分情况下,我们都需要也想要一个详细的连接跟踪而不是默认的这个。因此,这儿就会有更 多的功能模块分别处理 TCP/UDP/ICMP 等协议。这些功能模块从报文里面提取一 些特定信息来标志一个特定的连接。例如 UDP 流通过用他们的目睹地址,源地 址,目的端口以及源端口组合来表示。
    • 在之前老内核里面,我们能够关闭/使能碎片重组。但是因为 iptables 和 netfilter 的引入,这个功能被取消了。没有重组功能,连接跟踪就不能正常 的工作,所以重组默认是自动开启的。如果你想禁止重组功能,那你就得关闭 连接跟踪功能。
    • 连接跟踪的状态主要在两个地方被触发,一个是 PREROUTING,另外一个数 OUTPUT,他们分别对应外来报文和本级产生报文。例如我们从本级发送一个报文,那么在 OUTPUT 链里面,它的状态会变成 NEW,当我们接收到回应报文的时 候,连接状态就 PREROUTING 处更改为 ESTABLISHED,以此类推。加入第一个报 文不是我们尝试的,那么在 PREROUTING 出就设置为 NEW,然后我们发送回复的 时候,在 OUTPUT 设置为 ESTABLISHED。
  • 连接跟踪实体
  • conntrack 模块维护的所有信息都包含在这个例子中了,通过它们就可以知道某个特定的连接处于什么状态。
  • 首先显示的是协议,这里是 tcp,接着是十进制的 6(译者注:tcp 的协议类型代码是 6)。
  • 之后的 117 是这条 conntrack 记录的生存时间,它会有规律地被消耗,直到收到这个连接的更多的包。那时,这个值就会被设为当时那个状态的缺省值。
  • 接下来的是这个连接在当前时间点的状态。说明这个包处在状态 TIME_WAIT ,这个值是 iptables 显示的,以便我们好理解,而内部用的值稍有不同。SYN_SENT说明我们正在观察的这个连接只在一个方向发送了一 TCP SYN 包。再下面是源地址、目的地址、源端口和目的端口。
  • 特殊的词 UNREPLIED,说明这个连接还没有收到任何回应。
  • 最后,是希望接收的应答包的信息,他们的地址和端口和前面是相反的。
  • 连接跟踪记录的信息依据 IP 所包含的协议不同而不同,所有相应的值都是 在头文件 linux/include/netfilter-ipv4/ip_conntrack*.h 中定义的。IP、 TCP、UDP、ICMP 协议的缺省值是在 linux/include/netfilter- ipv4/ip_conntrack.h 里定义的。具体的值可以查看相应的协议,但我们这里 用不到它们,因为它们大都只在 conntrack 内部使用。随着状态的改变,生存 时间也会改变。
  • 最近 patch-o-matic 里有一个新的补丁,叫做 tcp-window- tracking,可以把上面提到的超时时间也作为系统变量,这样我 们就能够在系统运行时改变它们的值。以后,我们就不必为了改 变这些值而重编译内核了。
  • 这些可通过/proc/sys/net/ipv4/netfilter 下的一些特殊的系统调用来改变。仔细看看/proc/sys/net/ipv4/netfilter/ip_ct_*里的变量吧。
  • 当一个连接在两个方向上都有传输时,conntrack 记录就删除[UNREPLIED] 标志,然后重置。在末尾有 [ASSURED]的记录说明两个方向已没有流量。这样 的记录是确定的,在连接跟踪表满时,是不会被删除的,没有[ASSURED]的记录 就要被删除。连接跟踪表能容纳多少记录是被一个变量控制的,它可由内核中 的 ip- sysctl 函数设置。默认值取决于你的内存大小,128MB 可以包含 8192 条目录,256MB 是 16376 条。你也可以在 /proc/sys/net/ipv4/ip_conntrack_max 里查看、设置。
  • 另外一种更有效的设置方法是模块加载的时候,设置 hashsize 的大小,连 接跟踪的最大连接数等于这个值的 4 倍,我们举下面的例子来说明。
/home/blueflux# modprobe ip_conntrack hashsize=4096
/home/blueflux# cat /proc/sys/net/ipv4/ip_conntrack_max
32768
cat /proc/net/ip_conntrack
ipv4     2 tcp      6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 dport=32775 [ASSURED] use=2

ipv4     2 udp      17 28 src=172.16.135.128 dst=172.16.135.2 sport=36036 dport=53 src=172.16.135.2 dst=172.16.135.128 sport=53 dport=36036 mark=0 secmark=0 use=2
ipv4     2 tcp      6 116 TIME_WAIT src=172.16.135.128 dst=172.16.135.1 sport=22 dport=61859 src=172.16.135.1 dst=172.16.135.128 sport=61859 dport=22 [ASSURED] mark=0 secmark=0 use=2
ipv4     2 tcp      6 431999 ESTABLISHED src=172.16.135.1 dst=172.16.135.128 sport=62165 dport=22 src=172.16.135.128 dst=172.16.135.1 sport=22 dport=62165 [ASSURED] mark=0 secmark=0 use=2

ipv4     2 tcp      6 431999 ESTABLISHED src=172.16.135.128 dst=172.16.135.1 sport=22 dport=61859 src=172.16.135.1 dst=172.16.135.128 sport=61859 dport=22 [ASSURED] mark=0 secmark=0 use=

ipv4     2 udp      17 9 src=172.16.135.128 dst=172.16.135.2 sport=36218 dport=53 src=172.16.135.2 dst=172.16.135.128 sport=53 dport=36218 mark=0 secmark=0 use=2
ipv4     2 udp      17 16 src=172.16.135.128 dst=172.16.135.2 sport=50066 dport=53 src=172.16.135.2 dst=172.16.135.128 sport=53 dport=50066 mark=0 secmark=0 use=2
ipv4     2 tcp      6 299 ESTABLISHED src=172.16.135.1 dst=172.16.135.128 sport=62211 dport=22 src=172.16.135.128 dst=172.16.135.1 sport=22 dport=62211 [ASSURED] mark=0 secmark=0 use=2

ipv4     2 tcp      6 299 ESTABLISHED src=172.16.135.1 dst=172.16.135.128 sport=62211 dport=22 src=172.16.135.128 dst=172.16.135.1 sport=22 dport=62211 [ASSURED] mark=0 secmark=0 use=2

ipv4     2 tcp      6 431999 ESTABLISHED src=172.16.135.1 dst=172.16.135.128 sport=62211 dport=22 src=172.16.135.128 dst=172.16.135.1 sport=22 dport=62211 [ASSURED] mark=0 secmark=0 use=2
ipv4     2 udp      17 26 src=172.16.135.128 dst=172.16.135.2 sport=51390 dport=53 src=172.16.135.2 dst=172.16.135.128 sport=53 dport=51390 mark=0 secmark=0 use=2
ipv4     2 tcp      6 431999 ESTABLISHED src=172.16.135.128 dst=172.16.135.128 sport=53099 dport=22 src=172.16.135.128 dst=172.16.135.128 sport=22 dport=53099 [ASSURED] mark=0 secmark=0 use=2
ipv4     2 udp      17 26 src=172.16.135.128 dst=172.16.135.2 sport=55344 dport=53 src=172.16.135.2 dst=172.16.135.128 sport=53 dport=55344 mark=0 secmark=0 use=2
ipv4     2 udp      17 26 src=172.16.135.128 dst=172.16.135.2 sport=37299 dport=53 src=172.16.135.2 dst=172.16.135.128 sport=53 dport=37299 mark=0 secmark=0 use=2
ipv4     2 udp      17 26 src=172.16.135.128 dst=172.16.135.2 sport=40615 dport=53 src=172.16.135.2 dst=172.16.135.128 sport=53 dport=40615 mark=0 secmark=0 use=2

ipv4     2 tcp      6 299 ESTABLISHED src=172.16.135.1 dst=172.16.135.128 sport=62211 dport=22 src=172.16.135.128 dst=172.16.135.1 sport=22 dport=62211 [ASSURED] mark=0 secmark=0 use=2
ipv4     2 tcp      6 299 ESTABLISHED src=172.16.135.128 dst=172.16.135.128 sport=53099 dport=22 src=172.16.135.128 dst=172.16.135.128 sport=22 dport=53099 [ASSURED] mark=0 secmark=0 use=2

用户空间状态

  • 根据协议的不同,报文在内核里面可能经历几个完全不同的状态。但是出了内核及用户空间,我们就只有前面介绍的 4 种状态了。 | State | Explanation | | -- | -- | | NEW | NEW 状态表示这个报文是我们所看到的第一个报文,也意味着在 连接跟踪系统里面,它马上就被匹配。例如我们发送一个 SYN 报 文,它就是连接跟踪系统所看到的第一个报文,接着它将会被匹 配。但是一些不是 SYN 的报文也有可能被认为是 NEW 状态,这样 在某些情况下可能会导致一些问题,但是它对于我们重新恢复被 其他防火墙关闭的连接很重要,或者说一个连接已经超时了,但 是没有真正关闭。 | | ESTABLISHED | ESTABLISHED 状态表示在双向都看到流量了,并且会持续匹配 。 ESTABLISHED 状态其实很容易理解,要想进入 ESTABLISHED 状 态,一个机器只需要发送一个报文,然后收到相应的应答报文。 只要接受到一个应答,状态就会从 NEW 变成 ESTABLISHED,即使 接收到的是 ICMP 的错误报告。 | | RELATED | RELATED 是个比较麻烦的状态。当一个连接和某个已处于 ESTABLISHED 状态的连接有关系时,就被认为是 RELATED 的了。 换句话说,一个连接要想是 RELATED 的,首先要有一个 ESTABLISHED 的连接。这个 ESTABLISHED 连接再产生一个主连接 之外的连接,这个新的连接就是 RELATED 的了,当然前提是 conntrack 模块要能理解 RELATED。ftp 是个很好的例子,FTP- data 连接就是和 FTP-control 有 RELATED 的。还有其他的例子, 比如,通过 IRC 的 DCC 连接。有了这个状态,ICMP 应答、FTP 传 输、DCC 等才能穿过防火墙正常工作。注意,大部分还有一些 UDP 协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放 在数据包里,并且要求这些信息能被正确理解。 | | INVALID | INVALID 意味着这个报文不能被识别或者它没有任何状态。导致 这个的原因可能有很多种,例如内存不足或和返回的 ICMP 没有匹 配上任何连接。一般而言,在这种状态下丢包是一个很好的选 择。 | | UNTRACKED | UNTRACKED 状态,简单的说,报文在 raw 表里面被 NPTRACK target 进行了标记,然后这个报文在连接跟踪表里面的状态就是 UNTRACKED。这也就是说所有 RELATED 的链接都看不到,一些特殊 情况我们需要仔细考虑,例如相关的 ICMP 报文需要特殊处理。 |

  • 这些状态可以—state 选项和在一起完成基于状态的报文匹配,这么做让 我们的连接跟踪系统不可思议的强健和高效。以前,我们需要打开所有 1024 以上的端口让报文进行我们本地网络,但是有了连接跟踪系统之后,就再也没有 必要打开所有的端口了。因为我们只需要打开我们所希望的返回端口。

TCP连接

连接状态以及三个基本协议是怎么配合工作的,我们也仔细了解一下这三者之外的报文,连接是怎么建立的。选择 TCP 开始,是因为 TCP 本身就是一个有状态的协议,并且 iptables 里面的连接跟踪也是一个很有意思的模块。

  • TCP 连接通过三次握手来初始化,这样我们就建立和协商了一个实际数据 发送的连接。整个会话是通过 SYN 报文开始的,接着回应一个 SYN/ACK 报文, 最后给予 ACK 报文通知连接已经建立起来。现在我们就能够通过这个连接发送 数据了,最大的问题是连接跟踪系统是怎么参与这个问题,答案马上就来。
    • 正如用户所想的,连接跟踪对于所有的连接类型工作流程都是一致的,连接跟踪系统并没有严格的遵从用户观点的 TCP 状态变化。clent 发送一个 syn , server 一旦收到来自 client 发送的第一个报文,那么连接状态就是 NEW,接着 server 回应包,连接的状态就变成ESTABLISHED。
    • 假如你稍微多思考一会,你就应该理解为什么这么做了。通过这个特殊的 实现方式,我们就可以让 NEW 和 ESTABLISHED 状态的报文离开本地主机,但是 只有我们希望的报文才能发送到我们主机,即转化成 ESTABLISHED 状态,其他 报文都被丢掉,这样的工作方式很完美。反过来,如果在连接建立的整个过程 中,连接的状态都是 NEW,那么我们就不能够阻止外部网络发送给我们的报 文。因为我们必须要能够容许 NEW 状态的报文一次次的回复本机,从而完成三 次握手,这样我们就不能起到防火墙的作用。
    • 从用户角度看,连接跟踪的实现相当简单。但是,从内核的角度看待这个问题,可能就稍稍有点不同了。
    • 一个连接也有可能进入 ESTABLISHED 状态,但却不是有保障的。在我们启动 tcp-window-tracking 补丁之后,我们就可能尝试重新恢复会话。
    • 一个连接也有可能被 RST 关闭,或者说一个连接被拒绝的时候,我们会立刻关闭连接。

当一个 TCP 连接关闭的时候,这个连接会进入 TIME_WAIT 状态,这个状态 的默认时间是 2 分钟。这样确保报文在连接关闭的时候,哦能够完全通过我们 的规则检查。另外就是可以看作一个缓冲,这样报文即使在某几个拥塞的路由 器里面也能够最终到达我们防火墙或者连接的另一端。 假如一个连接被 RST 复位,那么状态直接变成 CLOSE。在这个状态下,我 们还有 10 秒钟处理这个链接上的报文。RST 报文不会等待任何确认,直接关闭这个连接。当然还有其他的一些我们没有谈及的状态,完整列表以及他们的超时时间请看下表。

StateTimeout value
NONE30 minutes
ESTABLISHED5 days
SYN_SENT2 minutes
SYN_RECV60 seconds
FIN_WAIT2 minutes
TIME_WAIT2 minutes
CLOSE10 seconds
CLOSE_WAIT12 hours
LAST_ACK30 seconds
LISTEN2 minutes

状态机制在用户空间里的部分不会查看TCP包的标志位(也就是 说TCP标志对它而言是透明的)。如果我们想让NEW状态的包通过 防火墙,就要指定NEW状态,我们理解的NEW状态的意思就是指 SYN包,可是iptables又不查看这些标志位。这就是问题所在。 有些没有设置SYN或ACK的包,也会被看作NEW状态的。这样的包 可能会被冗余防火墙用到,但对只有一个防火墙的网络是很不利的(可能会被攻击哦)。那我们怎样才能不受这样的包的影响 呢?你可以使用未设置SYN的NEW状态包 里的命令。还有一个办法,就是安装patch-o-matic里的tcp-window-tracking扩展功 能,然后设置 /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_loose 为 0,这样我们就能包防火墙会把出SYN之外的所有NEW报文丢弃。

UDP连接

  • UDP 连接本身是无状态的。他们不存在连接的建立和关闭的概念,同时大 部分 UDP 报文都是无序的。接收到的两个 UDP 报文先后顺序不等同于他们的发 送时间。但是尽管如此,我们能够能够在内核里面设置连接的状态,下面我们 就看看连接跟踪系统是怎么实现的。
    • 从用户的观点来看,UDP 连接的建立和 TCP 连接基本是一致的。其实他们的内部实现,连接的信息却存在较大的差异。但是本质上是一样的,我们首先看看初始 UDP 报文发送后,连接情况。
    • 这是一个 UDP 包。第一个是协议名称,第二个是协议号,第三个是此状态的生存时间,默认是 30 秒。接下来是包的源、目地址和端口,还有期待之中回应包的源、目地址和端口。[UNREPLIED]标记说明还未收到回应
    udp      17 20 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025  [UNREPLIED] src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1
    
    • 到此为止,服务器已经对收到的报文发送了一个回复,这样这个连接状态 就可以认为是 ESTABLISHED,虽然这个状态我们在上面看不出来。最主要的差 别就 UNREPLIED 是标记被清空了,另外就是默认的超时被设置为 180 秒-但是在 这个例子中他们被减为 170 秒,呵呵,在 10 秒后,这个值就会变为 160 秒,还 有一件事情我们忘记了,那就是 ASSURED 标记。如果这个标记向北设置上,那 么我们只需要对处于 NEW 状态的连接发送一个合法的回应报文。
    udp      17 170 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 [ASSURED] use=1
    
    • 现在这个连接就是有保障的了。如果这个连接在 180 秒内都没有被使用,那么它就会超时。180 秒钟看起来比较短,但是对于大部分应用而言,这个值足够了。每一个报文通过这个连接穿透防火墙的时候,这个值都会被重置。
    udp      17 175 src=192.168.1.5 dst=195.22.79.2 sport=1025 dport=53 src=195.22.79.2 dst=192.168.1.5 sport=53 dport=1025 [ASSURED] use=1
    

ICMP连接

  • ICMP 报文更谈不上算是一个有状态的流
    • 四种特殊 ICMP 报文就是 Echo/Timestamp/Information/Fianly address mask
    • 这个格式和我们看到的TCP/UDP有点差异,除了我们在TCP/UDP里面看到的,这儿还有其他三个新的字段,分别是type/code/ID。Type和code分别是ICMP的类型和编码,最后是ID字段,每一个ICMP保额为你都有一个属于自己的ID,当我们收到一个ICMP报文的时候,我们就通过ID来关联应答。
    • 下一个字段,就是我们熟悉的 UNREPLIED 标记。还和前面一样,这个标记 告诉我们的信息是我们只在一个方向上有流量。最后,我们看到了期望的应答 报文信息,里面的地址信息以及 type/code/ID 都做了相应的修改。
    • ICMP 请求的默认超时时间是 30 秒钟,你也可以在/proc/sys/net/ipv4/netfilter/ip_ct_icmp_timeout 里面修改,这个值其实是比较理想,它应该能够满足大部分情况。
    • 我们发送一个 SYN 报文,防火墙就会新建一个连接。但是 目的网络或者主机却是不可到达的,因此路由器会返回一个 ICMP 的错误消息。 这样连接跟踪代码就会认为这个 ICMP 消息是 RELATED 的。多亏我们之前建立的 连接,这样 ICMP 回应报文就能够被发送给正确的接收者,从而让他从容的关闭 这个连接。同时,防火墙也会关闭这个连接,因为它知道这是一个错误消息。
    • 对于 UDP 连接而言,如果他们碰到了错误报文,行为也是一样的。所有针 对 UDP 连接的 ICMP 错误报文都被认为是 RELATED。
    • 这次一个 UDP 报文发给一台主机,这样我们为这个报文新建一条连接。但 是这个网络被人为的禁止访问,所以我们的防火墙就会收到一个 ICMP 错误消 息。防火墙知道这个 ICMP 错误消息关联到已经打开的 UDP 连接,所以就给他发 送一个错误消息。此时,防火墙也会把连接跟踪表里面的这条连接删除。最 终,发送端收到错误消息并且关闭这个连接。
ipv4     2 icmp     1 29 src=172.16.135.128 dst=39.156.66.18 type=8 code=0 id=5638 src=39.156.66.18 dst=172.16.135.128 type=0 code=0 id=5638 mark=0 secmark=0 use=2
			icmp    1 25 src=192.168.1.6 dst=192.168.1.10 type=8 code=0 id=33029 [UNREPLIED] src=192.168.1.10 dst=192.168.1.6 type=0 code=0 id=33029 use=1

默认连接

  • 在一些特定情况下,连接跟踪不知道如何处理一个未知协议,在我们不认 识或者我们不了解这个报文的协议工作机制时候就会发生这种情况。在这些情 景里,我们用一个默认当作来处理这个报文。例如 NETBLT、MUX、EGP 等等,默 认行为看起来很像 UDP 连接,第一个报文认为是 NEW,收到应答就会设置连接 为 ESTABLISHED。
  • 当我们是能默认行为时候,所有这些报文都会有一样的默认超时时间,他 们可以通过/proc/sys/net/ipv4/netfilter/ip_ct_generic_timeout 修改。默 认时间是 600 秒或者 10 分钟,以便适应你的通信量,尤其是在耗时较多、流量 巨大的情况下,比如使用卫星等。

不被跟踪的连接和raw表

  • 当第一次在连接跟踪里面出现的时候,UNTRACK 相当的奇特。简单的说,他主要就是说针对在 raw 表被标记的报文不被跟踪。
  • Raw 主要也就是为了这个目的而创建的,在这个包里面,你可以针对不想 被跟踪的报文打上 NOTRACK 标记。
  • 注意我这儿说的是报文而不是连接,因为这个 mark 是针对每个 报文打的,否则我们还得对连接进行某种操作来确定是否需要跟踪。
  • 我们在本章开头已经说了,连接跟踪和状态匹配都是相当消耗系统资源的,因为这个原因,如果不是必须的,最好还是关闭这个功能。
  • 其中一个例子就是在一台流量很大的路由器上面你想针对转发报文做连接 跟踪,而对于路由报文则不管。这样你就可以在 raw 里面对针对非目的地址为 本机的报文设置 NOTRACK 标记,我们就可以不对转发报文做连接跟踪,而只对 本机的报文设置,从而节约了大量的系统资源。
  • 另外一个例子就是你有一个流量相当大的 web 服务器,你想对 web 连接之 外的报文做连接跟踪。这样你就可以在 raw 表里面对 web 流量做 NOTRACK。当然 NOTRACK 还有一些值得你考虑的问题,例如一个连接被打上 NOTRACK 标记,接着这个连接的相关连接也不会被跟踪。换句话讲连接跟踪和 nat 的 helper 就不能正常工作,ICMP 错误报文也是,你只有手动打开相应的端口。但是我们遇到复杂协议的时候,例如 FTP 或者 SCTP 等等,这样可能就很难控制。

复杂协议和连接跟踪

  • 有一些协议比其他的要麻烦一些,我这么说的意思是当我们对这种协议做 连接跟踪的时候,可能很难跟踪正确。这样反面例子就是 ICQ/IRC/FTP 等等, 他们这些协议在报文的数据区携带有其他信息,因此我们需要 helper 模块来帮 助我们寻找连接关系。

  • 下面是一个简单的复杂协议列表,包括在哪个版本被包含。 | Protocol name | Kernel versions | | -- | -- | | FTP | 2.3 | | IRC | 2.3 | | TFTP | 2.5 | | Amanda | 2.5 |

    • FTP 为例子为介绍,FTP 协议首先打开一个称之为控制会话的连接,当我们通过这个会话发送命令的时候,其他的端口打来来完成剩余的数据传输。这些数据连接可以通过两种方式完成,分别是主动和被动。当一个连接是主动类型时,FTP 客户端告诉服务器自己的地址和端口,然后自己打开响应的端口,接着服务器用一个随机端口最源端口来连接客户端的指定端口。

    • 问题在于防火墙不知道他们额外的连接,因为他们是通过报文的数据区来协商这些信息的,所以防火墙就不知道服务器要连接客户端的哪一个端口。

    • 解决方案就是增加一个 helper,它主要就是检查控制连接的数据,发现一 个要建立一个新的连接,就把这个连接关联到主链接。这样服务器就能够被跟 踪到了

    • 被动 FTP 工作在相反的模式,FTP 客户端告诉服务器它要什么数据,服务 器告诉客户端地址和连接端口。客户端收到信息就通过自己的 20 端口连接到服 务器的特定端口。如果 FTP 服务器在防火墙后面,或你对用户限制的比较严 格,只允许他们访问 HTTP 和 FTP,而封闭了其他所有端口,为了让在 Internet 是的客户机能访问到 FTP,也需要增加上面提到的 helper。下面是被动模式下 data 连接的建立过程:

    • 内核里面已经有一些helper可以用了,更为具体的是,FTP和IRC协议都已 经能够正常工作了。假如你在内核里面没有找到你所需要的helper,那么建议 你到patch-o-matic里面查找一下。假如这个里面也没有,那么你还有其他一些 方法,首先下载最新的iptables代码,看里面是否包含;另外就是到mail list 里面问一下是否已经有人做好了。假如这些方法都没有得到你想要的,那么你 就只有阅读一下Rusty Russell's Unreliable Netfilter Hacking HOW-TO(附 件的其他资源列表里面),然后自己动手写一个。

    • 连接跟踪的 helper 可以编译进内核,也可以编译成模块,如果你编译成模块, 那么可以用过下面的命令加载这些模块。

modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ip_conntrack_tftp
modprobe ip_conntrack_amanda
  • 需要注意的是连接跟踪并不处理 NAT,所以你需要更多的模块来完成 NAT 功能。例如你想做 NAT 并且对 FTP 做连接跟踪,那么你除了 FTP 的连接跟踪模 块,还需要 NAT 模块。所有 NAT helper 以 ip_nat_开头,这是命名规范。例如 FTP NAT 模块的 helper 应该命名为 ip_nat_ftp,IRC 模块的 helper 应该是 ip_nat_irc。连接跟踪有同样的命名规范,因此 IRC 的连接跟踪 helper 名字为 ip_conntrack_irc,而 FTP 连接跟踪的 helper 名字为 ip_conntrack_ftp。

转载于:https://my.oschina.net/xyh592/blog/3099028

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值