CentOS ip_conntrack: table full, dropping packet 的解决方法

服务器dmesg发现很多服务器错误ip_conntrack: table full, dropping packet,错误现象 如下:

dmesg | more
ip_conntrack: table full, dropping packet.
printk: 2414 messages suppressed.
ip_conntrack: table full, dropping packet.
printk: 2234 messages suppressed.
ip_conntrack: table full, dropping packet.
printk: 2181 messages suppressed.
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.
eth0: port 55(tap-vifvm270.0) entering disabled state
eth0: port 55(tap-vifvm270.0) entering disabled state
device tap-vifvm270.0 left promiscuous mode
eth0: port 55(tap-vifvm270.0) entering disabled state
eth0: port 56(vifvm270.0) entering disabled state
device vifvm270.0 left promiscuous mode
eth0: port 56(vifvm270.0) entering disabled state
device vifvm270.0 entered promiscuous mode
device tap-vifvm270.0 entered promiscuous mode
eth0: port 56(tap-vifvm270.0) entering forwarding state
eth0: port 56(tap-vifvm270.0) entering disabled state
eth0: port 56(tap-vifvm270.0) entering forwarding state
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.


IP_conntrack原理:
IP_conntrack表示连接跟踪数据库(conntrack database),代表NAT机器跟踪连接的数目,连接跟踪表能容纳多少记录是被一个变量控制的,它可由内核中的ip- sysctl函数设置。每一个跟踪连接表会占用350字节的内核存储空间,时间一长就会把默认的空间填满.
查看当前连接数:

[root@www.ctohome.com]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
120406
wc -l /proc/net/ip_conntrack  (不推荐,但数量很大的时候,会占用大量cpu资源,增加服务器负载)
9344 /proc/net/ip_conntrack


服务器错误ip_conntrack: table full, dropping packet解决办法

echo 180 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo 65536> /proc/sys/net/ipv4/netfilter/ip_conntrack_max
echo 120   > /proc/sys/net/ipv4/neigh/default/gc_stale_time
echo 1024 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo 8192 > /proc/sys/net/ipv4/neigh/default/gc_thresh3


特别注意,不要盲目增加ip_conntrack_max,一般默认的65536个链接就已经足够,盲目增加会导致内存开支过大,而且可能很快也会爆满。(65536个链接大约需要1GB内存)重要的是,需要找到导致这么多链接的原因!另外ip_conntrack_tcp_timeout_established默认是保持连接5天时间,改成180的意思是3小时。

vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 322560
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
sysctl -p

查找导致这么多ip_conntrack链接的原因:

[root@www.ctohome.com]#  cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
65536
[root@www.ctohome.com]#  cat  /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
180

cat /proc/net/ip_conntrack  目测可疑IP和端口,然后用iptables封掉
有时候看不出真实源头,可先记录日志,参考:

iptables -D FORWARD -p udp --dport 53 -m state --state NEW -j LOG --log-prefix "cto_domain_dns "
iptables -I FORWARD -d 79.138.140.122 -p tcp -m state --state NEW -j LOG --log-prefix "cto_find_issue "

然后查看日志tail -f /var/log/messages,分析出真实源头,再把真实源头屏蔽掉
如:

iptables -I FORWARD -s 50.2.6.12 -p udp --sport 53 -j DROP


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/28.html