Влияет на выбор исходящего интерфейса в цепочке POSTROUTING или после нее?

Влияет на выбор исходящего интерфейса в цепочке POSTROUTING или после нее?

У меня есть система, размещающая несколько экземпляров KVM. Все они подключены к одному мосту (скажем, brvirt), к которому также подключен eth1. Эта среда уровня 2 находится в частной сети, использующей 172.16.10.0/24 для смены адреса. В системе есть два других интерфейса, которые мы назовем eth0(10.10.10.10) и eth2(10.10.20.20).

В общем случае внешнее подключение осуществляется через SNATадрес eth0(и шлюз по умолчанию хоста также находится за пределами этого интерфейса).некоторые системы, мне нужно явное SNATправило 1-1 для сети 10.10.20.0/24, которая подключена к eth2.

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

Есть ли способ обойти это? Что яДействительнонужно принять решение о маршрутизации на основе адреса источника в пакете в конце цепочки POSTROUTING... но это вызвано POSTROUTINGне просто так.

решение1

это можно сделать с помощью простой маршрутизации на основе политик.

вам понадобится набор правил и маршрутов со схемой:

ip rule add from 172.16.10.X iif brvirt lookup 200
ip route add default via 1.2.3.4 src 4.3.2.1 dev ethY table 200

Переменные:

172.16.10.X = KVM's IP
200         = Example value for routing_table, has to be unique for each KVM
ethY        = either eth0 or eth2
1.2.3.4     = Example Gateway on iface ethY
4.3.2.1     = Example Source-IP for each KVM

Это направит все, что приходит через 172.16.10.Xуказанный интерфейс ethYс исходным адресом4.3.2.1

Вы также можете сделать это более сложным способом, fwmarksно я не думаю, что в данном случае это необходимо.

Вы можете проверить маршруты с помощью: ip route get iif brvirt from 172.16.10.X 8.8.8.8. Это отобразит маршрут и выходное устройство, которые ядро ​​будет использовать для соединения 172.16.10.Xс 8.8.8.8.

Надеюсь, это ответ на ваш вопрос.

ф0о

Связанный контент