我对 NAT 的简单理解是可能会发生以下情况:
两台客户端电脑 192.168.1.2 和 192.168.1.3 打开一个源端口 = 12345 的连接。网关收到这些后需要使用 NAT,因此当它从外部 IP 1.1.1.1 出去时,其中一个保持为 12345,另一个保持为 12346。
192.168.1.2:12345 1.1.1.1:12345 <-> 2.2.2.2:80
-----> 192.168.1.1 ----->
192.168.1.3:12345 1.1.1.1:12346 <-> 3.3.3.3:443
当数据包返回 1.1.1.1 时,它必须映射到正确的内部 IP 和端口。这需要某种映射表。
我想知道,这张桌子通常可以使用多久?
- x 分钟/小时?
- 直到它看到连接关闭?
因此,例如如果我有一个不定期地以任何方式发送数据的协议,那么是否存在映射已经消失并且另一方认为连接已关闭(没有确认)的风险?
在Linux中,有没有办法查看这个表?
答案1
我想知道,这张桌子通常可以使用多久?
这些似乎由以下 sysctl 键控制。作为示例,附上我机器上的配置(从未调整过,应该是默认值)。
> sysctl -a 2>/dev/null | grep ip_conntrack_.*timeout
net.ipv4.netfilter.ip_conntrack_generic_timeout = 600
net.ipv4.netfilter.ip_conntrack_icmp_timeout = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 10
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 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_last_ack = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60
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_time_wait = 120
net.ipv4.netfilter.ip_conntrack_udp_timeout = 30
net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 180
因此,例如如果我有一个不定期地以任何方式发送数据的协议,那么是否存在映射已经消失并且另一方认为连接已关闭(没有确认)的风险?
似乎已建立的 TCP 连接的超时时间为 5 天(432000 秒)。我想你应该没问题,除非你使用的是基于 UDP 的协议。
在Linux中,有没有办法查看这个表?
是的。/proc/net/nf_conntrack
(第三列)或使用conntrack -L
。
其他资源:
- Iptables 教程作者:Oskar Andreasson(镜子)