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

принуждение сетевого трафика к маршрутизации через определенный, нестандартный интерфейс

У меня есть несколько серверов Linux с несколькими (3) сетевыми интерфейсами и соответствующими сетевыми интерфейсами. Я наткнулся на причудливую проблему маршрутизации, когда трафик, который должен использовать маршрут по умолчанию, не используется, и в результате не может быть маршрутизирован. Вот как выглядит моя таблица маршрутизации:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.31.96.1      0.0.0.0         UG    0      0        0 em3
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 em1
10.31.96.0      0.0.0.0         255.255.252.0   U     0      0        0 em3
10.31.96.0      0.0.0.0         255.255.252.0   U     0      0        0 em4
# ip route list
default via 10.31.96.1 dev em3  proto static 
10.0.0.0/8 dev em1  proto kernel  scope link  src 10.0.0.100 
10.31.96.0/22 dev em3  proto kernel  scope link  src 10.31.97.100 
10.31.96.0/22 dev em4  proto kernel  scope link  src 10.31.96.61

10.31.96.1 - это мой маршрут по умолчанию, который должен использовать весь трафик (этот материал em # - это часть Fedora, вы можете безопасно мысленно подставить «eth» везде, где вы видите «em», если это облегчает отслеживание). Вот вывод ifconfig:

em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.0.0.100  netmask 255.0.0.0  broadcast 10.255.255.255
    inet6 fe80::b6b5:2fff:fe5b:9e7c  prefixlen 64  scopeid 0x20<link>
    ether b4:b5:2f:5b:9e:7c  txqueuelen 1000  (Ethernet)
    RX packets 283922868  bytes 44297545348 (41.2 GiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 538064680  bytes 108980632740 (101.4 GiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device memory 0xfeb60000-feb80000

em3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.31.97.100  netmask 255.255.252.0  broadcast 10.31.99.255
    inet6 fe80::b6b5:2fff:fe5b:9e7e  prefixlen 64  scopeid 0x20<link>
    ether b4:b5:2f:5b:9e:7e  txqueuelen 1000  (Ethernet)
    RX packets 3733210  bytes 1042607750 (994.3 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 1401537  bytes 114335537 (109.0 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device memory 0xfea60000-fea80000

em4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.31.96.61  netmask 255.255.252.0  broadcast 10.31.99.255
    inet6 fe80::b6b5:2fff:fe5b:9e7f  prefixlen 64  scopeid 0x20<link>
    ether b4:b5:2f:5b:9e:7f  txqueuelen 1000  (Ethernet)
    RX packets 2416588  bytes 196633917 (187.5 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 205038  bytes 19363499 (18.4 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    device memory 0xfeae0000-feb00000

em1 / 10.0.0.100 идет на подключенный коммутатор только к серверам в одной стойке. Он используется только для серверов в этой стойке, чтобы общаться между собой. em3 и em4 оба направляют в одну и ту же подсеть. Единственное различие между ними состоит в том, что em3 не всегда активен (он связан с плавающим IP-адресом в зависимости от того, какой сервер в настоящее время находится в роли «мастера»). По сути, весь трафик должен проходить через em3, если он не предназначен для чего-то еще в локальной подсети 10.0.0.1/8, и в этом случае он должен выходить через em1. Однако это не то, что происходит. 10.31.96.1/16, 10.31.97.1/16 и 10.31.99.1/16 трафик проходит через em3, но материал, предназначенный для 10.31.45.1/16, пытается пройти через em1, и тайм-аут, потому что нет способа маршрутизировать этот трафик эффективно.

Это также иллюстрируется следующей командой: # tcptraceroute cuda-linux traceroute to cuda-linux (10.31.45.106), максимум 30 переходов, 60 байтовых пакетов 1 cuda-fs1a-internal (10.0.0.100) 3006.650 мс! H 3006.624 мс! H 3006,619 мс! H

Однако при запуске из системы в той же сети, что и окно выше, только с одним сетевым интерфейсом, он работает: # tcptraceroute cuda-linux traceroute to cuda-linux (10.31.45.106), максимум 30 переходов, 40 байтовых пакетов 1 10.31 0,96,2 (10,31,96,2) 0,345 мс 0,403 мс 0,474 мс 2 cuda-linux (10.31.45.106) 0,209 мс 0,208 мс 0,201 мс

Я думал, что могу исправить это, добавив маршрут к 10.31.45.1 для em3, но это не удалось:

# route add default gw 10.31.45.1 em3
SIOCADDRT: Network is unreachable

Я не знаю, что еще попробовать. Помогите?

Маршруты обрабатываются от наиболее конкретного маршрута к наименее конкретному (также известному по умолчанию).

default via 10.31.96.1 dev em3  proto static 
10.0.0.0/8 dev em1  proto kernel  scope link  src 10.0.0.100 
10.31.96.0/22 dev em3  proto kernel  scope link  src 10.31.97.100 
10.31.96.0/22 dev em4  proto kernel  scope link  src 10.31.96.61

Вы сказали, что хотите should be going out through em3 unless its destined for something else on the local 10.0.0.1/8 subnet. Именно это и происходит. IP-адрес 10.31.45.1 внутри 10.0.0.0/8 и поэтому он уходит через em1. В 10.0.0.0/8 route соответствует тому, что адрес более конкретен, чем маршрут по умолчанию. Адрес не соответствует 10.31.96.0/22 маршрут. Поэтому выбран маршрут em1.

Ваша настоящая проблема в том, что у вас есть маска подсети на этом интерфейсе em1, которая слишком велика для того, что вам, вероятно, нужно, и конфликтует с другими сетями. Все, что предназначено для IP-адреса в диапазоне 10.0.0.1-10.255.255.254, будет пытаться использовать em1, как если бы он был локальным, за исключением адресов в 10.31.96.0/22, которые будут уходить через em3 / em4.

Ваше решение состоит в том, чтобы либо исправить подсеть / сеть em1, чтобы она не конфликтовала с другими вашими сетями, либо добавить множество маршрутов.

Что-то вроде ip route add 10.31.45.0/24 via 10.31.96.1 можете делать то, что хотите.