很不错的iptables帮助指南,值得学习和收藏

转from http://iptables-tutorial.frozentux.net/cn/iptables-tutorial-cn-1.1.19.html

Iptables 指南 1.1.19(二)

Chapter 4. 状态机制

本章将周详介绍状态机制。通读本章,您会对状态机制是如何工作的有一个全面的了解。我们用一些例子来进行说明状态机制。实践出真知嘛。


4.1. 概述

状态机制是iptables中特别的一部分,其实他不应该叫状态机制,因为他只是一种连接跟踪机制。但是,很多人都认可状态机制这个名字。文中我也或多或或少地用这个名字来表示和连接跟踪相同的意思。这不应该引起什么混乱的。连接跟踪能够让Netfilter知道某个特定连接的状态。运行连接跟踪的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙。状态防火墙比非状态防火墙要安全,因为他允许我们编写更严密的规则。

在iptables里,包是和被跟踪连接的四种不同状态有关的。他们是NEWESTABLISHEDRELATEDINVALID。后面我们会深入地讨论每一个状态。使用--state匹配操作,我们能很容易地控制 “谁或什么能发起新的会话”。

任何在内核中由Netfilter的特定框架做的连接跟踪称作conntrack(译者注:就是connection tracking 的首字母缩写)。conntrack能够作为模块安装,也能够作为内核的一部分。大部分情况下,我们想要,也需要更周详的连接跟踪,这是相比于缺省的conntrack而言。也因为此,conntrack中有许多用来处理TCP, UDP或ICMP协议的部件。这些模块从数据包中提取周详的、唯一的信息,因此能保持对每一个数据流的跟踪。这些信息也告知conntrack流当前的状态。例如,UDP流一般由他们的目的地址、源地址、目的端口和源端口唯一确定。

在以前的内核里,我们能够打开或关闭重组功能。然而,自从iptables和Netfilter,尤其是连接跟踪被引入内核,这个选项就被取消了。因为没有包的重组,连接跟踪就不能正常工作。现在重组已整合入 conntrack,并且在conntrack启动时自动启动。不要关闭重组功能,除非您要关闭连接跟踪。

除了本地产生的包由OUTPUT链处理外,任何连接跟踪都是在PREROUTING链里进行处理的,意思就是, iptables会在PREROUTING链里从新计算任何的状态。假如我们发送一个流的初始化包,状态就会在OUTPUT链里被配置为NEW,当我们收到回应的包时,状态就会在PREROUTING链里被配置为ESTABLISHED。假如第一个包不是本地产生的,那就会在PREROUTING链里被配置为NEW状态。综上,任何状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的。


4.2. conntrack记录

我们先来看看怎样阅读/proc/net/ip_conntrack里的conntrack记录。这些记录表示的是当前被跟踪的连接。假如安装了ip_conntrack模块,cat /proc/net/ip_conntrack 的显示类似:

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 use=2

     

conntrack模块维护的任何信息都包含在这个例子中了,通过他们就能够知道某个特定的连接处于什么状态。首先显示的是协议,这里是tcp,接着是十进制的6(译者注:tcp的协议类型代码是6)。之后的117是这条conntrack记录的生存时间,他会有规律地被消耗,直到收到这个连接的更多的包。那时,这个值就会被设为当时那个状态的缺省值。接下来的是这个连接在当前时间点的状态。上面的例子说明这个包处在状态 SYN_SENT,这个值是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内部使用。随着状态的改变,生存时间也会改变。

Note

最近patch-o-matic里有一个新的补丁,能够把上面提到的超时时间也作为系统变量,这样我们就能够在系统空闲时改变他们的值。以后,我们就不必为了改变这些值而重编译内核了。

这些可通过/proc/sys/net/ipv4/netfilter下的一些特别的系统调用来改变。仔细看看/proc/sys/net/ipv4/netfilter/ip_ct_*里的变量吧。

当一个连接在两个方向上都有传输时,conntrack记录就删除[UNREPLIED]标志,然后重置。在末尾有 [ASSURED]的记录说明两个方向已没有流量。这样的记录是确定的,在连接跟踪表满时,是不会被删除的,没有[ASSURED]的记录就要被删除。连接跟踪表能容纳多少记录是被一个变量控制的,他可由内核中的ip- sysctl函数配置。默认值取决于您的内存大小,128MB能够包含8192条目录,256MB是16376条。您也能够在

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!