#linux #sockets #networking
#linux #сокеты #сеть
Вопрос:
У меня есть 2 системы на базе Linux — клиент с 2 интерфейсами (1 локальная сеть, 1 модем) и сервер.
Я открываю 2 UDP-сокета и использую setsockopt с SO_BINDTODEVICE для привязки каждого сокета к его интерфейсу.
Затем я отправляю сообщение от клиента к серверу через каждый из этих сокетов.
Оба они достигают сервера. Серверный сокет считывает их и отправляет ответ на каждый из них.
Затем я пытаюсь прочитать ответ сервера на клиенте.
НО есть только 1 ответ.
Также, если я запускаю tcpdump, я вижу, что оба ответа получены на их соответствующих интерфейсах, на том же порту, который они покинули. Однако только один из них достигает сокета. Другой потерян?
«Потерянный» пакет не является случайным, это пакет «не» по умолчанию. Если моя таблица маршрутизации пуста, модемная потеряна. Если я добавлю маршрут к IP-адресу сервера из интерфейса модема, потерянным пакетом будет пакет локальной сети.
Тем не менее, они всегда достигают сервера, всегда возвращаются обратно, всегда отображаются в tcpdump, но 1 никогда не достигает сокета. Как это может быть?
Комментарии:
1. нам нужно было бы посмотреть, как вы настроили свою маршрутизацию.
Ответ №1:
Существует параметр конфигурации сети 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