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

Используемая конфигурация выбрать аппаратный интерфейс для запроса?

У меня есть Linux-машина (ОС на базе Debian 10) с 3 аппаратными интерфейсами, подключенными к Интернету, 2 из которых являются USB-модемами: ifconfig дает ->

eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:95:a0:2c  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 14258  bytes 1613046 (1.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 14258  bytes 1613046 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.199.25.78  netmask 255.255.255.255  destination 10.64.64.64
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 7  bytes 130 (130.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 181 (181.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ppp1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.227.136.222  netmask 255.255.255.255  destination 10.64.64.65
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 7  bytes 130 (130.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 181 (181.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.105  netmask 255.255.255.0  broadcast 192.168.2.255
        inet6 fe80::e1b9:e62c:3140:bfc5  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:c0:f5:79  txqueuelen 1000  (Ethernet)
        RX packets 26548  bytes 5187998 (4.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20025  bytes 5171235 (4.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0 - это интерфейс по умолчанию здесь, когда я пытаюсь: curl --interface ppp1 ifconfig.me или curl --interface ppp0 ifconfig.me время запроса истекло, с sudo, sudo curl --interface ppp1 ifconfig.me дает ответ, но эквивалент для ppp0 тайм-аута, какие правила маршрутизации нужно добавить, чтобы иметь возможность выбирать аппаратный интерфейс для маршрутизации?

Фактические правила маршрутизации:

default via 192.168.2.1 dev wlan0 proto dhcp src 192.168.2.105 metric 303 
10.64.64.64 dev ppp0 proto kernel scope link src 10.233.6.240 
10.64.64.65 dev ppp1 proto kernel scope link src 10.149.182.92 
192.168.2.0/24 dev wlan0 proto dhcp scope link src 192.168.2.105 metric 303 

правило ip дает:

0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

ip -4 route показать таблицу все:

default via 192.168.2.1 dev wlan0 
10.64.64.64 dev ppp0 proto kernel scope link src 10.235.137.107 
10.64.64.65 dev ppp1 proto kernel scope link src 10.121.55.130 
192.168.2.0/24 dev wlan0 proto kernel scope link src 192.168.2.101 
local 10.121.55.130 dev ppp1 table local proto kernel scope host src 10.121.55.130 
local 10.235.137.107 dev ppp0 table local proto kernel scope host src 10.235.137.107 
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 
broadcast 192.168.2.0 dev wlan0 table local proto kernel scope link src 192.168.2.101 
local 192.168.2.101 dev wlan0 table local proto kernel scope host src 192.168.2.101 
broadcast 192.168.2.255 dev wlan0 table local proto kernel scope link src 192.168.2.101 

PS. после перезагрузки вся маршрутизация, которую я пробовал, пропала (как и ожидалось)

какой curl --interface <iface> http://example.com делает это для подключения к example.com, используя интерфейс <iface> IP-адрес как источник. В противном случае маршрутизация продолжается как обычно.

Если вы хотите выполнить маршрутизацию на основе адреса источника пакетов, вам необходимо добавить две таблицы маршрутизации (одну для пакетов с источником 10.199.25.78 и один для пакетов с источником 10.227.136.222). Дадим имена таблицам маршрутизации, добавив:

200 ppp0
201 ppp1

к /etc/iproute2/rt_tables и заполните их маршрутами по умолчанию для пакетов с этих интерфейсов:

ip route add default dev ppp0 via 10.64.64.64 table ppp0
ip route add default dev ppp1 via 10.64.64.65 table ppp1

Теперь все, что вам нужно сделать, это добавить два правила, которые будут выбирать таблицу ppp0 или ppp1 по адресу источника:

ip rule add from 10.199.25.78 table ppp0
ip rule add from 10.227.136.222 table ppp1

редактировать: Я углубился в завитокс --interface ppp0 вариант. Это может работать двумя способами (см. connect.c):

  • если процесс имеет CAP_NET_RAW способность (например, когда вы корень) он связывается с заданным интерфейсом (через SO_BINDTODEVICE) и все маршруты, которые не используют ppp0 интерфейс игнорируются.
  • если процесс непривилегированный, завиток привязывается к IP-адресу ppp0 интерфейс (10.199.25.78) и маршрутизация продолжается как обычно.