Проброс портов можно сделать через технологии NAT (Network Address Translation) используя средства самой ОС, а также с помощью специальных программ. Вот такой программой и является portfwd. Эта маленькая и простая программа позволит вам без особого труда направить нужный вам порт в любое место и на любой порт вашей сети. Пробрасываются только tcp и udp соединения. Можно устраивать каскадные пробросы, когда один portfwd пробрасывает порт на другой компьютер, где уже другой portfwd отправит ваш пакет конечному адресату. Таким способом можно проходить двойной NAT.
Сама программа давненько не обновлялась, но ее можно установить из репозитариев или портов всех современных дистрибутивов. Исходники программы брать на сайте проекта
После установки, находим или создаем новый конфигурационный файл portfwd.cfg такого содержания. Файл можно сохранить в папке /usr/local/etc
user root
group root
listen-on 192.168.0.1
tcp /* TCP connections */
{
/*
* Слушаем порт 8282 на интерфейсе 192.168.0.1 и пробрасываем его
* на компьютер с ip 192.168.0.22 на порт 3389
* Также пробрасываем порт 8181 на 192.168.0.22 на порт 8181
*/
8282 { => 192.168.0.22:3389 };
8181 { => 192.168.0.22:8181 }
}
udp /* UDP packets */
{
/*
* 53 udp порт на 192.168.0.1 пробрасываем на
* 192.168.1.1 на 53 порт
*/
53 { => 192.168.1.1:53 }
}
*/ Можно указывать слушать на другом интерфейсе
*/
*/ listen-on 10.35.120.147
tcp
{
80 { => 10.32.0.111:80}
}
*/
Конфиг файла достаточно прост, немножко поясню про синтаксис.
- Заключенные символы между знаками */ и */ являются комментариями
- Обратите внимание на пользователя, а особенно группу от которого запускается программа, например в BSD системах нет группы root, вследтвие чего portfwd не запустится
- при перечислении нескольких портов, порты разделяются “;“, но в конце последнего порта “;” уже не ставится
- можно прокидывать диапазоны портов
- при указании порта не забываем открыть этот порт на самом компьютере, где стоит portfwd, а также на удаленном компьютере, куда пробрасываем порт
После создания или изменения конфигурации пробуем запустить демон portfwd.
/usr/local/sbin/portfwd -c /usr/local/etc/portfwd.cfg
Проверяем запустился или нет. Если нет, то лог ошибок смотрим в /var/log/messages.
mik@m1k:~$ ps aux | grep portfwd
root 3087 0.0 0.0 3012 372 ? Ss Jul13 0:00 /usr/local/sbin/portfwd -c /usr/local/etc/portfwd.cfg
root 3091 0.0 0.0 3012 352 ? S Jul13 0:00 /usr/local/sbin/portfwd -c /usr/local/etc/portfwd.cfg
root 3092 0.0 0.0 3012 204 ? S Jul13 0:00 /usr/local/sbin/portfwd -c /usr/local/etc/portfwd.cfg
mik 15860 0.0 0.0 2468 820 pts/4 R+ 14:15 0:00 grep portfwd
Один из вариантов для стартового скрипта в систему.
#!/bin/sh
PREFIX=/usr/local
case "$1" in
start)
${PREFIX}/sbin/portfwd -c /usr/local/etc/portfwd.cfg
;;
stop)
killall portfwd
;;
*)
echo "Usage: `basename $0` {start|stop}" >&2
;;
esac
exit 0
ps: Опытные пользователи возможно скажут, что все что тут я рассказал баловство и реализуется через встроенные решения NAT. Но я смею вас уверить, что не все можно решить через стандартные функции. По отзывам прошу в камменты..
Спасибо огромное. Работает в связке с pf, а то пол дня убил после перехода на FreeBSD 9.0, не работает rdr и хоть убейся, на 8 фряхе все работало, у тут нивкакую не завел…
А я использую rinetd – удобная вещь, конфиги простые.
Спасибо помогло прокинуть UDP.
Остался один вопрос как прокинуть группу портов 10000-20000
Спасибо
в документации к версии 0.29 сказано
-- Port ranges cannot be forwarded. Ports must be specified in
a one-by-one basis