我在我的 Linux 服务器的 /var/log/messages 中看到了很多这样的消息
kernel: nf_conntrack: table full, dropping packet.
kernel: __ratelimit: 15812 callbacks suppresse
虽然我的服务器受到 DoS 攻击,但内存仍未饱和。我想知道该消息的重要性以及如何应对可能的安全影响。
我在我的 Linux 服务器的 /var/log/messages 中看到了很多这样的消息
kernel: nf_conntrack: table full, dropping packet.
kernel: __ratelimit: 15812 callbacks suppresse
虽然我的服务器受到 DoS 攻击,但内存仍未饱和。我想知道该消息的重要性以及如何应对可能的安全影响。
该消息表示您的连接跟踪表已满。除了 DoS 之外,没有其他安全隐患。您可以通过增加被跟踪的最大连接数、减少跟踪超时或完全禁用连接跟踪来部分缓解这种情况,这在服务器上是可行的,但在 NAT 路由器上不行,因为后者将停止运行。
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=54000
sysctl -w net.netfilter.nf_conntrack_generic_timeout=120
sysctl -w net.ipv4.netfilter.ip_conntrack_max=<more than currently set>
这是一篇关于这个主题的好文章。本质上,它只是意味着 IP 表(通过 APF 或任何其他解决方案)用于存储持久连接的表已满。以内存为代价,您可以增加它。
我建议还将您的防火墙规则设置为拒绝而不是丢弃
如果您需要保留 iptables NAT 规则,一个临时的修复方法是:
linux:~# sysctl -w net.netfilter.nf_conntrack_max=131072
我说暂时的,因为提高nf_conntrack_max
并不能保证以后事情会顺利进行。然而,在许多流量负载不那么大的服务器上,只需将其提高net.netfilter.nf_conntrack_max=131072
到足够高的值就足以解决问题。
- 增加 nf_conntrack 哈希表的大小
每当提高 net.netfilter.nf_conntrack_max 时,存储 conntrack 条目列表的哈希表 hashsize 值应适当增加。
linux:~# echo 32768 > /sys/module/nf_conntrack/parameters/hashsize
计算要设置的正确值的规则是:
hashsize = nf_conntrack_max / 4
– 永久存储所做的更改;a) 放入 /etc/sysctl.conf:
linux:~# echo 'net.netfilter.nf_conntrack_count = 131072' >> /etc/sysctl.conf
linux:~# /sbin/sysct -p
b)放入/etc/rc.local
(在exit 0线之前):
echo 32768 > /sys/module/nf_conntrack/parameters/hashsize
注意:小心这个变量,根据我的经验,将它提高到过高的值(尤其是在 XEN 修补内核上)可能会冻结系统。将值提高到过高的数字也会冻结在旧硬件上运行的常规 Linux 服务器。
– 对于nf_conntrack
东西的诊断有 ;
/proc/sys/net/netfilter
内核内存存储目录。在那里您可以找到一些动态存储的值,这些值nf_conntrack
“实时”提供有关操作的信息:
linux:~# cd /proc/sys/net/netfilter linux:/proc/sys/net/netfilter# ls
-al nf_log/ total 0 dr-xr-xr-x 0 root root 0 Mar 23 23:02 ./ dr-xr-xr-x 0 root root 0 Mar 23 23:02 ../
-rw-r--r-- 1 root root 0 Mar 23 23:02 0
-rw-r--r-- 1 root root 0 Mar 23 23:02 1
-rw-r--r-- 1 root root 0 Mar 23 23:02 10
-rw-r--r-- 1 root root 0 Mar 23 23:02 11
-rw-r--r-- 1 root root 0 Mar 23 23:02 12
-rw-r--r-- 1 root root 0 Mar 23 23:02 2
-rw-r--r-- 1 root root 0 Mar 23 23:02 3
-rw-r--r-- 1 root root 0 Mar 23 23:02 4
-rw-r--r-- 1 root root 0 Mar 23 23:02 5
-rw-r--r-- 1 root root 0 Mar 23 23:02 6
-rw-r--r-- 1 root root 0 Mar 23 23:02 7
-rw-r--r-- 1 root root 0 Mar 23 23:02 8
-rw-r--r-- 1 root root 0 Mar 23 23:02 9
四。减少其他 nf_conntrack NAT 超时值以防止服务器受到 DoS 攻击
nf_conntrack_*
通常,超时的默认值(不必要的)很大。
因此,对于大流量的流量,即使你增加nf_conntrack_max
,仍然很短,你会得到一个nf_conntrack
溢出表,导致服务器连接断开。为避免这种情况发生,请检查并减少其他nf_conntrack
超时连接跟踪值:
linux:~# sysctl -a | grep conntrack | grep timeout
net.netfilter.nf_conntrack_generic_timeout = 600
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.ipv4.netfilter.ip_conntrack_generic_timeout = 600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent2 = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 432000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 10
net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans = 300
net.ipv4.netfilter.ip_conntrack_udp_timeout = 30
net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 180
net.ipv4.netfilter.ip_conntrack_icmp_timeout = 30
所有超时都以秒为单位。net.netfilter.nf_conntrack_generic_timeout
如您所见,相当高 - 600 秒 =(10 分钟)。这种值意味着任何未响应的 NAT 连接可以保持挂起 10 分钟!
该值net.netfilter.nf_conntrack_tcp_timeout_established = 432000
也相当高(5 天!)如果不降低此值,则服务器将成为任何想用过多连接淹没它的人的容易目标,一旦发生这种情况,服务器将快速达到甚至提高的值并且net.nf_conntrack_max
初始连接断开将再次发生......
总而言之,为了防止服务器受到恶意用户的攻击,位于 NAT 后面的服务器会受到拒绝服务攻击的困扰:
降低net.ipv4.netfilter.ip_conntrack_generic_timeout
到 60 – 120 秒和大约net.ipv4.netfilter.ip_conntrack_tcp_timeout_established
54000
linux:~# sysctl -w net.ipv4.netfilter.ip_conntrack_generic_timeout = 120
linux:~# sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 54000
此超时应该在路由器上正常工作,而不会对常规 NAT 用户造成中断。更改值并监控至少几天后,通过将更改添加到/etc/sysctl.conf
linux:~# echo 'net.ipv4.netfilter.ip_conntrack_generic_timeout = 120' >> /etc/sysctl.conf
linux:~# echo 'net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 54000' >> /etc/sysctl.conf
我在网上找到了这个链接,它给出了深入的答案:https ://discuss.aerospike.com/t/how-to-handle-net-netfilter-nf-conntrack-count-max-exceeded/5051 这是如果链接变得陈旧,相关位:
无常变化:
$ for i in close_wait fin_wait time_wait ; do sysctl -w net.netfilter.nf_conntrack_tcp_timeout_${i}=60 ; done
$ sysctl -w net.netfilter.nf_conntrack_max=524288
如果没有帮助,请还原更改。您可以查看 /var/log/syslog 是否有错误:
$ for i in close_wait fin_wait time_wait ; do sysctl -w net.netfilter.nf_conntrack_tcp_timeout_${i}=120 ; done
$ sysctl -w net.netfilter.nf_conntrack_max=262144
使更改永久化:
$ cat <<EOF > /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 60
net.netfilter.nf_conntrack_max = 524288
EOF