Назад | Перейти на главную страницу

Есть ли способ соединить два исходящих TCP-соединения, чтобы обойти межсетевые экраны и NAT?

Все мы знакомы с проблемой переадресации портов и NAT: если вы хотите сделать что-то доступным для приема входящего соединения, вам нужно настроить переадресацию портов на маршрутизаторе или вызвать другую черную магию, чтобы «пробить дыры» в брандмауэр, использующий UDP или что-то в этом роде. Я новичок в концепции «дырокола», может кто-нибудь объяснить, как она работает?

По сути, я хотел бы понять, как будет работать пробивка отверстий и что за этим стоит теория, а также то, можно ли соединить два TCP-соединения через мост через третью сторону. Поскольку нет проблем с исходящий TCP-соединения, поскольку они обрабатываются с помощью NAT, может ли третья сторона соединять соединения так, чтобы две стороны все еще были подключены, но без затрат на пропускную способность трафика, проходящего через третью сторону?

На самом деле это не вопрос stackoverflow, но это, безусловно, можно сделать, и я написал программы для этого.

По сути у вас есть программа, я опишу многопоточное решение. Два потока принимают (тот же порт, разные порты, что угодно). Когда оба потока имеют соединение, они входят в режим, в котором они читают из своего сокета и записывают в другой сокет. Когда один получает EOF, другой - shutdown (), поэтому поддерживаются полуоткрытые соединения.

Просто и легко.

Карл хорошо замечает, что я неправильно понял вопрос. Он не хотел, чтобы трафик проходил через третьих лиц. Что ж, это решаемая проблема. Если у вас есть исходящее соединение UDP без сопоставления портов источника, вы можете организовать для обеих сторон отправку пакета UDP, который затем разрешит соединение UDP туда и обратно. Запустите что-то вроде openvpn по этому каналу UDP, и все готово.

Если у вас нет возможности подключения к UDP, то вы реально можете сделать это, только если вы можете наблюдать внешний трафик (post NAT) и иметь доступ к третьей стороне, которая может подделывать произвольные пакеты. Эта третья сторона может подделать SYN-ACK в обоих направлениях, и обе стороны будут думать, что другой является сервером. Это не работает, если исходный порт изменен обеими системами NAT, так как другая сторона не может детерминированно определить правильный порт назначения для использования.