This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
software:freebsd:igmpproxy_on_netgraph [2015/05/14 10:19] – [История] 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/ | ||
- | [[http:// | ||
- | |||
- | Обсуждения: | ||
- | [[http:// | ||
- | [[http:// | ||
- | |||
- | |||
- | ===== Использование ===== | ||
- | Создать мост между em0 и re0, где re0 подключён к сети с мультикастом: | ||
- | < | ||
- | или если нужно чтобы трафик попадал в сетевой стёк ОС, как было до установки моста: | ||
- | < | ||
- | |||
- | Удалить мост: | ||
- | < | ||
- | |||
- | |||
- | ===== Принцип работы ===== | ||
- | {{: | ||
- | **BPF** настроен таким образом чтобы пропускать все без исключения пакеты с __upper__ хуков **ng_ether** нод на __lower__ хуки (пакеты от системы в сеть). Приходящие из сети пакеты с __lower__ хуков нод проверяются в **BPF**, и\\ | ||
- | - если это мультикаст; | ||
- | - и не броадкаст; | ||
- | - и **IGMP** [или **UDP** в случае если пакет от адаптера подключённого к провайдеру] | ||
- | то такой пакет целиком пересылается на __lower__ хук другого адаптера, | ||
- | Либо пакет пересылается на хук **ng_hub** откуда одна копия уходит на __upper__ хук этого же адаптера, | ||
- | |||
- | |||
- | ==== Тонкости ==== | ||
- | 1. Пришлось включить **promisc** режим на обоих интерфейсах, | ||
- | |||
- | 2. Пришлось включить **autosrc** на интерфейсе в сети провайдера, | ||
- | |||
- | 3. Моему провайдеру нет дела до того какой src-ip в IP приходит от меня, если бы было, то я бы попробовал гнать трафик в сторону провайдера через **ng_patch** ноду, которая бы заменяла src-ip на нужны, и выставляла CSUM_IP и CSUM_UDP в заголовке пакета - есть шанс что драйвер сетевого адаптера сам рассчитает эти суммы либо что оборудование провайдера проигнорирует неверную контрольную сумму в IGMP пакетах от меня. Нода также подключается обоими хуками к BPF, выход настраивается на passtrouth (пересылку всех пакетов) на __lower__ хук __ng_ether__ на адаптере в сети провайдера, | ||
- | |||
- | 4. Работает на vlan интерфейсах. | ||
- | |||
- | |||
- | ===== История ===== | ||
- | igmpproxy и mrouted у меня работать отказались, | ||
- | * **IGMP** на multicast адреса из локалки в сеть провайдера и обратно; | ||
- | * **UDP** на multicast адреса из сети провайдера в локалку. Броадкаст не нужен, и направляется в ядро как обычно. | ||
- | |||
- | Несмотря на цифру 2, по сути эта третья версия графа, получившая в результате оптимизации первых двух.\\ | ||
- | * Первая содержала **ng_ether**, | ||
- | * Вторая содержала **ng_ether**, | ||
- | * Окончательная содержит: | ||
- | В первых двух версиях создавалась копия пакета, | ||
- | * Добавлено опционально использование **ng_hub** - для режима когда мультикаст/ | ||
- | |||
- | |||
- | |||
- | ===== PS ===== | ||
- | Для создания аналогичного по функционалу моста, в котором будет несколько сетевых интерфейсов в разных сетях с мультикастом и несколько сетевых адаптеров в сетях куда его нужно переправить потребуется на каждый сетевой адаптер вешать по **ng_split** + **ng_one2many** и по одной **ng_one2many** с каждой стороны моста для рассылки копий мультикаста на все интерфейсы. __upper__ хуки **ng_ether** нод по прежнему будут напрямую подключатся к BPF. В случае нескольких сетей - источников мультикаста будет ещё проблема с возможным перекрытием адресных пространств, |