我对NAT的简单理解就是这样的:
两台客户端PC 192.168.1.2和192.168.1.3与src port = 12345build立连接。网关接收到这些请求,并且需要使用NAT,因此其中一台保持为12345,另一台保持为12346 IP 1.1.1.1。
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和端口。 这将需要某种映射表。
我想知道,这张桌子通常会持续多久?
例如,如果我有一个不规则地发送数据的协议,是否存在映射已经消失的风险,而另一方则认为连接是closures的(没有Ack)?
在Linux中,有没有办法看到这个表?
我想知道,这张桌子通常会持续多久?
这些似乎由以下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
例如,如果我有一个不规则地发送数据的协议,是否存在映射已经消失的风险,而另一方则认为连接是closures的(没有Ack)?
似乎build立的TCP连接超时为5天(432000秒)。 我想你会没事的,除非你使用基于UDP的协议。
在Linux中,有没有办法看到这个表?
是。 在/proc/net/nf_conntrack
(第三列)或使用conntrack -L
。