2014-10-16 2 views
0

У меня есть два подключения на моей локальной машине: один через eth0 (имеет статический IP, пусть он будет 10.10.10.10), другой - через ppp0 (имеет динамический IP, например 10.20.30.40). Оба имеют доступ к Интернету. У меня также есть удаленный сервер (предположим, что он имеет IP 1.2.3.4), к которому я хочу подключиться с моей локальной машины таким образом, чтобы пакеты, имеющие адрес источника 10.10.10.10 (eth0), должны проходить через eth0, тогда как те, которые имеют 10.20 .30.40 (ppp0) в качестве исходного адреса должен пройти через ppp0.Правило ip, похоже, не вызывается

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

После этого я создал две таблицы маршрутов: одну для eth0 (с именем ETH) и другую для ppp0 (с именем PPP). Затем я добавил маршруты к этим таблицам следующим образом:

ip route add default dev ppp0 table PPP 
ip route add default dev eth0 table ETH 

Затем я добавил правила Ip, как следующие:

ip rule add from 10.10.10.10 lookup ETH 
ip rule add from 10.20.30.40 lookup PPP 

И это не работает. Однако, когда я использую ip rule add from all вместо того, чтобы указывать на определенный IP-адрес, он работает (конечно, пакеты проходят через только один интерфейс в этом случае). Таким образом, кажется, что правило ip не вызывается, когда я указываю IP.

Что может быть причиной такого странного поведения?

У кого-нибудь есть идеи?

ответ

0

Я нашел причину. Причиной этой проблемы является программа (написанная с использованием QT QTcpSocket :: bind()), которая связывает сокет с соответствующим интерфейсом, но не с настройками маршрутизации. Он не делает это должным образом по неизвестной причине. Я попытался использовать собственные функции сокетов linux, и теперь он работает как часы.

Смежные вопросы