Маршрутизация трафика на две сетевые карты в одной сети
У меня есть несколько тестовых окон linux на Scaleway, каждый из которых имеет 2x NIC, которые все подключены к одной сети 10.0.0.0/8
но у каждого свой шлюз.
Я хочу иметь возможность использовать как NIC (eth0/eth1), так и их IP для связи. Так что если приложения связаны с IP .187, тогда следует использовать dev eth0. Если приложение связано с IP .189, то следует использовать eth1.
Прямо сейчас только интерфейс eth0 с IP .187 отвечает на запросы. Любые запросы.(Вот почему я использую ping и ssh для тестирования). Однако, если я изменю маршрут по умолчанию с eth0 на eth1(ip .189), то исходящий трафик будет правильно маршрутизироваться через eth1, в этом случае eth0 тогда не будет использоваться.
Итак, как настроить коробку, чтобы оба интерфейса можно было использовать.
Дано
Box 1:
eth0_ip = 10.5.68.187/31
eth0_gw = 10.5.68.186
eth1_ip = 10.5.68.189/31
eth1_gw = 10.5.68.188
Подход
Основываясь на моих исследованиях здесь, здесь я создал скрипт bash, который должен добавлять статические маршруты с таблицами, чтобы можно было использовать оба nics.
#/bin/bash
# My Vars with IP and GW for eth0
eth0_ip=$(ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
eth0_gw=$(ip route list dev eth0 | awk '{print $1}' | tail -1 | cut -d'/' -f1)
eth1_ip=$(ip -o -4 addr list eth1 | awk '{print $4}' | cut -d/ -f1)
eth1_gw=$(ip route list dev eth1 | awk '{print $1}' | tail -1 | cut -d'/' -f1)
#ip route add 10.0.0.0/8 dev eth0 table 1 priority 100
#ip route add ${eth0_ip} dev eth0 table 1
ip route add default via ${eth0_gw} dev eth0 table 1
ip rule add from ${eth0_ip}/32 table 1
#ip route add 10.0.0.0/8 dev eth1 table 2 priority 110
#ip route add ${eth1_ip} dev eth1 table 2
ip route add default via ${eth1_gw} dev eth1 table 2
ip rule add from ${eth1_ip}/32 table 2
ip route flush cache
Я сделал несколько вариантов сценария, но ни один из них не сработал
Выход
[node]# ip route
default via 10.1.229.186 dev eth0
10.1.229.186/31 dev eth0 proto kernel scope link src 10.1.229.187
10.1.229.188/31 dev eth1 proto kernel scope link src 10.1.229.189
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev docker_gwbridge proto kernel scope link src 172.18.0.1
[node]# ip route show table 1
10.1.229.187 dev eth0 scope link
[node]# ip route show table 2
10.1.229.189 dev eth1 scope link
тестирование
[]]# ip route get 10.5.68.187 from 10.1.229.187
10.5.68.187 from 10.1.229.187 via 10.1.229.186 dev eth0
cache
[]# ip route get 10.5.68.187 from 10.1.229.189
10.5.68.187 from 10.1.229.189 via 10.1.229.188 dev eth1
cache
С другой машины.
ping 10.1.229.187 # OK
ping 10.1.229.189 # NOK
nmap 10.1.229.187 -p 22 # OK
nmap 10.1.229.189 -p 22 # NOK
Так как я могу настроить маршрутизацию, чтобы она работала, общаться с.187 и.189 одновременно.
Обновление 2:
С этой настройкой я смог добиться своего рода успеха.
eth0_ip=$(ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
eth0_gw=$(ip route list dev eth0 | awk '{print $1}' | tail -1 | cut -d'/' -f1)
eth1_ip=$(ip -o -4 addr list eth1 | awk '{print $4}' | cut -d/ -f1)
eth1_gw=$(ip route list dev eth1 | awk '{print $1}' | tail -1 | cut -d'/' -f1)
ip route add default via ${eth0_gw} dev eth0 table 1
ip rule add from ${eth0_ip} table 1
ip route add default via ${eth1_gw} dev eth1 table 2
ip rule add from ${eth1_ip} table 2
После того, как я применил вышеупомянутый скрипт, я изменил маршрут по умолчанию, переключился на eth1 и затем обратно, после чего я смог пропинговать до.187 и.189. (В другом примере я также полностью удалил его) Я не уверен, в чем проблема.
# remove and add route
ip route change default via ${eth1_gw} dev eth1
ip route change default via ${eth0_gw} dev eth0
ip route flush cache
Обновление 3:
Из различных испытаний мне кажется, что таблица 2 полностью игнорируется. Поскольку у провайдера есть собственное ядро, возможно ли отключить таблицы маршрутизации в ядре? Как я могу проверить это?
Обновление 4:
Еще раз у меня был небольшой прогресс, но все еще далеко от рабочего решения. Экспериментируя с разными вариантами, я наткнулся на эту странную ситуацию. Чтобы увидеть, как работает eth1, мне нужно сначала использовать соответствующий интерфейс, например
Мне нужно пропинговать с IP .189(узел1) на другой узел в сети, например: Пример: Узел 1-> Узел 2: ping -I 10.1.229.189 10.5.68.187
это работает, а затем вдруг взамен пинг от узла 2 -> узла 1 ping 10.1.229.189
работает. Если я не выполняю начальное соединение / пинг с (Узел 1 -> Узел 2), то (Узел 2 -> Узел 1) не работает.
Проблема здесь заключается в том, что, если я перезагружаю машину или жду некоторое время (10-60 минут), он возвращается в исходное состояние.
Минимальная настройка, которая частично работает, такова (впоследствии я удалил все, что не имело значения)
eth1_ip=$(ip -o -4 addr list eth1 | awk '{print $4}' | cut -d/ -f1)
eth1_gw=$(ip route list dev eth1 | awk '{print $1}' | tail -1 | cut -d'/' -f1)
ip route add default via ${eth1_gw} dev eth1 table 2
ip rule add from ${eth1_ip} lookup 2
Это вывод по запросу @Anton Danilov
[root@cluser-node-1 ~]# ip -4 r ls table all
default via 10.1.229.188 dev eth1 table 2
default via 10.1.229.186 dev eth0
10.1.229.186/31 dev eth0 proto kernel scope link src 10.1.229.187
10.1.229.188/31 dev eth1 proto kernel scope link src 10.1.229.189
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev docker_gwbridge proto kernel scope link src 172.18.0.1
local 10.1.229.187 dev eth0 table local proto kernel scope host src 10.1.229.187
broadcast 10.1.229.187 dev eth0 table local proto kernel scope link src 10.1.229.187
local 10.1.229.189 dev eth1 table local proto kernel scope host src 10.1.229.189
broadcast 10.1.229.189 dev eth1 table local proto kernel scope link src 10.1.229.189
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
broadcast 172.17.0.0 dev docker0 table local proto kernel scope link src 172.17.0.1
local 172.17.0.1 dev docker0 table local proto kernel scope host src 172.17.0.1
broadcast 172.17.255.255 dev docker0 table local proto kernel scope link src 172.17.0.1
broadcast 172.18.0.0 dev docker_gwbridge table local proto kernel scope link src 172.18.0.1
local 172.18.0.1 dev docker_gwbridge table local proto kernel scope host src 172.18.0.1
broadcast 172.18.255.255 dev docker_gwbridge table local proto kernel scope link src 172.18.0.1
[root@cluser-node-1 ~]# ip rule list
0: from all lookup local
32765: from 10.1.229.189 lookup 2
32766: from all lookup main
32767: from all lookup default
[root@cluser-node-1 ~]# ip n ls dev eth1
10.1.229.188 lladdr 00:07:cb:0b:0d:93 REACHABLE
[root@cluser-node-1 ~]# tcpdump -ni eth1 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
16:36:17.237182 ARP, Request who-has 10.1.229.188 tell 10.1.229.189, length 28
16:36:17.237369 ARP, Reply 10.1.229.188 is-at 00:07:cb:0b:0d:93, length 46
2 packets captured
4 packets received by filter
0 packets dropped by kernel
Это другой выход после перезапуска системы или после 15-30 минутного ожидания.
[root@cluser-node-1 ~]# tcpdump -ni eth1 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
[root@cluser-node-1 ~]# ip n ls dev eth1
10.1.229.188 lladdr 00:07:cb:0b:0d:93 REACHABLE
1 ответ
Проверьте, есть ли ответы (возможно, ответы отправляются через другой интерфейс) или ответы отсутствуют.
Проверьте настройки фильтра обратного пути (проверьте счетчики в выходных данных 'nstat -az' или 'netstat -S' - есть TcpExtIPReversePathFilter для пакетов, отброшенных rp_filter). Отключите его или установите в свободном режиме (см. Описание настроек sysctl). Найдите обратный маршрут для входящих пакетов, чтобы подтвердить предположение.
Я думаю, что вы должны добавить маршруты для напрямую подключенных сетей в таблицы маршрутов, потому что это требуется для разрешения arp соответствующих шлюзов и для связи с другими хостами в напрямую подключенных сетях. Этих настроек должно быть достаточно для решения вашего дела:
ip route add 10.5.68.186/31 dev eth0 таблица 1 IP-маршрут 0/0 через 10.5.68.186 dev eth0 таблица 1 ip route add 10.5.68.188/31 dev eth1 таблица 2 IP-маршрут 0/0 через 10.5.68.188 dev eth1 таблица 2 IP правило добавить из 10.5.68.187 поиска 1 IP-правило добавить из 10.5.68.189 поиска 2
Кроме того, вы должны знать, что эта настройка только для случая, когда IP-адреса на этих интерфейсах с перекрытой адресацией отличаются. В противном случае вам следует использовать более сложную схему с CONNMARK и pbr по меткам брандмауэра.
Если вы пытаетесь пропинговать хост с хоста itsels, вы должны использовать эти команды:
ip route add local 10.5.68.187 dev eth0 таблица 1 ip route add 10.5.68.186/31 dev eth0 таблица 1 IP-маршрут 0/0 через 10.5.68.186 dev eth0 таблица 1 ip route add local 10.5.68.189 dev eth1 таблица 2 ip route add 10.5.68.188/31 dev eth1 таблица 2 IP-маршрут 0/0 через 10.5.68.188 dev eth1 таблица 2 ip rule add iif eth0 lookup 1 pref 101 ip rule add iif eth1 lookup 2 pref 102 IP-правило добавить от 10.5.68.187 поиск 1 преф 201 IP-правило добавить от 10.5.68.189 поиск 2 преф 202 IP правило добавить из всех поиска локальных преф 300 ip rule del pref 0