Mat*_*arp 2 iptables conntrack
我的集群中有一个节点,它在系统日志中收到大量“nf_conntrack:表已满,正在丢弃数据包”消息。我检查了 nf_conntrack_count 并且它正对 nf_conntrack_max 运行。查看该表,我看到大部分条目都是 DNS 请求,因此我将这些规则添加到“原始”netfilter 表中。
$ sudo iptables -t raw -vnL
Chain PREROUTING (policy ACCEPT 146M packets, 19G bytes)
pkts bytes target prot opt in out source destination
33M 4144M CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53 CT notrack
33M 2805M CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 CT notrack
Chain OUTPUT (policy ACCEPT 73M packets, 8311M bytes)
pkts bytes target prot opt in out source destination
10785 882K CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 CT notrack
0 0 CT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:53 CT notrack
Run Code Online (Sandbox Code Playgroud)
这使得计数徘徊在 13000 左右,并且 nf_conntrack_max 设置为 65535。但是我仍然不断收到丢弃的数据包消息。其余的大多数数据包都是 UDP,我将 nf_conntrack_udp_timeout 设置为低至 1 秒,使 nf_conntrack_count 保持在 1000 左右。但是我仍然收到丢弃的打包消息。
从这里开始,如果我提高最大值,它将停止丢弃的数据包消息,但是我不明白为什么这是必要的。
我正在运行 docker,并且有一个 elasticsearch 容器(这个问题似乎发生在任何运行 elasticsearch 的节点上)。不确定它是否相关,但该节点有 48 个内核。
$ uname -a
Linux qtausc-pphd0128 3.19.0-26-generic #28~14.04.1-Ubuntu SMP Wed Aug 12 14:09:17 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
那么为什么当计数远小于最大值时它会丢弃数据包?
不久前,我在 Squid 系统上遇到了同样的问题。
我发现减少 conntrack 大小的最有效方法之一是减少内核中的默认 TCP 超时。
在net.netfilter.nf_conntrack_tcp_timeout_established
默认情况下设置为432000。没错……那是5天。
要设置该值,您可以发出以下命令;
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=X
Run Code Online (Sandbox Code Playgroud)
如果您希望该更改保持不变,则需要将该行添加到/etc/sysctl.conf
.
在将该值降低到 600 之后,conntrack 计数在几天内稳步下降。
我使用sysctl net.netfilter.nf_conntrack_max
和sysctl net.netfilter.nf_conntrack_count
以获取值。
归档时间: |
|
查看次数: |
6599 次 |
最近记录: |