В экспериментальных целях была проверена возможность использования ncat для проброса порта за NAT, причём соединение устанавливается со стороны устройства за NATом. Понятно, что у этого решения есть ограничения, да и вообще как-то противоестественно, но тем не менее вот.

В этой схеме используются три хоста:

  1. SERVER - машина с "белым" IP
  2. CLIENT - машина за NAT
  3. 10.0.0.1 - машина внутри NAT, к которой пробрасывается соединение. Естественно, это может быть и сам CLIENT

Процедура довольно проста:

SERVER$ mkfifo exchange
SERVER$ ncat -lkvp 4444 <exchange |ncat -lkvp 4545 >exchange

CLIENT$ ncat SERVER 4444 -e "/usr/bin/ncat 10.0.0.1 25"

Этими командами  мы:

  1. Создаём FIFO очередь для обмена данными
  2. Запускаем ncat в режиме прослушивания порта 4444 с выводом расширенной информации (v можно опустить), результат передаём через PIPE в другой netcat, прослушивающий порт 4545. Параметр -k позволит подключаться повторно, в противном случае после отключения клиента всё нужно будет делать сначала.
  3. Подключаемся к SERVER на порт 4444, передавая туда команду запуска ещё одного ncat, который в свою очередь и производить переключение к нужному нами порту.

Таким образом мы получаем возможность на SERVER подключится к самому себе на порт 4545, что будет переброшено за NAT и уже CLIENT установит соединение с 10.0.0.1 "изнутри" сети.

SERVER$ telnet localhost 4545
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 [CLIENT_SIDE_SMTP_SERVER] ESMTP Sendmail 8.15.2/8.14.2; Tue, 26 Feb 2019 17:33:55 +0400