Введение
Техника компьютерной сети Пробивание отверстий (или иногда пробивание) - это техника в компьютерной сети для установления прямого соединения между двумя сторонами, в которых одна или обе сторон находятся за брандмауэрами или за маршрутизаторами, которые используют сетевой перевод адресов (NAT). Чтобы пробить отверстие, каждый клиент подключается к неограниченному серверу третьей стороны, который временно хранит внешнюю и внутреннюю информацию о адресах и портах для каждого клиента. Затем сервер передает информацию каждого клиента другому, и используя эту информацию, каждый клиент пытается установить прямое соединение; в результате соединений с использованием действительных номеров портов, ограничительные брандмауэры или маршрутизаторы принимают и перенаправляют входящие пакеты с каждой стороны. Для пробивания отверстий не требуется никаких знаний о топологии сети. ICMP-пробивание отверстий, UDP-пробивание отверстий и TCP-пробивание отверстий соответственно используют протоколы управления сообщениями в Интернете, пользовательские датграммы и протоколы управления передачей.
Hole punching (or sometimes punch through) is a technique in computer networking for establishing a direct connection between two parties in which one or both are behind firewalls or behind routers that use network address translation (NAT). To punch a hole, each client connects to an unrestricted third party server that temporarily stores external and internal address and port information for each client. The server then relays each client's information to the other, and using that information each client tries to establish direct connection; as a result of the connections using valid port numbers, restrictive firewalls or routers accept and forward the incoming packets on each side. Hole punching does not require any knowledge of the network topology to function. ICMP hole punching, UDP hole punching and TCP hole punching respectively use Internet Control Message, User Datagram and Transmission Control Protocols.
Обзор
Сетевые устройства с общедоступными или глобально доступными IP-адресами могут легко создавать соединения друг с другом. Клиенты с частными адресами также могут легко подключаться к общедоступным серверам, если клиент за маршрутизатором или брандмауэром инициирует соединение. Однако, пробивание отверстий (или какая-либо другая форма NAT traversal) требуется для установления прямого соединения между двумя клиентами, которые находятся за разными брандмауэрами или маршрутизаторами, которые используют сетевой перевод адресов (NAT). Оба клиента инициируют соединение с неограниченным сервером, который записывает информацию о конечной точке и сеансе, включая публичный IP и порт, а также частный IP и порт. Брандмауэры также отмечают конечные точки, чтобы позволить ответам от сервера проходить обратно. Затем сервер отправляет информацию о конечной точке и сеансе каждого клиента другому клиенту или пиру. Каждый клиент пытается подключиться к своему одноранговому серверу через указанный IP-адрес и порт, которые открыт для сервера брандмауэром однорангового сервера. Новая попытка соединения пробивает дыру в брандмауэре клиента, поскольку конечная точка теперь становится открытой для получения ответа от своего коллеги. В зависимости от условий сети один или оба клиента могут получить запрос на подключение. Успешный обмен удостоверением между обоими клиентами указывает на завершение процедуры пробивания отверстий.
Примеры
Продукты VoIP, приложения для онлайн-игр и программное обеспечение для сетей P2P используют пробивание отверстий. Телефонное программное обеспечение Skype использует пробивание отверстий, чтобы позволить пользователям общаться с одним или несколькими пользователями в звуковом режиме. Быстрые многопользовательские онлайн-игры могут использовать технику пробивания отверстий или требовать от пользователей создания постоянной отверстия в брандмауэре для уменьшения задержки работы сети. Приложения VPN, такие как Hamachi, ZeroTier и Tailscale, используют пробивание отверстий, чтобы позволить пользователям подключаться непосредственно к подписанным устройствам за брандмауэрами. Децентрализованное программное обеспечение для обмена файлами между одноранговыми пользователями основывается на пробивании отверстий для распределения файлов.
Требования
Надежное пробивание отверстий требует последовательного перевода конечных точек, а для нескольких уровней NAT - перевода штифтов. Когда исходящее соединение из частной конечной точки проходит через брандмауэр, оно получает публичную конечную точку (публичный IP-адрес и номер порта), а брандмауэр переводит трафик между ними. До закрытия соединения клиент и сервер общаются через публичную конечную точку, а брандмауэр соответствующим образом направляет трафик. Последовательный конечный перевод использует ту же самую публичную конечную точку для данной частной конечной точки, вместо того, чтобы выделять новую публичную конечную точку для каждого нового соединения. Перевод шнура создает обратное соединение между двумя собственными конечными точками, когда он признает, что конечная точка назначения является самой собой. Эта функциональность необходима для пробивания отверстий только при использовании в многослойной NAT.