netstat 和 ip_conntrack 连接数相差一个数量级。为什么?

netstat 和 ip_conntrack 连接数相差一个数量级。为什么?

在 /proc/net/ip_conntrack 中我有:

established 3076
time_wait 4346
total 7468

在 netstat 中我有:

established 1051
time_wait 73
total 1165

这是为什么?其他连接在哪里?如何弄清楚它们在做什么?

更新:有关 ip_conntrack 的更多统计数据

assured 5230
unreplied 2133
total 7427

答案1

Conntrack模块会记住最近的连接 X 秒,直到它们最终过期。据我所知,这是因为 iptables 还有其他几个模块可以利用此信息:例如,如果您想禁止某个 IP 地址在某个时间段内建立 X 个新连接。

netstat另一方面,它展示的是实时信息,对古代历史不感兴趣。

您是否增加了 conntrack 表中的最大条目数?对于较新的内核,

sysctl net.ipv4.netfilter.ip_conntrack_max

...或者使用一些较旧的内核,

sysctl net.ipv4.ip_conntrack_max

返回给您?您可以通过以下方式永久提高该值,/etc/sysctl.conf或通过以下方式暂时(直到下次重新启动)提高该值sysctl -w net.ipv4.ip_conntrack_max

答案2

我们在使用容器(docker)的时候偶然发现了这种情况。

不确定它是否有助於您的情况,但看起来netstat -nat主机操作系统只会显示用于主机网络堆栈的连接,而conntrack -L将显示主机及其所有容器的信息。

如果您netstat -nat从涉及报告的连接容器内部运行conntrack -L,您应该会看到那里列出的连接信息。

答案3

希望我能回答为什么它们不同。但是,使用反向代理时要记住的一件事是,您将为每个连接支付双倍的 conntrack 费用。这是因为您有一个从客户端到反向代理的连接,然后从反向代理到 Web 服务器的连接。

因此,如果你已经如果在前面有一个状态防火墙,您可能希望在反向代理上(或者可能在它的一侧)完全放弃连接跟踪。

将其全部删除将是这样的:

# iptables -L -t raw
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
NOTRACK    tcp  --  anywhere             anywhere            tcp dpt:www 
NOTRACK    tcp  --  anywhere             anywhere            tcp spt:www 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
NOTRACK    tcp  --  anywhere             anywhere            tcp spt:www 
NOTRACK    tcp  --  anywhere             anywhere            tcp dpt:www

在你的情况下,你可能不想跟踪环回-i lo

$ iptables -t raw -A PREROUTING -i lo -j NOTRACK
$ iptables -t raw -A OUTPUT -o lo -j NOTRACK

相关内容