среда, 16 сентября 2009 г.

Установка службы UPnP на шлюз OpenBSD

Исходные данные о сетевой инфраструктуре

Небольшая внутриквартирная домашняя сеть. Шлюз в сеть интернет организован с помощью операционной системы OpenBSD, развёрнутой на оборудовании 9 летней давности. Подключение к интернету осуществляется через Ethernet, провайдер по dhcp выдаёт реальный ip адрес.

Цель работ

Приблизить построенный шлюз к коробочным решениям.
Обеспечить автоматический проброс tcp и udp портов с внешнего ip адреса на внутренние адреса.

Способ достижения цели

На шлюзе поднимается служба, которая обслуживает запросы клиентского программного обеспечения (utorret, Miranda, Opera, ...) по протоколам UPnP и NAT-PMP. Служба автоматически формирует правило rdr для пакетного фильтра pf OpenBSD.

Решение

Используем демон miniupnpd, реализующий в системах *nix службу UPnP и NAT-PMP.
Так как в бинарных пакетах и портах эта программа отсутствует, то будем собирать из исходных текстов.

  1. Скачиваем и распаковываем последний дистрибутив исходных кодов с сайта автора. Поместим распакованный дистрибутив в локальный репозиторий исходных кодов, т.к. он нам может понадобиться при обновлении системы.

    $ cd /tmp
    $ wget http://miniupnp.free.fr/files/download.php?file=miniupnpd-20090904.tar.gz
    $ tar xzf miniupnpd-20090904.tar.gz
    $ mv miniupnpd-20090904/ /usr/src/miniupnpd

  2. Устанавливаем из коллекции бинарных пакетов набор утилит для генерации uuid


    $ sudo pkg_add -vi uuid


  3. Запускаем скрипт генерации файла настроек

    $ cd /usr/src/miniupnpd
    $ ./genconfig.sh

    Раcкомментируем строку #define PF_ENABLE_FILTER_RULES в конфигурационном файле config.h, разрешая тем самым генерацию дополнительных правил в пакетном фильтре (понадобятся для QoS или дополнительной фильтрации).



  4. Компилируем и устанавливаем службу в систему

    $ make
    $ sudo make install



  5. Служба установилась в систему. Конфигурация службы осуществляется через файл настроек /etc/miniupnpd.conf
    Вносим изменения в соответствии с окружением системы:

    ext_ifname=vr0
    listening_ip=192.168.0.1/24
    listening_ip=192.168.1.1/24

    enable_natpmp=yes
    enable_upnp=yes

    bitrate_up=3000000
    bitrate_down=3000000

    # Очередь QoS, в которую помещаем пакеты для пробрасываемых соединений
    queue=main_torrent




  6. Добавляем новые цепочки правил в pf.conf (сразу же после аналогичных строк)


    rdr-anchor "miniupnpd"
    anchor "miniupnpd"


  7. Тестируем конфигурацию пакетного фильтра:


    $ sudo pfctl -nf /etc/pf.conf


    ..., и если без ошибок, то применяем правила


    $ sudo pfctl -f /etc/pf.conf



  8. Тестируем службу в отладочном режиме:


    $ sudo miniupnpd -d


    Клиенты должны обратиться к серверу и в списке правил должны появиться подобные записи:


    $ sudo pfctl -a miniupnpd -sr
    pass in quick on vr0 inet proto tcp from any to any port = 29605 flags S/SA keep state label "uTorrent (TCP)" queue main_torrent
    pass in quick on vr0 inet proto udp from any to any port = 29605 flags S/SA keep state label "uTorrent (UDP)" queue main_torrent

    $ sudo pfctl -a miniupnpd -sn
    rdr on vr0 inet proto tcp from any to any port = 29605 label "uTorrent (TCP)" -> 192.168.0.70 port 29605
    rdr on vr0 inet proto udp from any to any port = 29605 label "uTorrent (UDP)" -> 192.168.0.70 port 29605



  9. Если всё нормально и клиент получают адреса, то добавляем службу в автозапуск. Добавляем следующие параметры вызова (на будущее) в конец файла /etc/rc.conf.local


    miniupnpd_flags="" #assign NO to disable service, for normal use ""


    Настраиваем локальный файл загрузки


    if [ X"${miniupnpd_flags}" != X"NO" -a -x /sbin/miniupnpd ]; then
    echo -n ' miniupnpd'; /sbin/miniupnpd ${miniupnpd_flags}
    fi



Заключение

Итак, мы настроили на домашнем маршрутизаторе службу UPnP и позволили внутренним компьютерам автоматически публиковаться в интернете.

В версии 4.7 OpenBSD должны произойти существенные изменения в синтаксисе правил nat и rdr. Эти изменения облегчат работу администраторам OpenBSD и позволят строить более гибкие списки правил для пакетного фильтра. Ну что же, поживём — увидим.


Список литературы

Комментариев нет:

Отправить комментарий