Возникла необходимость обеспечения возможности просмотра IPTV сразу на нескольких устройствах в домашней сети. Реализации данной схемы мешало то, что полученный от провайдера модем имел два раздельных порта для данных и для IPTV. Простейшим решением было бы закорачивание IPTV-порта в домашний коммутатор, но такая схема нарушает принципы построения безопасных систем и сулит появление паразитного трафика. В связи с этим было решено организовать перенаправление IPTV-трафика через локальный шлюз, на котором используется пакетный фильтр PF и IGMP-прокси.1. Включаем поддержку переброса между сетевыми интерфейсами мультикаст трафика, для OpenBSD:
echo "multicast_router=YES" >> /etc/rc.conf.local
перезагружаем систему.
Активируем перенаправление мультисаст трафика:
sysctl net.inet.ip.mforwarding=1
в /etc/sysctl.conf сохраняем настройку "net.inet.ip.mforwarding=1".
2. Устанавливаем пакет net/igmpproxy с реализацией igmp-прокси:
pkg_add igmpproxy
Отображаем свои сетевые настройки в файле конфигурации /etc/igmpproxy.conf:
quickleave
altnet 0.0.0.0/0 # принимаем igmp-трафик из всех подсетей
phyint vr2 upstream ratelimit 0 threshold 1
phyint vr0 downstream ratelimit 0 threshold 1
phyint pppoe0 disabled
Добавляем запуск igmpproxy в /etc/rc.local, чтобы прокси запустился после перезагрузки.
3. Настраиваем параметры внешнего сетевого интерфейса, через который приходит IPTV-поток. Для работы igmpproxy на интерфейсе должен быть IP-адрес, для получения которого обычно можно использовать DHCP или назначить вручную (бывают случаи привязки IP к MAC-адресу телеприставки, что потребует подмены MAC-адреса на сетевом интерфейсе шлюза).
4. Настраиваем правила для прохождения IGMP-трафика и multicast-потока в пакетном фильтре PF (в нашем случае - это UDP трафик на 5002 порт). Основной проблемой, возникающей в процессе настройки, является то, что в IGMP пакетах используется опция протокола IP "Router Alert", которая по умолчанию вычищается из пакетов при использовании PF (для отключения чистки расширенных опций необходимо использовать параметр allow-opts). В pf.conf добавляем примерно следующее:
LAN = "vr0"
IPTV = "vr2"
block on $IPTV
pass in on $IPTV inet proto udp from any to any port 5002
pass on {$LAN, $IPTV} proto igmp allow-opts
URL: http://undeadly.org/cgi?action=article&sid=20110222002946
Обсуждается: http://www.opennet.dev/tips/info/2538.shtml