Как получить многоадресные данные на нестандартном интерфейсе многосетевого сервера - PullRequest
8 голосов
/ 04 апреля 2011

У меня есть сервер linux с двумя сетевыми картами (eth0 и eth1), и я установил eth0 по умолчанию в «ip route». Теперь я хотел бы получать многоадресные пакеты на eth1. Я добавил «224.0.20.0/24 dev eth1 proto static link scope» в таблицу маршрутизации и подключаюсь следующим образом:

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);

// port 12345, adress INADDR_ANY
bind(sock, &bind_addr, sizeof(bind_addr));

// multicast address 224.0.20.100, interface address 10.13.0.7 (=eth1)
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imreq, sizeof(imreq));

Согласно ip maddr он подключается к этой группе на правом интерфейсе, а tshark -i eth1 показывает, что я на самом деле получаю многоадресные пакеты.

Однако я не получаю никаких пакетов при вызове recvfrom(sock). Если я установлю «ip route default» на eth1 (вместо eth0), я получу пакеты через recvfrom. Это проблема с моим кодом или настройкой сети, и как это правильно сделать?

(обновление) решение: caf намекнул, что this может быть той же проблемой; действительно: после выполнения echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter теперь я могу получать многоадресные пакеты!

Ответы [ 3 ]

4 голосов
/ 23 августа 2011
Ответ

caf о том, что это дубликат получения многоадресной рассылки на сервере с несколькими интерфейсами (linux) , ответил на это! (И я публикую это как ответ для ясности.) А именно, echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter решает мою проблему.

2 голосов
/ 30 октября 2015

Правильно, при условии, что у вас было два сетевых адаптера с gw по умолчанию только на одном из них.

Многоадресная рассылка использует одноадресные маршруты для определения пути к источнику.Это означает, что если многоадресный путь отличается от одноадресного, то многоадресный путь завершится.Это механизм предотвращения петель, называемый проверкой RPF.

В этом случае приложение, связанное с NIC, фактически было вынуждено присоединиться к IGMP, когда маршруты одноадресной передачи были изучены от другого NIC со шлюзом по умолчанию.Так что проверка провалилась.Таким образом, нет данных.

Вам не нужно добавлять статические маршруты.Он должен работать только при изменении значения rp_filter на 0.

2 голосов
/ 12 апреля 2011

Попробуйте добавить маску сети и указать 10.13.0.7 в качестве шлюза в записи таблицы маршрутизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...