Почему если на маршрутизаторе развёрнут NAT, то порт не подменяется на проходящих пакетах?

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
жучара
Сообщения: 1164
ОС: Debian 12

Почему если на маршрутизаторе развёрнут NAT, то порт не подменяется на проходящих пакетах?

Сообщение жучара »

Друзья! Вот теория сначала:
при прохождении пакета из внутренней во внешнюю сеть каждой паре (внутренний частный адрес; номер порта TCP или UDP отправителя} ставится в соответствие пара {глобальный IP-адрес внешнего интерфейса; назначенный номер порта TCP или UDP}. Назначенный номер порта выбирается произвольно, однако должно быть выполнено условие его уникальности в пределах всех узлов, получающих выход во внешнюю сеть. Соответствие фиксируется в таблице.
Это Олиферы, "Компьютерные сети. Принципы, технологии, протоколы".

Ну то есть если на маршрутизаторе NAT, то приходит TCP-пакет с одним портом, а выходит с другим. С адресами то же самое. Всё просто.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

Поехали:
ts.png
Вот сеть. A и F- конечные хосты, а на промежуточных развёрнут NAT. Я пока не буду тут писать, как именно, дабы не загромождать тему. A и F общаются по протоколу tcp. Конкретнее. На F:

Shell

$ nc -l -p 9999
На A:

Shell

$ nc 2.98.166.224 9999
(2.98.166.224 это IP адрес единственного интерфейса на хосте F). Ну и всё, собсно. Все пакеты удачно проходят по всем маршрутизаторам и что я в консоли A напишу, тов консоли F появляется.

Посмотрим, как пакеты проходят, к примеру, маршрутизатор B. На B команднём:

Shell

tshark -i enp0s3 -f "tcp and dst 2.98.166.224" -i enp0s8 -f "tcp and dst 2.98.166.224"
И начнём набивать в консоли на хосте A что-нибудь. Пакеты будут приходить на интерфейс enp0s3 и выходить с интерфейса enp0s8 и будут отображаться. И на входе и на выходе у пакетов должны быть разные IP-адреса и порты. Смотрим:

Shell

$ tshark -i enp0s3 -f "tcp and dst 2.98.166.224" -i enp0s8 -f "tcp and dst 2.98.166.224"
Capturing on 'enp0s3' and 'enp0s8'
** (tshark:2610) 23:18:18.411873 [Main MESSAGE] -- Capture started.
** (tshark:2610) 23:18:18.411913 [Main MESSAGE] -- File: "/tmp/wireshark_2_interfaces69GAP3.pcapng"
1 0.000000000 2.45.23.56 → 2.98.166.224 TCP 71 40480 → 9999 [PSH, ACK] Seq=1 Ack=1 Win=502 Len=5 TSval=678210397 TSecr=3607724957
2 0.000075898 45.24.12.78 → 2.98.166.224 TCP 71 40480 → 9999 [PSH, ACK] Seq=1 Ack=1 Win=502 Len=5 TSval=678210397 TSecr=3607724957
3 59.019167017 2.45.23.56 → 2.98.166.224 TCP 71 40480 → 9999 [PSH, ACK] Seq=6 Ack=1 Win=502 Len=5 TSval=678269475 TSecr=3608132066
4 59.019232495 45.24.12.78 → 2.98.166.224 TCP 71 40480 → 9999 [PSH, ACK] Seq=6 Ack=1 Win=502 Len=5 TSval=678269475 TSecr=3608132066
Ну, собсно, всё. Вот и занавес. Порт как был портом 40480 на входе. так портом 40480 остался и на выходе. ЧЯДНТ? Спасибо, кто откликнется. На B Debian 12
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5471
ОС: Gentoo

Re: Почему если на маршрутизаторе развёрнут NAT, то порт не подменяется на проходящих пакетах?

Сообщение /dev/random »

Эта "теория" не указывает, на какой порт он должен заменяться. Выбирается какой-нибудь свободный. Заменять порт сам на себя, если он свободен, не запрещено. Linux, для упрощения NAT Traversal, обычно так и делает: если эта пара (source_addr, source_port) недавно ещё не встречалась, и порт (nat_addr, source_port) ещё ни подо что не используется, то устанавливает nat_port=source_port. Если встречалась, то по возможности пытается использовать тот же nat_port, что и в прошлый раз. Если это невозможно, выбирает случайный.
Спасибо сказали: