服务器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字节的内核存储空间,时间一长就会把默认的空间填满.
查看当前连接数:
[[email protected]]# 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链接的原因:
[[email protected]]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
65536
[[email protected]]# 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
相关参数说明:
ARP 支持一个 sysctl 接口,可以用以配置全局参数或逐个网络接口地进行配制。 该 sysctl 可以通过/proc/sys/net/ipv4/neigh/*/* 文件或者使用 sysctl(2) 接口来访问。系统中每个接口都在 /proc/sys/net/ipv4/neigh/. 中有自己的目录。`default'目录中的设置用于所有新建的设备。 sysctl 相关的时间是以秒为单位,除非特别声明过.