У меня есть система, размещающая несколько экземпляров 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о