在 /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