Введение

Техника NAT в компьютерных сетях

UDP-пробивание (hole punching) — это широко используемый метод, применяемый в приложениях сетевого адресного преобразования (NAT) для поддержания потоков пакетов протокола User Datagram Protocol (UDP), проходящих через NAT. Методы обхода NAT обычно необходимы для сетевых приложений типа «клиент-клиент» в Интернете, включающих хосты, подключенные к частным сетям, особенно в развертываниях peer-to-peer, Direct Client to Client (DCC) и Voice over Internet Protocol (VoIP). UDP-пробивание устанавливает соединение между двумя хостами, взаимодействующими через один или несколько сетевых трансляторов адресов. Как правило, сторонние хосты в общедоступной сети используются для установления состояния портов UDP, которое может быть использовано для прямого обмена данными между взаимодействующими хостами. После успешного установления состояния порта и начала обмена данными, состояние порта может поддерживаться либо обычным трафиком, либо, при длительном отсутствии такового, с помощью пакетов поддержания связи (keep-alive), обычно состоящих из пустых UDP-пакетов или пакетов с минимальным, неинтрузивным содержимым.

Обзор

UDP-пробитие — это метод установления двунаправленных UDP-соединений между хостами в частных сетях, использующих трансляторы сетевых адресов (NAT). Этот метод не применим во всех сценариях или со всеми типами NAT, поскольку характеристики работы NAT не стандартизированы. Хосты с сетевым подключением внутри частной сети, подключенной к Интернету через NAT, обычно используют метод Session Traversal Utilities for NAT (STUN) или Interactive Connectivity Establishment (ICE) для определения публичного адреса NAT, необходимого их сетевым партнерам. В этом процессе другой хост в публичной сети используется для установления соответствия портов и другого состояния UDP-порта, которое считается действительным для прямой связи между приложениями. Поскольку состояние UDP обычно истекает через короткие промежутки времени – от десятков секунд до нескольких минут – и UDP-порт закрывается, UDP-пробитие использует передачу периодических пакетов поддержания связи, каждый из которых обновляет счетчики времени жизни в конечном автомате UDP NAT. UDP-пробитие не будет работать с симметричными NAT (также известными как двунаправленными NAT), которые часто встречаются в крупных корпоративных сетях. В симметричном NAT соответствие портов NAT, связанное с соединением с известным STUN-сервером, ограничено получением данных только от этого сервера, поэтому соответствие портов, которое видит известный сервер, не предоставляет полезной информации для конечной точки. В более сложном подходе оба хоста начинают отправлять данные друг другу, делая несколько попыток. На NAT с ограниченным конусом первый пакет от другого хоста будет заблокирован. После этого устройство NAT запоминает отправку пакета на другой компьютер и разрешает прохождение любых пакетов с этого IP-адреса и номера порта. Эта техника широко используется в одноранговых (P2P) программах и в VoIP-телефонии. Она также может использоваться для упрощения установления виртуальных частных сетей (VPN) на основе UDP. Иногда этот же метод применяется к соединениям протокола TCP (Transmission Control Protocol), но с меньшим успехом, поскольку потоки TCP-соединений контролируются операционной системой хоста, а не приложением, и номера последовательностей выбираются случайным образом; следовательно, любое устройство NAT, выполняющее проверку номеров последовательностей, не будет считать пакеты связанными с существующим соединением и отбросит их.