У меня есть несколько серверов 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
можете делать то, что хотите.