Нет необходимости в виртуальных интерфейсах здесь. Вам нужны несколько IP-адресов на одном устройстве и хорошие таблицы маршрутизации с политикой маршрутизации, чтобы выбрать, какую таблицу маршрутизации использовать. Теперь о части конфигурации. Давайте настроим ваши ip-адреса с помощью /32, чтобы мы могли сами создавать наши маршруты по ссылкам
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
Теперь о таблице маршрутизации. Первая таблица маршрутизации будет соответствовать пакетам, которые отправляются на ваш lans.
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
- специальная таблица для пакетов, которые мы не можем маршрутизировать. , По сути, ядро будет пробовать эти правила, начиная с первого, и, если оно не может найти маршрут в этой таблице, оно переходит к следующему правилу.
Таким образом, мы добавили еще одну таблицу маршрутизации, в которую мы помещаем наши маршруты в ЛВС, что делается перед 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