Исходные данные - шлюз на FreeBSD с сетевым экраном на PF
Задача - обеспечить автоматический проброс портов при помощи UPnP и NAT-PMP
Реализация:
Начнем с установки miniupnp
# cd /usr/ports/net/miniupnpd
# make install clean
# rehash
Затем настраиваем конфиг демона
# cd /usr/local/etc
# cp miniupnp.conf.samble
# ee miniupnp.conf
# WAN-интерфейс, у меня это ng0, это vpn-соединение с провайдером
# Грубо говоря, указываем тот, где белый IP =)
ext_ifname=ng0
# Можно указать конкретный IP адрес для
# WAN-интерфейса, если их несколько
#ext_ip=
# На каком IP будет слушать демон
# 10.5.0.1 - это моя домашняя сетка
#listening_ip= 192.168.0.61
listening_ip=10.5.0.1
# Порт для HTTP ставим автоматом, 0.
port=0
# path to the unix socket used to communicate with MiniSSDPd
# If running, MiniSSDPd will manage M-SEARCH answering.
# default is /var/run/minissdpd.sock
#minissdpdsocket=/var/run/minissdpd.sock
# Разрешаем поддержку NAT-PMP
enable_natpmp=yes
# lease file location
#lease_file=/var/log/upnp.leases
# bitrates reported by daemon in bits per second
bitrate_up=131072
bitrate_down=524288
# "secure" mode : when enabled, UPnP client are allowed to add mappings only
# to their IP. (default is yes)
#secure_mode=yes
# default presentation url is http address on port 80
#presentation_url=
# report system uptime instead of daemon uptime
system_uptime=yes
# unused rules cleaning.
# never remove any rule before this threshold for the number
# of redirections is exceeded. default to 20
#clean_ruleset_threshold=10
# clean process work interval in seconds. default to 0 (disabled).
# a 600 seconds (10 minutes) interval makes sense
clean_ruleset_interval=600
# notify interval in seconds default is 30 seconds.
#notify_interval=240
# log packets in pf
#packet_log=no
# ALTQ queue in pf
# filter rules must be used for this to be used.
# compile with PF_ENABLE_FILTER_RULES (see config.h file)
#queue=queue_name1
# uuid : generated by the install a new one can be created with
# uuidgen
uuid=29f628ec-2cf7-11df-a746-00105a477213
# UPnP permission rules
# (allow|deny) (external port range) ip/mask (internal port range)
# A port range is <min port>-<max port> or <port> if there is only
# one port in the range.
# ip/mask format must be nn.nn.nn.nn/nn
# Разрешаем доступ с домашней локалки
allow 1024-65535 10.5.0.0/24 1024-65535
#allow 1024-65535 10.0.2.0/24 1024-65535
# Запрещаем все остальное
deny 0-65535 0.0.0.0/0 0-65535
Есно, что это минимальный конфиг.
Теперь добавляем якоря в конфиг PF
Помним про очередность правил в конфиге - макросы/опции, нормализация, трансляция (NAT), перенаправление, фильтрация.
Сразу после правил NAT
nat on {$ext_if} from $int_if:network to any -> {$ext_if}
nat on {$vpn_if} from $int_if:network to any -> {$vpn_if}
добавляем якорь на редирект портов
## ... ...
rdr-anchor "miniupnpd"
## ... ...
Ниже, где начинаются правила фильтрации трафика, добавляем такой якорь
## ... ...
anchor "miniupnpd"
## ... ...
Сохраняем и проверяем конфиг
Если ошибок нет, применяем новый конфиг
Теперь добавляем в /etc/rc.conf такие строки
miniupnpd_enable="YES" # стартуем демон
miniupnpd_config="/usr/local/etc/miniupnpd.conf" # путь к конфигу
miniupnpd_flags="" # флаги демона
Стартуем демон в тестовом режиме, выход с него стандартный, по Ctrl+C
Будет примерно такое
miniupnpd -d
miniupnpd[53695]: HTTP listening on port 52377
miniupnpd[53695]: Listening for NAT-PMP traffic on port 5351
miniupnpd[53695]: set nextnatpmptoclean_timestamp to 80151
miniupnpd[53695]: HTTP connection from 10.5.0.5:4138
miniupnpd[53695]: HTTP REQUEST : GET /rootDesc.xml (HTTP/1.1)
miniupnpd[53695]: HTTP connection from 10.5.0.3:2721
Если все ок, и демон ожил, можно убить демон и стартовать его как положено
# /usr/local/etc/rc.d/miniupnpd start
Работу miniupnpd можно проверить/увидеть вот так
утянул с
http://forum.inmart.ua/showthread.php?t=12383