В статье будет рассказаны разные методы проброса порта во внутреннюю сеть.
Пример: пробрасывает порт 80 на сервере 2.2.2.2 на порт 8080 на сервере 10.10.10.10 (кроме примера для openssh)
1) redir (находится в портах)
Port: redir-2.2.1_2
Path: /usr/ports/net/redir
Info: A tcp connection redirection utility
Maint: araujo@FreeBSD.org
B-deps:
R-deps:
WWW: http://sammy.net/~sammy/hacks/
Установка достаточно простая.
Достаточно лёгкая утилита с большими возможностями, но ПОДМЕНЯЕТ SRC-ADDRESS. Запускается как приложение и висит не как демон, а как обычный процесс (обязательно в фоне):
#redir --lport=80 --laddr=2.2.2.2 --cport=8080 --caddr=10.10.10.10 &
Остальные параметры можно посмотреть в справочном руководстве.
К недостаткам можно отнести тот факт, что при больших нагрузках часто падает, поэтому нужно время от времени проверять, запущен ли.
2) rinetd (находится в портах)
Port: rinetd-0.62_3
Path: /usr/ports/net/rinetd
Info: A simple TCP port redirector
Maint: garga@FreeBSD.org
B-deps:
R-deps:
WWW:
Так же небольшая утилитка. Чем-то похожа на предыдущую, но работает уже как демон. Для запуска используется конфигурационный файл, в котором собственно описываются пробросы. Имя файла /usr/local/etc/rinetd.conf. И так, пишем пробросы:
2.2.2.2 80 10.10.10.10 8080
К недостаткам можно отнести тот факт, что при пробросе порта будет светиться IP-адрес сервера, на котором осуществляется проброс, а не того клиента, который подключается к проброшенному порту. То есть, тоже ПОДМЕНЯЕТ SRC-ADDRESS При больших нагрузках может подвисать и немного завешивать систему.
3) bounce (находится в портах)
Port: bounce-1.0_8
Path: /usr/ports/net/bounce
Info: Bounce TCP connections to another machine/port
Maint: matt@efs.org
B-deps:
R-deps:
WWW: http://www.iagora.com/~espel/hacks.html
Аналогична предыдущим. Недостатки – ПОДМЕНЯЕТ SRC-ADDRESS
4) ssh
OpenSSH поддерживает возможность создания туннеля для пропуска соединения по другому протоколу через защищенную сессию.
Следующая команда указывает ssh(1) создать туннель для telnet:
% ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
Команда ssh используется со следующими параметрами:
-2
Указывает ssh использовать версию 2 протокола (не используйте этот параметр, если работаете со старыми SSH серверами).
-N
Означает использование в не-командном режиме, только для туннелирования. Если этот параметр опущен, ssh запустит обычную сессию.
-f
Указывает ssh запускаться в фоновом режиме.
-L
Означает локальный туннель в стиле localport:remotehost:remoteport.
user@foo.example.com – Удаленный сервер SSH.
Пример:
$ ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
user@mailserver.example.com's password: *****
$ telnet localhost 5025
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailserver.example.com ESMTP
5) natd (для тех, кто использует natd)
В /etc/natd.conf добавляем такую строчку
redirect_port tcp 10.10.10.10:8080 80
После этого делаем
#/etc/rc.d/natd restart
6) kernel nat (для тех, кто использует kernel nat)
В правило nat’a добавляем
ipfw nat 123 config if $external_iface redirect_port tcp 10.10.10.10:8080 80
После этого перегружаем правила ipfw
7) ipnat (для тех, кто использует ipnat)
/etc/ipnat.conf
rdr fxp0 2.2.2.2/32 port 80 -> 10.10.10.10 port 8080 tcp
После этого перечитываем конфиг:
#/etc/rc.d/ipnat reload
8 ) pf (для тех, кто использует pfnat)
rdr on $external_iface proto tcp from any to 2.2.2.2 port 80 -> 10.10.10.10 port 8080
После этого перечитываем правила
#pfctl -f {файл с правилами}
4 коментарі “Проброс портов разными способами: rinetd, redir, natd, kernel nat, pf, ssh, ipnat”
Вы хорошо начали, но плохо закончили.
Почему-то для способов с 3-го по 8-й не указаны преимущества и недостатки по сравнению с другими, как в 1-м и во 2-м.
Спасибо, поправил 3-ий.
Опишу здесь, что бы не повторяться. Проброс портов через файерволы (5-8) НЕ ПОДМЕНЯЕТ SRC-ADDRESS. 4-ый – все преимущества и недостатки ssh.
еще не описан способ ipfw fwd. SRC-ADDRESS так-же не меняеться
Не описан, потому как он умеет работать только с локальными интерфейсами/адресами, то есть теми, которые непосредственно на этом сервере. К примеру нельзя через fwd пробросить пакет с сервера А на сервер Б. Кстати, на pf’e это можно сделать.