Site Tools


software:freebsd:igmpproxy_on_netgraph

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
software:freebsd:igmpproxy_on_netgraph [2015/05/14 10:07]
– создано root
software:freebsd:igmpproxy_on_netgraph [2022/02/04 18:32]
– removed - external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
-====== Замена igmpproxy на netgraph ====== 
  
-Скрипт собирающий netgraph мост для мультикаст трафика (IGMP, UDP) между двумя сетевыми интерфейсами предназначен для замены igmpproxy/mrouted.\\ 
- 
-[url=http://www.netlab.linkpc.net/download/software/FreeBSD/mcastbridge/mcastbr2.sh]mcastbr2.sh[/url] 
- 
-Обсуждения:\\ 
-[url=http://lists.freebsd.org/pipermail/freebsd-net/2011-December/030643.html]FreeBSD maillist[/url] 
-[url=http://www.opennet.ru/tips/2649_multicast_proxy_igmp_freebsd_netgraph.shtml]На OpenNet[/url] 
- 
- 
-===== Использование ===== 
-Создать мост между em0 и re0, где re0 подключён к сети с мультикастом: 
-<code>mcastbr2.sh start re0 em0</code> 
-или 
-<code>mcastbr2.sh start re0 em0 enable</code> 
-если нужно чтобы трафик попадал в сетевой стёк ОС, как было до установки моста. 
- 
-Удалить мост: 
-<code>mcastbr2.sh stop re0 em0</code> 
- 
- 
-===== История ===== 
-igmpproxy и mrouted у меня работать отказались, после нескольких часов проб, чтения и новых проб я решил не заниматься ремонтом ядра и этих приложений, а просто выборочно сбриджевать два сетевых интерфейса:\\ 
- - **IGMP** на multicast адреса из локалки в сеть провайдера и обратно;\\ 
- - **UDP** на multicast адреса из сети провайдера в локалку. Броадкаст не нужен, и направляется в ядро как обычно.\\ 
- 
-Несмотря на цифру 2, по сути эта третья версия графа, получившая в результате оптимизации первых двух.\\ 
-* Первая содержала **ng_ether**, **ng_tee**, **ng_one2many**, **ng_bpf**.\\ 
-* Вторая содержала **ng_ether**, <del>ng_tee</del>, **ng_one2many**, **ng_bpf**.\\ 
-* Окончательная содержит: **ng_ether**, <del>ng_left2right,</del> <del>ng_tee,</del> **ng_bpf**.\\ 
-В первых двух версиях создавалась копия пакета, и один уходил через мост в другую сеть либо отбрасывался, а второй попадал в ядро. Поскольку ядро всё равно их дропало где то внутри и нетграф их очень много отбрасывал, ничего полезного не делая, то я решил их вообще туда не посылать и организовать так чтобы не создавать дубликатов и не уничтожать пакеты.\\ 
- * Добавлено опционально использование **ng_hub** - для режима когда мультикаст/игмп трафик попадает в сетевой стёк. 
- 
- 
- 
-**Принцип работы** 
-[img]http://netlab.linkpc.net/download/software/FreeBSD/mcastbridge/ng_bpf_bridge.png[/img] 
-**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 интерфейсах. 
- 
- 
- 
-===== PS ===== 
-Для создания аналогичного по функционалу моста, в котором будет несколько сетевых интерфейсов в разных сетях с мультикастом и несколько сетевых адаптеров в сетях куда его нужно переправить потребуется на каждый сетевой адаптер вешать по **ng_split** + **ng_one2many** и по одной **ng_one2many** с каждой стороны моста для рассылки копий мультикаста на все интерфейсы. __upper__ хуки **ng_ether** нод по прежнему будут напрямую подключатся к BPF. В случае нескольких сетей - источников мультикаста будет ещё проблема с возможным перекрытием адресных пространств, которую можно частично разрешить настроив в BPF фильтрацию по адресам. 
software/freebsd/igmpproxy_on_netgraph.txt · Last modified: 2022/02/05 05:30 by root