Такой Страшный Симметричный Nat

Задача прямого соединения машин за NAT стара как мир, и я думаю, многие слышали о UDP Hole Punching. Когда я впервые начал интересоваться вопросом, я убедился, что симметричный нат пробить невозможно и даже не стоит пытаться.

Однако совсем недавно мне попалась статья, в которой говорилось, что симметричный Нат — это не смертный приговор.

Давайте разберемся.



Типы NAT

Традиционно во многих статьях в Интернете все NAT делятся на четыре типа:
  • Полноконусный NAT;
  • Конусный NAT с ограниченным адресом;
  • Конусный NAT с ограничением портов;
  • Симметричный NAT
На самом деле это не так.

Точнее, не совсем так.

Любой NAT имеет две основные характеристики: 1) фильтр входящих пакетов; 2) правило сопоставления портов.

Первая характеристика точно описана в большинстве статей и означает, какие входящие пакеты следует отправлять на машину за NAT: все (без фильтра — Полный конус), с определенного адреса (ограничение адреса) или с определенного адреса и порта (порт -ограниченный).

Вторая характеристика присуща только симметричному NAT, поскольку первые три типа пытаются сделать отражение «один к одному».

Например, если клиент отправит пакет с внутреннего адреса 192.168.10.24:62145, то пакет от роутера придет с адреса 1.2.3.4:62145. Причём независимо от адреса получателя.



Симметричный NAT

А теперь более подробно о симметричном NAT. Сразу оговорюсь, что фильтры входящих пакетов тоже могут быть любыми (без фильтра, с ограничением по адресу или с ограничением по порту).

И единственное отличие этого типа NAT от предыдущих заключается в выборе исходящего порта на роутере; он почти наверняка будет отличаться от исходного порта на клиенте.

Возвращаясь к предыдущему примеру, отражение может быть таким: 192.168.10.24:62145 -> 1.2.3.4:1274. Один и тот же порт выбирается случайно (или не случайно, а поочередно, но это не важно, так как мы не можем повлиять на его выбор извне).

Но есть определенные правила, они похожи на фильтр входящих пакетов:

  • Порт всегда может оставаться неизменным, независимо от получателя (конуса);
  • Порт может оставаться прежним для конкретного адреса получателя (адреса);
  • Порт может оставаться прежним только для конкретного адреса и порта получателя (порта);
При этом также существуют правила выбора следующего порта: Это может быть какая-то дельта (+1/-1 или +10/-10) или даже случайная каждый раз.

Кроме того, я видел один NAT, в котором каждый последующий порт отделялся от предыдущего случайным числом, но всегда кратным 4096.

Вместо заключения

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

Чтобы ответить на вопрос «Можно ли определить правило выделения портов и дельту, находясь за NATЭ» STUN нам в этом, конечно же, поможет. Наша задача — сделать четыре запроса к разным адресам и портам, используя один сокет (один локальный порт) и оценить результаты: Мы можем понять, как распределяются исходящие порты (адрес или порт), и попытаться вычислить эту разницу.

И здесь я обращаюсь к хабра-сообществу помочь мне со статистикой.

В Интернете был найден простой электрошокер, слегка доработанный кувалдой, и вот что получилось: Источник Пользователи Linux прекрасно знают, как это скомпилировать.

Так gcc -lpthread -o stun stun.c Его можно идеально скомпилировать студией для Windows, здесь двоичный , если под рукой нет студии.

Да простит меня stun.counterpath.net за хабра-эффект :) Вот мои результаты, но у меня нет симметричного NAT и это не интересно: Полученные результаты тестов: 1010 NAT присутствует: 1 первый сохраненный порт: 1 сохраняет порт: 0 тип: NAT с ограничением портов сопоставленные порты: 55907 55907 55907 55907 Спасибо всем за вашу помощь! udp: Пожалуйста, оставляйте свои результаты в комментариях, даже если NAT не симметричен.

Ведь в любом случае важно знать распиновку по типу.

Теги: #Сетевые технологии #симметричный nat #NAT Traversal

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.