Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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