Site Tools


software:freebsd:igmpproxy_on_netgraph

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
software:freebsd:igmpproxy_on_netgraph [2015/05/15 15:02]
– [История] 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.\\ 
-[[http://www.netlab.linkpc.net/download/software/FreeBSD/mcastbridge/mcastbr2.sh|mcastbr2.sh]] 
- 
-Обсуждения:\\ 
-[[http://lists.freebsd.org/pipermail/freebsd-net/2011-December/030643.html|FreeBSD maillist]]\\ 
-[[http://www.opennet.ru/tips/2649_multicast_proxy_igmp_freebsd_netgraph.shtml|На OpenNet]]\\ 
- 
- 
-===== Использование ===== 
-Создать мост между 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> 
- 
- 
-===== Принцип работы ===== 
-{{:ru:software:freebsd:ng_bpf_bridge.png|}}\\ 
-**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 у меня работать отказались: PF по умолчанию убивает все пакеты с IP опциями в заголовке (IGMP они нужны для работы) и поэтому добавлять специально правило: 
-<code>pass quick proto igmp from any to 224.0.0.0/4 allow-opts</code> 
-а я этого не сделал.\\ 
-После нескольких часов проб, чтения и новых проб я решил не заниматься ремонтом ядра и этих приложений, а просто выборочно сбриджевать два сетевых интерфейса:\\ 
-  * **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** - для режима когда мультикаст/игмп трафик попадает в сетевой стёк. 
- 
- 
- 
-===== 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