预计阅读本页时间:-
6.5.2 iptables的conntrack记录
先来看看怎样阅读/proc/net/nf_conntrack里的conntrack记录。这些记录表示的是当前被跟踪的连接。如果安装了nf_conntrack模块,就可以查看nf_conntrack记录了,命令如下:
cat /proc/net/nf_conntrack
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
命令显示结果如下:
ipv4 2 tcp 6 431999 ESTABLISHED src=192.168.1.204 dst=192.168.1.11 sport=22 dport=50233 src=192.168.1.11 dst=192.168.1.204 sport=50233 dport=22 [ASSURED] mark=0 secmark=0 use=2
ipv4 2 tcp 6 431993 ESTABLISHED src=192.168.1.211 dst=192.168.1.204 sport=41039 dport=80 src=192.168.1.204 dst=192.168.1.211 sport=80 dport=41039 [ASSURED] mark=0 secmark=0 use=2
ipv4 2 udp 17 26 src=0.0.0.0 dst=255.255.255.255 sport=68 dport=67 [UNREPLIED] src=255.255.255.255 dst=0.0.0.0 sport=67 dport=68 mark=0 secmark=0 use=2
conntrack模块维护的所有信息都包含在这个例子当中了,通过它们就可以知道某个特定的连接处于什么状态。首先显示的是协议,这里是TCP,接着是十进制的6(TCP的协议类型代码是6)。之后的117是这条conntrack记录的生存时间,它会有规律地被消耗掉,直到收到这个连接的更多包。那时,这个值就会被设定为当时那个状态的默认值。接下来就是这个连接在当前时间点的状态。上面的例子说明了这个包处在状态SYN_SENT下,这个值是iptables显示的,以便我们好理解,而内部用的值稍有不同。SYN_SENT说明我们正在观察的这个连接只在一个方向发送了一个TCP SYN包。再下面是源地址、目的地址、源端口和目的端口。其中有个特殊的词UNREPLIED,说明这个连接还没有收到任何回应。最后,是希望接收的应答包的信息,它们的地址和端口与前面是相反的。
当一个连接在两个方向上都有传输时,conntrack记录就会删除[UNREPLIED]标志,然后重置。末尾有[ASSURED]的记录说明两个方向已没有流量。这样的记录是确定的,在连接跟踪表装满时,是不会被删除的,没有[ASSURED]的记录就要被删除。连接跟踪表能容纳多少条记录是被一个变量控制的,它可由内核中的ip-sysctl函数设置。默认值取决于你的内存大小,128MB可以包含8192条目录,256MB是16376条,如果在生产服务器上通过加载模块的方法开启了nf_conntrack功能,就要注意内存方面的使用情况,此模块是极消耗内存的,对系统性能影响非常大,而且极容易发生以下错误:
nf_conntrack: table full, dropping packet
具体原因是线上的机器启用了nf_conntrack模块以后,服务器的连接数太大,内核的连接跟踪系统(Connection Tracking System)没有足够的空间来存放连接的信息,解决方法就是调整内核参数来增大这个空间。
基于以上种种原因,除了特殊原因以外,不建议在线上服务器上开启iptables的conntrack功能。
注意
老版的iptables的conntrack称为ip_conntrack,新版的名为nf_conntrack。nf_conntrack支持IPv4和IPv6,而ip_conntrack只支持IPv4。