由此关联看来 conntrack 在连接关闭后会记住 X 秒。
有谁知道 X 有多长以及它是否可以配置?
答案1
conntrack 在关闭后应记住 TCP 连接的原因与 TCP 在关闭后应记住连接的原因相同:RFC 793关于TCP,特别是关于TIME-WAIT的部分应该默认(写得不是很清楚)2mn。当然,对于 UDP、ICMP 或其他一些协议,这并不适用,但延迟是为了记住会话。这是状态防火墙或 NAT 所必需的。
也就是说,一旦加载了 netfilter 的 conntrack,大多数设置都可以在那里使用:
/proc/sys/net/netfilter/
(它们可能在非常旧的内核上)
例如,它们可以显示为:
# sysctl net.netfilter | grep timeout
net.netfilter.nf_conntrack_dccp_timeout_closereq = 64
[...]
net.netfilter.nf_conntrack_dccp_timeout_timewait = 240
net.netfilter.nf_conntrack_frag6_timeout = 60
net.netfilter.nf_conntrack_generic_timeout = 600
net.netfilter.nf_conntrack_gre_timeout = 30
net.netfilter.nf_conntrack_gre_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_icmpv6_timeout = 30
[...]
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 120
您可以使用相同的命令(或者使用echo nnn > /proc/sys/...
)来更改设置。例如,将 TCP CLOSE 状态超时增加到更高的延迟,例如 60:
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close=60
某些功能和默认设置可能取决于内核选项和版本。例如,net.netfilter.nf_conntrack_udp_timeout_stream
对于“已建立”的 UDP 流量(当同一流中不止一个数据包及其回复时被视为如此)在最近的内核中从 180 减少到 120(>= 5.0?)。
还有其他方法可以配置专用超时策略以应用于特定类型的连接,而不是使用默认的全局值:nfct
沿着iptables或与nftables。