У меня есть сервер Debian, работающий как маршрутизатор для небольшой сети. Он имеет 3 сетевых интерфейса, одну LAN и 2 WAN (два разных провайдера, назовем их A и B, каждый из которых имеет общедоступный статический IP-адрес).
В локальной сети 5 подсетей, некоторые из которых получают доступ к Интернету с помощью ISP A, а некоторые используют ISP B (плюс есть очень простой механизм аварийного переключения на основе сценариев, который перенаправляет весь трафик через одного ISP, если другой выходит из строя, и сервер OpenVPN).
Это хорошо работает в течение некоторого времени. Но до сих пор мы использовали только публичный IP-адрес интернет-провайдера A для доступа к серверу извне. Теперь нам нужно иметь возможность доступа через оба публичных IP-адреса, и я вижу, что интернет-провайдер B не работает.
Используя tcpdump, я заметил, что запросы ping приходят к сетевому интерфейсу ISP B, но ответы не возвращаются. Вместо этого они, похоже, возвращаются через ISP A.
Я полагаю, что что-то не так в моей таблице маршрутизации, но я не уверен, что именно. Не могли бы вы помочь мне разобраться?
Вот как выглядит маршрутизатор (я заменил фактические общедоступные IP-адреса для 11.11.11.11 для ISP A и 22.22.22.22 для ISP B):
# ifconfig
eth1 Link encap:Ethernet HWaddr 94:0c:6d:82:0d:98
inet addr:10.1.1.1 Bcast:10.1.1.255 Mask:255.255.255.0
inet6 addr: fe80::960c:6dff:fe82:d98/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:70084654 errors:0 dropped:713 overruns:0 frame:0
TX packets:87266365 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2955150829 (2.7 GiB) TX bytes:3255030277 (3.0 GiB)
Interrupt:20 Base address:0x2000
eth1:0 Link encap:Ethernet HWaddr 94:0c:6d:82:0d:98
inet addr:10.1.2.1 Bcast:10.1.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:20 Base address:0x2000
eth1:1 Link encap:Ethernet HWaddr 94:0c:6d:82:0d:98
inet addr:10.1.3.1 Bcast:10.1.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:20 Base address:0x2000
eth1:2 Link encap:Ethernet HWaddr 94:0c:6d:82:0d:98
inet addr:10.1.4.1 Bcast:10.1.4.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:20 Base address:0x2000
eth1:3 Link encap:Ethernet HWaddr 94:0c:6d:82:0d:98
inet addr:10.1.5.1 Bcast:10.1.5.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:20 Base address:0x2000
eth3 Link encap:Ethernet HWaddr 94:0c:6d:82:c8:72
inet addr:22.22.22.22 Bcast:22.22.22.255 Mask:255.255.255.0
inet6 addr: fe80::960c:6dff:fe82:c872/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2013773 errors:0 dropped:0 overruns:0 frame:0
TX packets:52720 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:128125141 (122.1 MiB) TX bytes:4658309 (4.4 MiB)
Interrupt:19 Base address:0x6000
eth4 Link encap:Ethernet HWaddr 6c:f0:49:84:79:ca
inet addr:11.11.11.11 Bcast:255.255.255.255 Mask:255.255.255.0
inet6 addr: fe80::6ef0:49ff:fe84:79ca/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:57255186 errors:0 dropped:0 overruns:0 frame:0
TX packets:39862172 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:1000
RX bytes:1933578821 (1.8 GiB) TX bytes:328150009 (312.9 MiB)
Interrupt:27
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:952741 errors:0 dropped:0 overruns:0 frame:0
TX packets:952741 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:116644740 (111.2 MiB) TX bytes:116644740 (111.2 MiB)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:7907032 errors:0 dropped:0 overruns:0 frame:0
TX packets:6371185 errors:0 dropped:5 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:497588957 (474.5 MiB) TX bytes:3980021182 (3.7 GiB)
# ip rule list
0: from all lookup local
32763: from 10.1.5.0/24 lookup adsl
32764: from 10.1.3.0/24 lookup adsl
32765: from 10.1.2.0/24 lookup adsl
32766: from all lookup main
32767: from all lookup default
# ip route show table main
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
10.8.0.0/24 via 10.8.0.2 dev tun0
11.11.11.0/24 dev eth4 proto kernel scope link src 11.11.11.11
22.22.22.0/24 dev eth3 proto kernel scope link src 22.22.22.22
10.1.4.0/24 dev eth1 proto kernel scope link src 10.1.4.1
10.1.5.0/24 dev eth1 proto kernel scope link src 10.1.5.1
10.1.1.0/24 dev eth1 proto kernel scope link src 10.1.1.1
10.1.2.0/24 dev eth1 proto kernel scope link src 10.1.2.1
10.1.3.0/24 dev eth1 proto kernel scope link src 10.1.3.1
default via 11.11.11.1 dev eth4
default via 22.22.22.1 dev eth3 metric 100
# ip route show table adsl
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
22.22.22.0/24 dev eth3 proto kernel scope link src 22.22.22.22
11.11.11.0/24 dev eth4 proto kernel scope link src 11.11.11.11
10.8.0.0/24 via 10.8.0.2 dev tun0
10.1.4.0/24 dev eth1 proto kernel scope link src 10.1.4.1
10.1.5.0/24 dev eth1 proto kernel scope link src 10.1.5.1
10.1.1.0/24 dev eth1 proto kernel scope link src 10.1.1.1
10.1.2.0/24 dev eth1 proto kernel scope link src 10.1.2.1
10.1.3.0/24 dev eth1 proto kernel scope link src 10.1.3.1
default via 22.22.22.1 dev eth3
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
11.11.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth4
22.22.22.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
10.1.4.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.1.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.1.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.1.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
0.0.0.0 11.11.11.1 0.0.0.0 UG 0 0 0 eth4
0.0.0.0 22.22.22.1 0.0.0.0 UG 100 0 0 eth3
И вот тест tcpdump (здесь 22.22.22.22 - это IP-адрес провайдера B, а 99.99.99.99 - это IP-адрес удаленного компьютера, с которого я пингуюсь):
# Here's ISP B's interface, eth3
# tcpdump -i eth3 -qtln icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth3, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 99.99.99.99 > 22.22.22.22: ICMP echo request, id 8099, seq 1, length 64
IP 99.99.99.99 > 22.22.22.22: ICMP echo request, id 8099, seq 2, length 64
IP 99.99.99.99 > 22.22.22.22: ICMP echo request, id 8099, seq 3, length 64
IP 99.99.99.99 > 22.22.22.22: ICMP echo request, id 8099, seq 4, length 64
# Here's ISP A's interface, eth4
# tcpdump -i eth4 -qtln icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth4, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 22.22.22.22 > 99.99.99.99: ICMP echo reply, id 8099, seq 9, length 64
IP 22.22.22.22 > 99.99.99.99: ICMP echo reply, id 8099, seq 10, length 64
IP 22.22.22.22 > 99.99.99.99: ICMP echo reply, id 8099, seq 11, length 64
IP 22.22.22.22 > 99.99.99.99: ICMP echo reply, id 8099, seq 12, length 64
Вы забыли правило для каждого интерфейса. И лучше создать 2 таблицы вместо main и adsl просто для лучшей читаемости, например. ispa и ispb
Для eth4 добавить (вы можете сделать это с помощью post-up в / etc / network / interface):
ip route add 11.11.11.12/32 dev eth4 src 11.11.11.11 table ispa
ip route add default via 11.11.11.12 table ispa
ip rule add from 11.11.11.11 table ispa
(замените 11.11.11.12/32 IP-адресом вашего шлюза).
То же самое и с адресами eth3.
Я не знаю, нужна ли статическая маршрутизация для подсетей (возможно, так и есть), вам следует подумать о балансировке трафика между обоими интерфейсами WAN.
Если вам нужна помощь в этом вопросе, это отличный помощник для настройки маршрутизации для нескольких восходящих каналов:
http://www.debian-administration.org/article/377/Routing_for_multiple_uplinks
Ожидаемое поведение, которое вы испытываете. Этот пост в блоге немного устарел, но довольно хорошо объясняет, как заставить его работать так, как вы хотите: настройка нескольких маршрутов по умолчанию в Linux
EDITED: используя маршруты по умолчанию, ваши исходящие пакеты будут маршрутизироваться через маршрут по умолчанию с наибольшим предпочтением, независимо от того, каким путем они пришли.
Вам нужно использовать маршрутизацию на основе политик, поэтому я думаю, что в вашем случае вы могли бы просто добавить это:
ip rule add from 11.11.11.11 table main
ip rule add from 22.22.22.22 table adsl
Проверьте правильность размещения ваших правил с помощью ip rule list
. В любом случае, в конце концов, это то же самое, что и ответ @ Broco.