Подключение Linux-машины к вторичному маршрутизатору / ISP: как правильно настроить маршрутизацию?

581
Jeroen Wiert Pluimers

Аннотация:

У меня есть (я предполагаю, что маршрутизация) проблемы при добавлении вторичного интернет-провайдера в мою существующую настройку сети: входящий трафик через Router1не отвечает, но локальный трафик и входящий через Router0работает нормально.

Как я могу сохранить работающие детали, в то же время заставляя входящий трафик Router1работать?

Разработка:

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

Это ситуация:

  • У меня две внутренние сети: LAN0есть 192.168.x.0/24и LAN1есть 192.168.y.0/24. Оба прекрасно работают для внутреннего трафика (например, http с использованием cURL ).
  • LAN0всегда был связан через Router0и ISP0к Internet.
  • LAN1всегда было Router1, но теперь связано ISP1с Internet.
  • Машины только на LAN0и имеющие маршрут по умолчанию Router0работают нормально для исходящего и входящего трафика.
  • Машины только на LAN1и имеющие маршрут по умолчанию Router1работают нормально для исходящего и входящего трафика.
  • Внутренний трафик включен LAN0и LAN1всегда работал нормально.
  • Входящий трафик через Router1for WindowsBпоступает корректно: я могу подключиться к нему через RDP из WindowsC.
  • Поступает входящий трафик Router1для for LinuxB(в соответствии с tcpdump ), но не отвечает обратно, как показывает curl http://e.f.g.hfron LinuxCс включенным tcpdump LinuxB :

Он показывает только пакеты, которые - в соответствии с форматом вывода tcpdump - имеют установленный флаг SYN :

LinuxB:/tmp/LinuxB.eth1.80 # tcpdump -i eth1 'port 80' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 13:35:19.489779 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047182 ecr 0,sackOK,eol], length 0 13:35:19.788841 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047478 ecr 0,sackOK,eol], length 0 13:35:19.888835 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047578 ecr 0,sackOK,eol], length 0 13:35:19.989412 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047678 ecr 0,sackOK,eol], length 0 13:35:20.089685 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047778 ecr 0,sackOK,eol], length 0 13:35:20.190836 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047877 ecr 0,sackOK,eol], length 0 13:35:20.392123 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287048072 ecr 0,sackOK,eol], length 0 13:35:20.693692 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0 13:35:21.197162 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0 13:35:22.204134 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0 13:35:24.115961 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0 13:35:27.852374 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0 13:35:31.967049 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0 

Это LinuxBтаблица маршрутов:

LinuxB:/tmp/LinuxB.eth1.80 # route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 192.168.x.1 0.0.0.0 UG 0 0 0 eth0 loopback * 255.0.0.0 U 0 0 0 lo link-local * 255.255.0.0 U 0 0 0 eth0 192.168.x.0 * 255.255.255.0 U 0 0 0 eth0 192.168.x.0 * 255.255.255.0 U 0 0 0 eth1 

Так как подключение по RDP от WindowsCto WindowsBработает нормально, возобновляю, это действительно проблема маршрутизации. Это WindowsBтаблица маршрутов:

C:\temp>route print =========================================================================== Interface List 0x1 ........................... MS TCP Loopback interface 0x2 ...00 0c 29 35 77 e1 ...... AMD PCNET Family PCI Ethernet Adapter - Packet Scheduler Miniport 0x3 ...00 0c 29 35 77 eb ...... VMware Accelerated AMD PCNet Adapter - Packet Scheduler Miniport =========================================================================== =========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.x.1 192.168.x.4 10 0.0.0.0 0.0.0.0 192.168.y.1 192.168.y.4 5 127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 192.168.x.0 255.255.255.0 192.168.x.4 192.168.x.4 10 192.168.x.4 255.255.255.255 127.0.0.1 127.0.0.1 10 192.168.x.255 255.255.255.255 192.168.x.4 192.168.x.4 10 192.168.y.0 255.255.255.0 192.168.y.4 192.168.y.4 10 192.168.y.4 255.255.255.255 127.0.0.1 127.0.0.1 10 192.168.y.255 255.255.255.255 192.168.y.4 192.168.y.4 10 224.0.0.0 240.0.0.0 192.168.x.4 192.168.x.4 10 224.0.0.0 240.0.0.0 192.168.y.4 192.168.y.4 10 255.255.255.255 255.255.255.255 192.168.x.4 192.168.x.4 1 255.255.255.255 255.255.255.255 192.168.y.4 192.168.y.4 1 Default Gateway: 192.168.y.1 =========================================================================== Persistent Routes: Network Address Netmask Gateway Address Metric 0.0.0.0 0.0.0.0 192.168.y.1 5 0.0.0.0 0.0.0.0 192.168.x.1 10 

Итак, как мне сделать так, чтобы маршрутизация LinuxBбыла такой:

  • оставить маршрут по умолчанию LinuxBдля 192.168.x.1так, чтобы исходящий трафик продолжал использовать Router0/ISP0
  • продолжать отвечать на входящие запросы, поступающие от LAN0наLAN0
  • продолжать отвечать на входящие запросы, поступающие от LAN1наLAN1
  • продолжайте отвечать на входящие запросы через Router0( a.b.c.d/ 192.168.x.1) через192.168.x.1
  • начать отвечать на входящие запросы через Router1( e.f.g.h/ 192.168.y.1) через192.168.y.1
  • Бонус: иметь Router1аварийное переключение или балансировку нагрузки сRouter0

Постскриптум:

Изображение PNG ниже генерируется в тексте UML с помощью бесплатного онлайн- движка PlantUML . Если вы хотите увидеть исходный текст UML, вставьте ссылку на изображение PNG в эту форму PlantUML, а затем нажмите Submit.

enter image description here

8
Просто нашел интересный ответ на http://unix.stackexchange.com/a/23345/69111, который я изучаю, чтобы выяснить, применимо ли это к моему делу, и как его реализовать с помощью `yast`. Jeroen Wiert Pluimers 9 лет назад 0
Похоже, что `Yast` выполняет сложную маршрутизацию, а` route` не рекомендуется в пользу `ip`. См. Http://opensuse.14.x6.nabble.com/yast2-advanced-routing-td3083578.html и https://www.suse.com/documentation/sles11/book_sle_admin/data/sec_basicnet_manconf.html. Jeroen Wiert Pluimers 9 лет назад 1
Ваше связанное решение в unix.stackexchange движется в правильном направлении и решит проблему linux - узел linux имеет две отдельные таблицы маршрутизации и использует соответствующую таблицу в зависимости от того, с какого интерфейса было инициировано соединение. Я не знаю ни одного такого решения для Windows. Если нет реальной необходимости в двух подсетях, я бы избавился от одной и использовал один маршрутизатор для обоих провайдеров. Вы можете купить маршрутизаторы, которые могут правильно работать с двумя глобальными сетями, или использовать для этого другую систему Linux, что упростит маршрутизацию в системах позади нее. David Mackintosh 9 лет назад 1
@DavidMackintosh в будущем я буду. Это временно: оптоволокно на самом деле является DSL и собирается перейти на другой оптоволоконный адрес. Машина - это DNS и MX, поэтому я хочу, чтобы она была доступна от двух интернет-провайдеров для обеспечения непрерывности, так как я не уверен, что DSL будет отключен до или после активации оптоволокна. Jeroen Wiert Pluimers 9 лет назад 0

1 ответ на вопрос

1
marc.fargas

У меня был сценарий оболочки для того, чтобы сделать что-то подобное давным-давно, но, извините, смог его найти. Так что я могу лишь дать вам указатели на решения, которые я реализовал тогда. Я пишу в основном по памяти, поэтому некоторые примеры отсутствуют:

  1. У меня была одна таблица маршрутизации для каждой линии вверх (ip route ... таблица 101, ip route ... таблица 102). Это входит в / etc / iproute2 / rt_tables.

    101 исп1 102 исп2

    Вам нужно также настроить эти таблицы:

    ip route добавить значение по умолчанию через таблицу $ Gateway1 dev $ Interface1 isp1 ip route добавить значение по умолчанию через таблицу $ Gateway2 dev $ Interface2 isp2

    # Не забудьте таблицу по умолчанию:

    ip route добавить значение по умолчанию через $ DefaultGateway dev $ DefaultInterface

  2. Включить отслеживание соединений iptables (modprobe nf_conntrack)

  3. Установите правило iptables для НОВЫХ входящих соединений, чтобы -j ОТМЕТИЛИ пакеты как-то (то есть: 0x201, 0x202)
  4. Установите правило ip, которое гарантирует, что трафик, проходящий через интерфейс, использует правильную таблицу маршрутизации.

    Добавление ip-правила из таблицы $ Ip1 isp1 Добавление ip-правила из таблицы $ Ip2 isp2

  5. Установите правило ip (ip rule add ...), указав, что «пакеты, помеченные 0x201, должны искать таблицу 201 маршрутизации», одно правило для каждой восходящей линии связи.

Имея все на месте, вы сможете получать и инициировать соединения с любой восходящей линией связи и даже балансировать исходящие соединения.

Это были бы основы. Iptables + "ip route" + "ip rule" и все готово.