UDP hole punching
UDP hole punching — это техника, обычно используемая в системах с трансляцией сетевых адресов (NAT), позволяющая установить связь между двумя компьютерами, находящимися в разных частных сетях, с использованием протокола UDP (User Datagram Protocol).
Данная методика широко применяется в одноранговых сетях и IP-телефонии (голосовая связь по IP)[1]. Она также может использоваться для организации виртуальной частной сети (VPN) поверх UDP.
UDP hole punching устанавливает соединение между двумя хостами, обменивающимися данными через один или несколько устройств с трансляцией адресов. Как правило, для этого используется третий узел в общедоступной сети, который помогает узнать сетевые порты, используемые для непосредственного взаимодействия между двумя частными участниками.
После установления связи состояние NAT сохраняется обычным сетевым трафиком, либо, при его отсутствии, с помощью keep-alive-пакетов (обычно это пустые UDP-пакеты либо пакеты с минимальным содержимым).
Принцип работы
UDP hole punching — это способ установить двустороннее UDP-соединение через Интернет между двумя компьютерами, находящимися в частных сетях. Эта техника применима не ко всем типам NAT и не во всех сценариях.
NAT: базовые сведения
Существует несколько типов NAT. В приведённом ниже объяснении рассматривается динамический NAT c маскарадингом.
NAT позволяет устройствам в одной частной сети устанавливать исходящие соединения в Интернет, используя единственный публичный IP-адрес — адрес машины NAT. Для этого NAT отслеживает соединения, создаваемые компьютерами из частной сети, и сопоставляет кортеж (IP1, P1, IPdst, Pdst) с кортежем (EIP, EPX, IPdst, Pdst).
Когда машина-адресат отвечает, она использует кортеж (IPdst, Pdst, EIP, PX).
Для связи двух машин, M1 и Mα, из разных частных сетей требуется:
- чтобы M1 знала публичный адрес Mα и порт Y, используемый NATB;
- чтобы Mα знала публичный адрес M1 и порт X, используемый NATA.
При прохождении первого UDP-пакета от M1 к Mα NATA создаёт соответствующую запись с ожиданием ответа.
При первом пакете от Mα к M1 через NATB последний также фиксирует это соединение как открывающееся и ожидает ответа.
На этом этапе NAT и межсетевые экраны как бы «пробиваются» (от англ. Hole Punching) и позволяют дальнейший обмен данными между M1 и Mα.
Следует отметить, что несмотря на название, техника hole punching не компрометирует безопасность NAT/фаервола.
M1 и Mα должны найти способ обменяться необходимой информацией.
Обмен информацией
Компьютеры, находящиеся за NAT и выходящие в Интернет, обычно используют метод STUN (англ. Session Traversal Utilities for NAT) или ICE (англ. Interactive Connectivity Establishment) для определения публичного адреса NAT, с которым осуществляется связь.
В процессе UDP hole punching используется сервер встречи S в публичной сети для обмена сведениями, необходимыми для прямой связи между двумя участниками.
Оба компьютера начинают отправку пакетов, делая несколько попыток. В случае англ. Restricted cone NAT первый пакет с удалённого хоста блокируется.
NAT фиксирует факт отправки первого пакета к удалённому хосту и разрешает приём последующих пакетов от того же IP-адреса и порта.
Поддержание соединения
На NAT-сервере состояние UDP-соединения истекает через определённый интервал — обычно через несколько десятков секунд[2]. Поэтому UDP hole punching периодически отправляет keep-alive-пакеты, чтобы обновлять внутренние счётчики состояний и предотвращать разрыв соединения.
Ограничения
UDP hole punching не работает с устройствами, осуществляющими англ. symmetric NAT (симметричный NAT), часто встречающимися в крупных корпоративных сетях.
Межсетевой экран на NAT-сервере должен отклонять входящие соединения извне. В противном случае, если первый внешний поток займёт запланированный порт, исходящий поток от частной машины через NAT будет вынужден использовать другой порт, что нарушает работу hole punching.
Этапы установки UDP hole punching
Пусть M1 и Mα — два хоста, каждый в своей приватной сети.
NATA и NATB — соответственно, два NAT-маршрутизатора с публичными адресами EIPA и EIPB.
S — общедоступный сервер с известным публичным IP-адресом.
- 1. M1 и Mα начинают UDP-обмен с S; NATA и NATB создают соответствующие UDP-состояния и назначают временные внешние номера портов EPA и EPB.
- 2. S анализирует UDP-пакеты, чтобы выяснить исходные порты, используемые NATA и NATB (экзотерные порты EPA и EPB).
- 3. S сообщает Mα значения EIPA:EPA, а M1 — EIPB:EPB.
- 4. M1 отправляет пакет на EIPB:EPB.
- 5. NATA анализирует пакет M1 и добавляет в свою таблицу трансляции кортеж (IP1, P1, EIPB, EPB) = (EIPA, EPA, EIPB, EPB).
- 6. Mα отправляет пакет на EIPA:EPA.
- 7. NATB анализирует пакет Mα и добавляет кортеж (IPα, Pα, EIPA, EPA) = (EIPB, EPB, EIPA, EPA).
- 8. В зависимости от состояния таблицы трансляции NATA при получении первого пакета от Mα пакет либо отклоняется (если записи нет), либо принимается.
- 9. Аналогично, на NATB пакет от M1 отклоняется или допускается в зависимости от наличия записи.
- 10. Таким образом, пробиты «дыры» в NAT, и оба хоста могут связаться напрямую. В худшем случае второй пакет M1 доходит до Mα, и второй пакет Mα — до M1.
Если оба участника используют англ. Restricted cone NAT или англ. Symmetric NAT, внешние порты NAT будут отличаться от портов, использовавшихся для сервера S. На некоторых маршрутизаторах внешние порты увеличиваются по порядку, что позволяет угадать нужный порт и тем самым наладить обмен.
Примечания
- ↑ UDP Hole Punching, State of Peer-to-Peer (P2P) Communication across Network Address Translators (NATs) (англ.). ietf.org (1 марта 2008). Дата обращения: 21 июня 2024. Архивировано 29 декабря 2016 года.
- ↑ Simple Security in IPv6 Gateway CPE (англ.). ietf.org (1 января 2011). Дата обращения: 21 июня 2024. Архивировано 7 августа 2011 года.
Литература
- Одноранговое взаимодействие через трансляторы сетевых адресов (NAT), PDF — подробное описание процесса hole punching.
- Netfilter: отслеживание соединений и реализация NAT — информация об устройстве натинга и отслеживания соединений в ядре Linux.
- STUNT — Simple Traversal of UDP Through NATs and TCP too.
- Трансляция сетевых адресов и приложения одноранговых сетей (NATP2P).