Довольно распространенная задача. У вас имеется сервер с внешним IP-адресом, а нужно получить доступ к порту внутреннего хоста. Будем решать эту задачу с помощью netcat в связке с суперсервером inetd.
Для начала посмотрим, чего мы можем достичь с помощью nc. Предположим, что нужно достучаться до внутреннего хоста 192.168.0.10, порт HTTP (80):
srv# nc 192.168.0.10 80 GET / HTTP/1.0 400 Bad Request Server: httpd Date: Thu, 01 Jan 1970 15:13:14 GMT Content-Type: text/html Connection: close <HTML><HEAD><TITLE>400 Bad Request</TITLE></HEAD> <BODY BGCOLOR="#cc9999"><H4>400 Bad Request</H4> Can't parse request. </BODY></HTML>
Хорошо, ход запрос и Bad Request, но зато мы видим, что сервис действительно отвечает по требуемому адресу. Итак, с помощью nc мы можем посылать запросы и принимать ответ. Теперь если настроить, чтобы ввод/вывод этой программы обрабатывался суперсервером inetd, то мы получим полноценный проброс порта. Для этого добавляем следующую строку в файл /etc/inetd.conf:
8080 stream tcp nowait nobody /usr/bin/nc /usr/bin/nc 192.168.0.10 80
В этом случае при подключении к любому адресу сервера на порт 8080 будет происходить упомянутый нами выше вызов программы nc, и ввод/вывод его будет идти не через консоль, а через интернет-сокет.
Если inetd по каким-то причинам у вас еще не включен, то включаем его в /etc/rc.conf
inetd_enable="YES"
и запускаем:
srv# /etc/rc.d/inetd start Starting inetd.
Разумеется, если у вас файрволл настроен как Default Deny, то нужно разрешить пакеты на порт 8080 внешнего интерфейса, правило для вот выдержка из /etc/pf.conf:
pass quick on $em0 proto tcp from $AdminIP to $ServerIP port 8080
Работа над ошибками
И напоследок некоторые ошибки, которые могут встретиться:
cannot execute nc: No such file or directory
В этом случае путь нужно писать полностью, например /usr/bin/nc
8080/tcp: unknown service
В этом случае либо прописываем свой номер сервиса в /etc/services, либо используем один из уже имеющихся сервисов из этого же списка, например 82 (сервис называется ext).