Пробрасываем порты, используя portfwd

portfwdПроброс портов можно сделать через технологии 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. Но я смею вас уверить, что не все можно решить через стандартные функции. По отзывам прошу в камменты..

Запись опубликована в рубрике Программы с метками , , , , . Добавьте в закладки постоянную ссылку.

4 комментариев Пробрасываем порты, используя portfwd

  1. Александр говорит:

    Спасибо огромное. Работает в связке с pf, а то пол дня убил после перехода на FreeBSD 9.0, не работает rdr и хоть убейся, на 8 фряхе все работало, у тут нивкакую не завел…

  2. Георгий говорит:

    А я использую rinetd – удобная вещь, конфиги простые.

  3. Klim говорит:

    Спасибо помогло прокинуть UDP.
    Остался один вопрос как прокинуть группу портов 10000-20000
    Спасибо

    • mik говорит:

      в документации к версии 0.29 сказано
      -- Port ranges cannot be forwarded. Ports must be specified in
      a one-by-one basis

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *