服务器上启用iptables引发的问题
今天,一直服务正常的一台服务器突然频繁报警重启
查看系统负载和IO,都略微偏高,但也不是特别高
查看后台服务器的Log,也没能看出什么问题
开始怀疑是压力问题,于是增加了一台新服务器
但仍旧没能解决问题,服务仍然是时断时续
后来发现从该服务器ping或者telnet后面的服务器,经常会出现超时或异常情况
ping: sendmsg: Operation not permitted
64 bytes from 10.11.156.46: icmp_seq=6 ttl=60 time=0.241 ms
ping: sendmsg: Operation not permitted
64 bytes from 10.11.156.46: icmp_seq=8 ttl=60 time=0.234 ms
而从同一机房的其它服务器连接后面的服务器,则一切正常
在确定了非网络问题后,又经过一番排查,发现,该服务器上起了iptables
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
限制了转发的tcp包的速度,由于该服务器的并发量非常大
使用从/var/log/message或者dmesg可以看到如下错误:
ip_conntrack: table full, dropping packet.
最后将iptables服务关掉后,一切就正常了
对于高并发的服务器,最好不要启用iptables,因为这样会导致链接跟踪表满
如果一定需要启用iptables,则可以用以下方法来处理:
1. 增大 ip_conntrack_max 值
echo "393216" >; /proc/sys/net/ipv4/ip_conntrack_max
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout时间
vi /etc/sysctl.conf
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