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

Маршрутизатор Linux: ответы на ping проходят через неправильный интерфейс

У меня есть сервер 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.