Назад | Перейти на главную страницу

Подменяет ли NAT порт TCP или UDP в полезной нагрузке ICMP?

Когда я отправляю пакет tcp или udp из сети под симметричным nat, я ожидаю, что порт будет отличаться от порта, выбранного моим компьютером, и это так. Но когда я отправляю udp-пакет с низким ttl, но ему все еще удается выйти из сети ISP, я получаю пакет icmp с ошибкой, который содержит пакет udp, который я первоначально отправил как полезную нагрузку, но с портом, сгенерированным моим система.

На данный момент я сомневаюсь, что NAT также не получает доступ к содержимому пакетов ICMP. Потому что я знал, что нужно изменить заголовки действительно важных слоев, а не полезную нагрузку. Таким образом, в случае пакета ICMP, только IP-адрес источника, а не, как я думаю, также IP-адрес и порт «субпакета» эха.

Когда я отправляю пакет tcp или udp из сети под симметричным nat, я ожидаю, что порт будет отличаться от порта, выбранного моим компьютером, и это так.

Это Трансляция сетевых адресов и портов (NAPT) версия NAT. Базовый NAT ничего не делает с транспортным протоколом. У NAPT должна быть своя таблица для каждого транспортного протокола, поэтому он поддерживает только TCP, UDP и ICMP, потому что порт TCP не является портом UDP, а ICMP не использует порты, а использует идентификаторы запросов.

Я получаю пакет icmp с ошибкой, который содержит пакет udp, который я изначально отправил как полезную нагрузку, но с портом, созданным моей системой.

Это было бы правильно.

На данный момент я сомневаюсь, что NAT также не получает в свои руки содержимое пакетов ICMP.

Для сообщений об ошибках ICMP, которые должны вернуться к отправляющему приложению, да, NAPT должен исправить содержимое сообщений об ошибках ICMP, чтобы конечное приложение получило ошибку. Сообщение об ошибке ICMP содержит первую часть исходного пакета в качестве полезной нагрузки, чтобы его можно было вернуть в правильное приложение. Если NAPT изменил исходящий пакет, он должен изменить полезную нагрузку возвращаемого сообщения об ошибке ICMP на исходную адресацию, включая номера портов.

Таким образом, в случае пакета ICMP, только IP-адрес источника, а не, как я думаю, также IP-адрес и порт «субпакета» эха.

Такое поведение объясняется в RFC 2663, Терминология и соображения транслятора сетевых адресов IP (NAT):

3.3. Трансляция пакетов ошибок ICMP

Все сообщения об ошибках ICMP (за исключением сообщения типа «Перенаправление») необходимо будет изменить при передаче через NAT. Типы сообщений об ошибках ICMP, требующие модификации NAT, включают: «Назначение недостижимо», «Отключение источника», «Превышено время» и «Проблема с параметром». NAT не должен пытаться изменить тип сообщения перенаправления.

Изменения сообщения об ошибке ICMP будут включать изменения исходного IP-пакета (или его частей), встроенных в полезную нагрузку сообщения об ошибке ICMP. Чтобы NAT был полностью прозрачным для конечных хостов, необходимо изменить IP-адрес IP-заголовка, встроенного в полезную нагрузку пакета ICMP, соответственно изменить поле контрольной суммы того же IP-заголовка и соответствующий транспортный заголовок. Контрольная сумма заголовка ICMP также должна быть изменена, чтобы отразить изменения, внесенные в заголовки IP и транспорта в полезной нагрузке. Кроме того, необходимо изменить обычный заголовок IP.


Как видите, NAT, и особенно NAPT, очень ресурсоемки, поэтому некоторые поставщики, такие как Cisco, разрешают NAT только на устройствах, которые имеют аппаратную поддержку NAT.

Подменяет ли NAT порт TCP в полезной нагрузке ICMP?

Поскольку вы имеете в виду пакет UDP, то нет, он не будет подделывать порт TCP в сообщении ICMP. Однако он, скорее всего, перепишет сообщение ICMP, чтобы отразить исходный трафик UDP по ряду причин (в зависимости от того, что ваш хост / приложение должно знать, как обрабатывать и, возможно, отвечать после получения такого сообщения ICMP).

Это может варьироваться в зависимости от реализации NAT, но давайте посмотрим на ваш пример (принимая его на веру, что все, что вы указываете в своем вопросе, является точным).

  1. Ваша система отправляет пакет UDP.
  2. Шлюз выполняет NAT для пакета UDP.
  3. Где-то за пределами вашей сети TTL уменьшается и стареет в кадре. Маршрутизатор, который делает это, отправляет обратно сообщение ICMP о превышении времени.

Перестань думать об этом на мгновение. Маршрутизатор, который генерирует сообщение ICMP о превышении времени, не будет иметь «первоначально отправленный мной udp-пакет», поскольку он прошел через ваш шлюз NAT и был переведен. Другими словами, как мог маршрутизатор, создавший сообщение ICMP, иметь какое-либо представление о том, какую исходную информацию нужно было поместить в сообщение ICMP?

Единственный способ, которым исходный пакет UDP может быть в полезной нагрузке сообщения ICMP, - это переписать его шлюзом NAT.