Проброс порта во FreeBSD с помощью netcat и inetd

Довольно распространенная задача. У вас имеется сервер с внешним 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).

Похожие статьи

Leave a Reply

Your email address will not be published. Required fields are marked *