main

Окончательное решение iptv'шного вопроса

В очередной раз отвалился iptv в результате шаманства, поэтому решил обобщить всё известное об этой проблеме, чтоб не мучить гугл зазря и не терять времени. Схема сети:

[network] ---> [router] -> [vladlink]
  |               |  ^- внешний адрес 5.XX.XX.XX
  `--> [server] --'  <- "серый" адрес 10.XX.XX.XX

Оба интерфейса настраиваются по dhcp.

Описание симптомов

В логах udpxy:

read_buf: socket time-out on read

tcpdump показывает, что igmp запросы на присоединение к группе уходят в нужный интерфейс, а вот обратно - не приходит ничего.

Правильные настройки

Маршруты (лишнее вырезано). Последний добавлен руками, без него ничего не работает.

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.1    0.0.0.0         UG    0      0        0 br0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 br0
10.14.140.0     0.0.0.0         255.255.254.0   U     0      0        0 eth1
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth1

Настройки dhcp-клиента для интерфейса. Дефолтный гейт и dns'ы у меня показывает в другое место, поэтому '-G' и '-R'

/sbin/dhcpcd-bin -h <...> -Y -N -R -G -L eth1

Для меня эти настройки влияния на работу не оказывают. Работает даже в такой конфигурации как ниже:

net.ipv6.conf.eth1.mc_forwarding = 0
net.ipv4.conf.eth1.rp_filter = 1

И напротив, заработало только после того, как в первой опции выставил 2. Остальные должны влиять только на количество одновременных подключений.

net.ipv4.conf.all.force_igmp_version = 2
net.ipv4.igmp_max_memberships = 20
net.ipv4.igmp_max_msf = 10

iptables

Настройки фаервола для конкретно этого интерфейса, всё остальное поскипано:

# создаём отдельную цепочку и заворачиваем в неё весь трафик на нужном интерфейсе
iptables -N VLADLINK
#
# обратите внимание на '-g'! с таким перенаправлением трафик дальше цепочки VLADLINK
# в таблице filter не пойдёт. Или он будет там принят, или будет отброшен по политике
iptables -A INPUT -i eth1 -g VLADLINK
#
# общие правила
iptables -A VLADLINK -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A VLADLINK -p udp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A VLADLINK -p icmp -m limit --limit 5/sec -j ACCEPT
#
# правила для работы самого iptv
iptables -A VLADLINK -m addrtype --dst-type MULTICAST --limit-iface-in -j ACCEPT
iptables -A VLADLINK -s 10.0.0.0/8 -p udp -m udp --dport 1234 -j ACCEPT
#
# блокируем заведомо неотносящиеся к нам соединения (вроде броадкастов на udp:67, *:139)
# длинная портянка, поэтому не привожу
#
# смотрим (dmesg) что мы пропустили/забыли
iptables -A VLADLINK -m limit --limit 1/sec -j LOG

runit

Настройки сервиса для runit (по желанию, в пакете есть для sysvinit)

$ mkdir /etc/service/udpxy
$ cd /etc/service/udpxy
$ cat >> run
#!/bin/sh
set -e

exec 2>&1
sleep 5
exec chpst -unobody:adm /usr/bin/udpxy -p 4022 -a 0.0.0.0 -m eth1 -M 60 -c 5
^D
$
$ chmod +x run