Возможный дубликат:
Как объединить два разных интернет-подключения
Я ищу наилучший подход к подключению к нескольким маршрутизаторам через один адаптер Ethernet и его побочные эффекты.
У меня есть один ПК с Linux и одним портом Ethernet, подключенный к коммутатору. Этот коммутатор подключен к нескольким маршрутизаторам с разными сетями (например, 192.168.1.1, 192.168.2.1, 192.168.3.1). Я хочу иметь возможность привязывать сокет к определенному «устройству», поэтому я буду использовать соответствующий маршрутизатор для этого подключения.
Я считаю, что этого можно добиться, создав виртуальный интерфейс Eth для каждого маршрутизатора и установив правильный IP/подсеть/шлюз для каждого из них.
Вопросы: правильно ли это? Как это сделать? Стоит ли мне подозревать странные побочные эффекты.
* Общая скорость сети от всех маршрутизаторов вместе не превысит даже 10 Мбит/с.
решение1
Здесь нет необходимости в виртуальных интерфейсах. То, что вам нужно, это несколько IP-адресов на одном устройстве и хорошие таблицы маршрутизации с политикой маршрутизации для выбора используемой таблицы маршрутизации. Теперь о конфигурации. Давайте настроим ваши IP-адреса с помощью /32, чтобы мы могли сами создавать маршруты on-link
ip addr flush dev eth0
ip addr add 192.168.1.yourhost/32 dev eth0
ip addr add 192.168.2.yourhost/32 dev eth0
ip addr add 192.168.3.yourhost/32 dev eth0
Теперь о таблице маршрутизации. Первая таблица маршрутизации будет сопоставлять пакеты, которые идут в ваши локальные сети.
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.2.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.3.0/24 dev eth0 src 192.168.1.yourhost table 2
table 2
указывает, какую таблицу маршрутизации использовать. 2 — произвольное число. числа можно сопоставить с именами, отредактировав /etc/iproute2/rt_tables. Давайте добавим 2 lan
в этот файл, теперь вы можете просто использовать table lan
.
Теперь давайте использовать эту таблицу маршрутизации по умолчанию:
ip rule add table lan
Теперь, если вы посмотрите на вывод ip rule
, вы увидите что-то вроде этого:
0: from all lookup local
99: from all lookup lan
32766: from all lookup main
32767: from all lookup default
local
— это зарезервированная таблица, используемая для того, чтобы ядро могло проверить, является ли IP-адрес его собственным IP-адресом, lan
— это наша таблица, main
— это обычная таблица маршрутизации, которую вы знаете, и default
— это специальная таблица для пакетов, которые мы не можем маршрутизировать. По сути, ядро будет пробовать эти правила, начиная с первого, и, если оно не может найти маршрут в этой таблице, оно переходит к следующему правилу.
Итак, мы добавили еще одну таблицу маршрутизации, в которую мы помещаем наши маршруты в LAN, которая пробуется перед таблицей main
. Теперь давайте добавим маршрут по умолчанию в main: Когда вы не привязываете сокет к IP-адресу, вы будете использовать только этот маршрут по умолчанию. Давайте выберем 192.168.1.1:
ip route add default via 192.168.1.1 src 192.168.1.yourhost
Теперь, если вы привязываете свой сокет к 192.168.2.yourhost, вы не хотите использовать этот маршрут по умолчанию, а другой. Давайте добавим этот маршрут по умолчанию в другую таблицу маршрутизации:
ip route add default via 192.168.2.1 src 192.168.2.yourhost dev eth0 table 3
# and while we are at it, let's do this for 192.168.3.1 as well
ip route add default via 192.168.3.1 src 192.168.3.yourhost dev eth0 table 4
Теперь вы хотите использовать эти таблицы маршрутизации, но только если ваш сокет привязан к этим другим IP-адресам.
ip rule add from 192.168.2.yourhost iif lo table 3
ip rule add from 192.168.3.yourhost iif lo table 4
from 192.168.2.yourhost
заставит ядро пробовать таблицу только в том случае, если исходный IP-адрес в пакете — 192.168.2.yourhost. iif
позволяет указать, с какого интерфейса был получен пакет (что полезно при пересылке трафика) со специальным исключением, где iif lo
означает, что трафик был сгенерирован локально.
Теперь вы можете проверить, работает ли это, попробовав или используя ip route get
команды для проверки ваших таблиц маршрутизации:
$ ip route get 192.168.2.5
192.168.2.5 dev eth0 src 192.168.2.yourhost
cache
$ ip route get 64.34.119.12
64.34.119.12 via 192.168.1.1 dev eth0 src 192.168.1.yourhost
cache
$ ip route get 64.34.119.12 from 192.168.2.yourhost
64.34.119.12 via 192.168.2.1 dev eth0 src 192.168.2.yourhost
cache