отправлять / получать данные через несколько интерфейсов - PullRequest
0 голосов
/ 11 июня 2011

У меня есть 2 системы на основе Linux - клиент с 2 интерфейсами (1 LAN, 1 модем) и сервер.
Я открываю 2 сокета UDP и использую setsockopt с SO_BINDTODEVICE, чтобы привязать каждый сокет к его интерфейсу.
Затем я отправляю сообщение от клиента на сервер через каждый из этих сокетов.
Они оба достигают сервера. Серверный сокет читает их и отправляет ответ каждому из них.
Затем я пытаюсь прочитать ответ сервера на клиенте.
НО, есть только 1 ответ.

Также, если я запускаю tcpdump, я вижу, что оба ответа получены на их соответствующих интерфейсах, на том же порте, который они оставили. Все же только один из них достигает сокета. Другой потерян?

«Потерянный» пакет не является случайным, это «не» по умолчанию. Если моя таблица маршрутизации пуста, модем потерян. Если я добавлю маршрут к ip сервера из интерфейса модема, потерянный пакет будет локальным.

Тем не менее, они всегда достигают сервера, всегда возвращаются назад, всегда в tcpdump, но 1 никогда не достигает сокета. Как это может быть?

1 Ответ

2 голосов
/ 12 июня 2011

Существует параметр конфигурации сети ipv4, который называется rp_filter (фильтр проверки обратного пути).По сути, если ответ на пакет не выходит из интерфейса, в который поступил этот пакет, то это фиктивный пакет, и его следует игнорировать.Вот почему, хотя я видел пакет в tcpdump, он так и не достиг сокета.Отключение это сделало свое дело.

sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.ppp0.rp_filter=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...