Перевод этой страницы:
ru

Инструменты пользователя

Инструменты сайта


ru:software:freebsd:igmpproxy_on_netgraph

Это старая версия документа!


Замена igmpproxy на netgraph

Скрипт собирающий netgraph мост для мультикаст трафика (IGMP, UDP) между двумя сетевыми интерфейсами предназначен для замены igmpproxy/mrouted.
mcastbr2.sh

Обсуждения:
FreeBSD maillist
На OpenNet

Использование

Создать мост между em0 и re0, где re0 подключён к сети с мультикастом:

mcastbr2.sh start re0 em0

или если нужно чтобы трафик попадал в сетевой стёк ОС, как было до установки моста:

mcastbr2.sh start re0 em0 enable

Удалить мост:

mcastbr2.sh stop re0 em0

Принцип работы


BPF настроен таким образом чтобы пропускать все без исключения пакеты с upper хуков ng_ether нод на lower хуки (пакеты от системы в сеть). Приходящие из сети пакеты с lower хуков нод проверяются в BPF, и
- если это мультикаст; - и не броадкаст; - и IGMP [или UDP в случае если пакет от адаптера подключённого к провайдеру] то такой пакет целиком пересылается на lower хук другого адаптера, минуя сетевой стёк операционной системы. Либо пакет пересылается на хук ng_hub откуда одна копия уходит на upper хук этого же адаптера, а другая на lower хук противоположного адаптера.

Тонкости

1. Пришлось включить promisc режим на обоих интерфейсах, иначе мультикаст дропается самим сетевым адаптером, это нормальное поведение.

2. Пришлось включить autosrc на интерфейсе в сети провайдера, тк у провайдера на коммутаторе настроен Port Security на пропускание только одного MAC адреса - первого изученного на порту после поднятия линка.

3. Моему провайдеру нет дела до того какой src-ip в IP приходит от меня, если бы было, то я бы попробовал гнать трафик в сторону провайдера через ng_patch ноду, которая бы заменяла src-ip на нужны, и выставляла CSUM_IP и CSUM_UDP в заголовке пакета - есть шанс что драйвер сетевого адаптера сам рассчитает эти суммы либо что оборудование провайдера проигнорирует неверную контрольную сумму в IGMP пакетах от меня. Нода также подключается обоими хуками к BPF, выход настраивается на passtrouth (пересылку всех пакетов) на lower хук ng_ether на адаптере в сети провайдера, а вход ng_patch должен быть match выходом от lower на адаптере в локальной сети. Те совсем не большая модификация графа.

4. Работает на vlan интерфейсах.

История

igmpproxy и mrouted у меня работать отказались, после нескольких часов проб, чтения и новых проб я решил не заниматься ремонтом ядра и этих приложений, а просто выборочно сбриджевать два сетевых интерфейса:
- IGMP на multicast адреса из локалки в сеть провайдера и обратно;
- UDP на multicast адреса из сети провайдера в локалку. Броадкаст не нужен, и направляется в ядро как обычно.

Несмотря на цифру 2, по сути эта третья версия графа, получившая в результате оптимизации первых двух.
* Первая содержала ng_ether, ng_tee, ng_one2many, ng_bpf.
* Вторая содержала ng_ether, ng_tee, ng_one2many, ng_bpf.
* Окончательная содержит: ng_ether, ng_left2right, ng_tee, ng_bpf.
В первых двух версиях создавалась копия пакета, и один уходил через мост в другую сеть либо отбрасывался, а второй попадал в ядро. Поскольку ядро всё равно их дропало где то внутри и нетграф их очень много отбрасывал, ничего полезного не делая, то я решил их вообще туда не посылать и организовать так чтобы не создавать дубликатов и не уничтожать пакеты.
* Добавлено опционально использование ng_hub - для режима когда мультикаст/игмп трафик попадает в сетевой стёк.

PS

Для создания аналогичного по функционалу моста, в котором будет несколько сетевых интерфейсов в разных сетях с мультикастом и несколько сетевых адаптеров в сетях куда его нужно переправить потребуется на каждый сетевой адаптер вешать по ng_split + ng_one2many и по одной ng_one2many с каждой стороны моста для рассылки копий мультикаста на все интерфейсы. upper хуки ng_ether нод по прежнему будут напрямую подключатся к BPF. В случае нескольких сетей - источников мультикаста будет ещё проблема с возможным перекрытием адресных пространств, которую можно частично разрешить настроив в BPF фильтрацию по адресам.

ru/software/freebsd/igmpproxy_on_netgraph.1431598669.txt.gz · Последние изменения: 2015/05/14 10:17 — root