Насколько я понимаю, NAT может произойти примерно так:
Два клиентских ПК 192.168.1.2 и 192.168.1.3 открывают соединение с src port = 12345. Шлюз получает их и должен использовать 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-адрес и порт. Для этого потребуется какая-то таблица сопоставления.
Интересно, как долго обычно продержится этот стол?
Так, например, если у меня есть протокол, который нерегулярно отправляет данные в любом случае, существует ли риск, что сопоставление исчезло, и другая сторона видит соединение как закрытое (не получает подтверждения)?
В 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
Так, например, если у меня есть протокол, который нерегулярно отправляет данные в любом случае, существует ли риск, что сопоставление исчезло, и другая сторона видит соединение как закрытое (не получает подтверждения)?
Похоже, что тайм-аут для установленных TCP-соединений составляет 5 дней (432000 секунд). Думаю, у вас все будет хорошо, если вы не используете протокол на основе UDP.
В Linux есть ли способ увидеть эту таблицу?
Да. Либо в /proc/net/nf_conntrack
(третий столбец) или используя conntrack -L
.