В экспериментальных целях была проверена возможность использования ncat для проброса порта за NAT, причём соединение устанавливается со стороны устройства за NATом. Понятно, что у этого решения есть ограничения, да и вообще как-то противоестественно, но тем не менее вот.
В этой схеме используются три хоста:
- SERVER - машина с "белым" IP
- CLIENT - машина за NAT
- 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"
Этими командами мы:
- Создаём FIFO очередь для обмена данными
- Запускаем ncat в режиме прослушивания порта 4444 с выводом расширенной информации (v можно опустить), результат передаём через PIPE в другой netcat, прослушивающий порт 4545. Параметр -k позволит подключаться повторно, в противном случае после отключения клиента всё нужно будет делать сначала.
- Подключаемся к 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