问题: 突然发现访问网站很慢,服务器的cpu、内存和磁盘使用率都正常
1 2 |
分析过程及解决方案:查询/var/log/message日志发现有这样的记录 "ip_conntrack table full dropping packet" |
说明:
1 |
kernel 用 ip_conntrack 模块来记录 iptables 网络包的状态,并保存到 table 里(这个 table 在内存里),如果网络状况繁忙,比如高连接,高并发连接等会导致逐步占用这个 table 可用空间,一般这个 table 很大不容易占满并且可以自己清理,table 的记录会一直呆在 table 里占用空间直到源 IP 发一个 RST 包,但是如果出现被攻击、错误的网络配置、有问题的路由/路由器、有问题的网卡等情况的时候,就会导致源 IP 发的这个 RST 包收不到,这样就积累在 table 里,越积累越多直到占满,满了以后 iptables 就会丢包,出现外部无法连接服务器的情况。 |
1 |
iptables启动的是会在日志里提示当前的buckets和conntrack_max的值以及每条跟踪连接需要消耗多少内存: |
问题原因:内核的 conntrack 空间满了
解决:
先查看下连接数
1 |
netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}' |
查看ip数
1 2 3 4 |
cat /proc/net/nf_conntrack| cut -d ' ' -f 10 | cut -d '=' -f 2| sort | uniq -c | sort -nr | head -n 10 13795 可以看到ip已经够多了 |
修复刚刚iptables 满了的问题 内核优化添加:
1 2 3 4 5 6 7 |
#执行如下设置: sysctl -w net.nf_conntrack_max=25000000 sysctl -w net.netfilter.nf_conntrack_max=25000000 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=180 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=120 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=60 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_fin_wait=12 |
如果有可疑连接,可以用相关命令查看并采取相应措施
查看连接最多的ip
1 |
cat /proc/net/nf_conntrack | cut -d ' ' -f 16 | cut -d '=' -f 2| sort | uniq -c | sort -nr | head -n 16 |
- 本文固定链接: https://www.yoyoask.com/?p=4264
- 转载请注明: shooter 于 SHOOTER 发表