也说说ip_conntrack

ip_conntrack是一个连接跟踪模块。经常被不小心开启,然后引发各种问题。比如连接太多,造成机器都登录不上,dmesg输出大量的
ip_conntrack: table full, dropping packet.
这个时候很多人会先把ip_conntrack_max调大,来试图缓解这个问题,有时也是可以的。一般需要调整的参数主要有:


net.ipv4.netfilter.ip_conntrack_max = 655350 (默认是65535)
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

其中ip_conntrack_max 是设置允许最大的条目数,另外需要注意几个timeout时间的设置。ip_conntrack_tcp_timeout_established这个默认值是5天,非常非常大,一般是需要调整小的。在调整之前我们可以先对系统当前的连接情况做一个统计,看看 conntack表满了的时候,每种状态的连接各占了多少,比如这样可以直接看到ESTABLISHED的状态太多了,很多都是几天前的,必须得把ip_conntrack_tcp_timeout_established调整小才能解决实际的问题。


# awk '{a[$4]++}END{for(i in a){print i,a[i]}}' /proc/net/ip_conntrack
TIME_WAIT 1109
CLOSE_WAIT 417
CLOSE 48
SYN_SENT 101
ESTABLISHED 62793
SYN_RECV 5
FIN_WAIT 6
LAST_ACK 12

当然,最重要的一点是确认好自己的系统上是否需要使用ip_conntrack模块,如果自己不去加nat表或者state模块之类的,实际一般是用不着的,直接把这个关闭掉一切烦恼都没有了。如果非要用,还有另外的一个方式,就是在raw表标记不对这个链接进行跟踪.
比如我的服务器上对外的服务端口6666端口,因为设置了通过state来判断是否对进入的包放行(设置了RELATED,ESTABLISHED ACCEPT,但是默认会DROP掉NEW,只允许机器主动访问外面),所以如果到6666端口的链接也被跟踪的话,可以会引起很多conntrack记录.实际上对于运行外部访问的端口,可以设置一下


 iptables -t raw -I PREROUTING -i eth0 -p tcp --dport 6666 --j NOTRACK
 iptables -t raw -I OUTPUT -o eth0 -p tcp --sport 6666 --j NOTRACK
 另外需要注意修改一下之前的state语句,新增对UNTRACKED的放行.
 iptables -I INPUT -m state --state RELATED,ESTABLISHED,UNTRACKED -j ACCEPT

REROUTING链对于网关式的场景下是在路由前的操作链表,对于普通的单机来说是处理主动连接到防火墙本机的连接.
OUTPUT链是因为PREROUTING链不能处理本地对外的链接,所以在使用了PREROUTING的时候也需要使用一下OUTPUT链来设置一下NOTRACK.

此条目发表在net分类目录。将固定链接加入收藏夹。