Да. Предположим, что ваша сеть выглядит так:
Вы хотите SSH от A до B. У вас sshd работает на B; он прослушивает tcp://127.0.0.1:22.
B$ pwnat -s 0.0.0.0 2022 127.0.0.1:22
Теперь pwnat на B прослушивает udp://0.0.0.0:2022 и настроен на разрешение подключений к tcp://127.0.0.1:22. Он также отправляет периодические эхо-запросы ICMP на 3.3.3.3 (жестко закодированный IP).
A$ pwnat -c 127.0.0.1 3022 104.16.111.208 2022 127.0.0.1 22
pwnat on A теперь слушает tcp://127.0.0.1:3022.
pwnat on A отправляет пакет с превышенным временем ICMP на 104.16.111.208, чья полезная нагрузка соответствует исходящим эхо-запросам ICMP, поступающим от NAT B. NAT B видит, что полезная нагрузка совпадает с исходящими эхо-запросами ICMP, и пересылает пакет с превышенным временем ICMP на B. Обратите внимание, что заголовок IP для пакета превышения времени ICMP содержит IP-адрес NAT A, 151.101.193.69, в качестве адреса источника.
pwnat на B отправляет пакет UDP на udp://151.101.193.69:2022 с портом источника 2022. NAT B добавляет запись в свою таблицу, поэтому в будущем он будет пересылать любые пакеты UDP, которые он получает от udp://151.101.193.69:2022 по адресу udp://104.16.111.208:2022, по адресу udp://192.168.2.10:2022 , Обратите внимание, что многие NAT назначают другой порт на внешнем интерфейсе. Если это так, pwnat не работает.
pwnat на A отправляет UDP-пакет на адрес udp://104.16.111.208:2022 с портом источника 2022. NAT A добавляет запись в свою таблицу, поэтому в будущем он будет пересылать все UDP-пакеты, которые он получает от udp://104.16.111.208:2022 по адресу udp://151.101.193.69:2022, по адресу udp://192.168.1.10:2022 ,
NAT A получает пакет UDP, который отправил B, сопоставляет его в своей таблице и пересылает его в A. NAT B принимает пакет UDP, который отправил A, сопоставляет его в своей таблице и пересылает его в B. A и B теперь могут связываться свободно по UDP.
A$ ssh -p 3022 127.0.0.1
pwnat на A, который прослушивает tcp://127.0.0.1:3022, принимает соединение от ssh. pwnat на A отправляет запрос на pwnat на B (через UDP), чтобы открыть туннель для tcp://127.0.0.1:22. Поскольку это было указано как разрешенная пара хост / порт, когда pwnat на B был запущен, он устанавливает соединение. Туннель завершен:
ssh on A --[tcp]--> pwnat on A --[udp]--> pwnat on B --[tcp]--> sshd on B
Если в pwnat нет ошибок, то с точки зрения безопасности это ничем не отличается от показа sshd миру на сервере, который не находится за NAT. Тем не менее, просматривая исходный код, pwnat кажется взломанным вместе, и я бы не стал полагаться на его безопасность. В худшем случае будет выполнение произвольного кода на A и B от имени пользователя, который запускает pwnat.