Как заставить сокет-соединение использовать определенный сетевой адаптер под Linux? вопрос IP-маршрута?

У меня есть несколько сетевых адаптеров, и мне нужно указать, какой адаптер использует мой сокет для исходящих соединений, чтобы я мог иметь один или несколько сокетов, привязанных к каждой сети. Я посмотрел на другие ответы на эти вопросы, но не могу заставить его работать.

Привязка розетки к IP address адаптера я хочу подключить через не работает.SO_BINDTODEVICE тоже не работает, попытался передать либо имя адаптера, либо индекс адаптера, вызов выполнен успешно, но сокет не может подключиться. Я не могу найти полный пример, который использует SO_BINDTODEVICE уточнить правильное использование.

Симптомы, использующие описанные выше методы, заключаются в том, что сервер получает соединение, но connect() происходит сбой на клиенте с кодом ошибки 2 (?). Я прочитал, что ip route необходим для того, чтобы ответные пакеты отправлялись через тот же адаптер, в котором они были получены, но, похоже, не могут правильно получить команды ip route

The tables Teth0 and Twlan0 have been added.  

For eth0, the IP address is 192.168.1.23, the gateway is 192.168.1.1
For wlan0, the IP address is 192.168.2.100, the gateway is 192.168.2.1

ip route add 192.168.1.1/32 dev eth0 src 192.168.1.23 table Teth0
ip route add default via 192.168.1.1 table Teth0
ip rule add from 192.168.1.23 table Teth0

ip route add 192.168.2.1/32 dev wlan0 src 192.168.2.100 table Twlan0
ip route add default via 192.168.2.1 table Twlan0
ip rule add from 192.168.2.100 table Twlan0

ip route flush cache

яm usingОткройте Embedded Linux 2.6.36 на GumStix Overo (Omap3)`.

Любые советы будут с благодарностью, так как я схожу с ума здесь;)

1 ответ

Вы пытаетесь определить два маршрута по умолчанию во внешний мир. У вас должен быть только один шлюз / маршрут по умолчанию.

Скорее всего, это то, что происходит:

  • вы используете беспроводной адаптер в качестве указанного IP-адреса исходящего соединения / источника
  • ядро проверяет, есть ли маршрут от wlan0 до места назначения
  • Поскольку у беспроводного устройства есть шлюз / маршрут по умолчанию, существует жизнеспособный маршрут, и 3way рукопожатие начинается с wlan0
  • После некоторого трафика (по-видимому, 2 Мб на вашу передачу) ядро ​​просматривает соединение и решает, что, хотя этот трафик пересекает беспроводную сеть, первый (и только соответствующий) шлюз / маршрут по умолчанию в таблице маршрутизации проходит через eth0
  • ядро начинает отправлять через eth0
  • Дальняя сторона начинает получать трафик от eth0 либо с неверным IP-адресом источника, либо не знает, как вернуть данные для IP-адреса wlan0 через сеть eth0, и игнорирует его
  • Есть несколько инструментов среднего качества для Linux, которые позаботятся об этом за вас, но это не будет работать со статическим IP-адресом, и, определенно, не с плохой таблицей маршрутизации.

    Другие вопросы по тегам