服务器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