Задача прямого соединения машин за 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. Один и тот же порт выбирается случайно (или не случайно, а поочередно, но это не важно, так как мы не можем повлиять на его выбор извне).
Но есть определенные правила, они похожи на фильтр входящих пакетов:
- Порт всегда может оставаться неизменным, независимо от получателя (конуса);
- Порт может оставаться прежним для конкретного адреса получателя (адреса);
- Порт может оставаться прежним только для конкретного адреса и порта получателя (порта);
Кроме того, я видел один 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
-
Защитите Себя С Помощью Порнофильтра
19 Oct, 24 -
Хостинг На Jino.ru — Бег На Граблях
19 Oct, 24 -
О Велосипедах И Рамах
19 Oct, 24 -
Облегченная Криптография Интернета Вещей
19 Oct, 24 -
Миллиарды Переводов Промт
19 Oct, 24