4

В Ubuntu 14.04 x86-64 у меня есть беспроводное широкополосное соединение и USB-соединение (это на 4G, а не на том же беспроводном):

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.42.129  0.0.0.0         UG    0      0        0 usb0
192.168.0.0     0.0.0.0         255.255.255.0   U     9      0        0 wlan1
192.168.42.0    0.0.0.0         255.255.255.0   U     1      0        0 usb0

У меня есть также следующее:

ifconfig

...

usb0      Link encap:Ethernet  HWaddr 02:36:2c:04:05:7c  
          inet addr:192.168.42.248  Bcast:192.168.42.255  Mask:255.255.255.0
          inet6 addr: fe80::36:2cff:fe04:57c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3367 errors:1 dropped:0 overruns:0 frame:1
          TX packets:3669 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2434689 (2.4 MB)  TX bytes:637911 (637.9 KB)

wlan1     Link encap:Ethernet  HWaddr 14:cc:20:75:e1:8d  
          inet addr:192.168.0.4  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::16cc:20ff:fe75:e18d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3806 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4110 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2283536 (2.2 MB)  TX bytes:583794 (583.7 KB)

Все выглядит так, как будто он должен работать как положено (т.е. оба сетевых соединения работают, у моей машины 2 IP-адреса, ...).
Затем я хотел использовать связывающую прокладку для принудительного запуска процессов на одном соединении (или другом), и они работают, только когда я указываю IP-адрес соединения / шлюза по умолчанию .
Следующие работы (обратите внимание, это на привязанный USB - 4G):

BIND_ADDR="192.168.42.248" LD_PRELOAD=./bind.so chromium-browser

И это не (моя широкополосная сеть):

BIND_ADDR="192.168.0.4" LD_PRELOAD=./bind.so chromium-browser

Конечно, когда я отключаю USB-телефон, wlan0 волшебным образом снова начинает работать ...

Что я делаю неправильно? Любая идея?

1 ответ1

3

Причина, по которой ваше связывание не работает, не имеет ничего общего с связыванием, я тоже использую хитрость и все, что связано с тем фактом, что у вас есть только один шлюз по умолчанию, на сетевой usb0 , в то время как у вас должен быть один на любой сетевой карте , в противном случае подключение к WAN-сайтам из wlan0 не будет маршрутизировано.

Linux допускает существование нескольких шлюзов (по одному на интерфейс, виртуальных или нет) в режиме policy-based routing . Вам нужно иметь две отдельные таблицы маршрутизации, одну для usb0 и одну для wlan0 , и правило, указывающее ядру, какую использовать; затем binding приложения к любому интерфейсу позволит вам обращаться к сайтам WAN.

Вы обрабатываете две таблицы маршрутизации следующим образом: во-первых, создайте две таблицы (замените их и используйте подходящие имена, то же самое с IP1, DEV1 и т.д.):

echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables

Добавьте шлюз к каждой таблице маршрутизации (при необходимости):

ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>

Тогда маршрут по умолчанию:

ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>

Затем правила выбора таблицы маршрутов на основе адреса источника:

ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>

Теперь вы можете привязать приложение к любому интерфейсу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .