IP-маршрутизация Linux с несколькими восходящими каналами ОДИН интерфейс

Пытается настроить машину Proxmox, которая работает 3 VMS. у него есть 3 открытых ips, но эти ips находятся на одном интерфейсе (eth0).

3 vms находятся на мосту (vmbr0) с адресом 172.16.0.1/24

У меня есть возможность ip маскировки и пересылки. но я не могу понять, как заставить каждый из 3 vms (172.16.0.2, 172.16.0.3, 172.16.0.4) маршрутизировать через определенный один из публичных ips.

Я попробовал стандартный iproute с 3 таблицами, устанавливающими шлюзы и правила, но независимо от того, какое правило я установил, виртуальные машины все еще маршрутизируются через основной ip.

Беда в том, что 3 общедоступных ips находятся в полных отдельных сетях, поэтому у каждого из них свой шлюз. Я знаю, как использовать iproute, чтобы сделать это, если каждый публичный ip был на отдельном физическом интерфейсе, но у этой машины все 3 на одном интерфейсе, и iproute, похоже, не нравится, потому что если я делаю ip route add default через 23.92.26.1 dev eth0:2 таблица node2, а затем список всего, что он показывает, через eth0. так что, очевидно, iproute не любит интерфейсы psuedo. Я не знаю много о iptables, и я уверен, что есть способ сделать это с чистыми iptables, но ничего не нашел. все мои поиски в Google содержат таблицы iproute, которые, как я сказал, не работают с интерфейсом signle.

заранее спасибо

2 ответа

Решение

Учитывая, что ProxMox работает на Debian, попробуйте добавить что-то вроде следующего в ваш /etc/network/interfaces для каждой из дополнительных ссылок

post-up route add -net <network identifier> netmask <netmask> gw <links gateway>
pre-down route del -net <network identifier> netmask <netmask> gw <links gateway>

и затем с iptables, если вы хотите, чтобы 172.16.0.2 проходил через второй ip, сделайте следующее: (это называется Source NAT или SNAT) --to-source указывает, на какой ip нужно перераспределять исходящие соединения.

iptables -t nat -A POSTROUTING -s 172.16.0.2/24 -j SNAT --to-source <ip address you want it to go out of>

если вы хотите, чтобы все входящие соединения по одному и тому же ip перешли на 172.16.0.2, вы также добавили бы следующее (это называется Destination NAT или DNAT)

iptables -t nat -A PREROUTING -d <ip/mask bit> -j DNAT --to-destination 172.16.0.2

Вопрос:

(1) 3VM - 172.16.0.2, 172.16.0.3, 172.16.0.4

(2) Шлюз - 172.16.0.1/24

(3) 3 publicIP: $ IP_A (шлюз $IP_A_G), $IP_B(шлюз $IP_B_G), $IP_C(шлюз $ IP_C_G)

(4) Ваша цель состоит в том, чтобы каждая виртуальная машина использовала свой публичный IP-адрес для посещения вне сети, например:

VM1(172.16.0.2) ----> $IP_A
VM2(172.16.0.3) ----> $IP_B
VM3(172.16.0.4) ----> $IP_C

Итак, я думаю, что вы можете использовать ip route для этого:

(1) В Promox(172.16.0.1)

echo "200 IPA" >> /etc/iproute2/rt_tables
echo "201 IPB" >> /etc/iproute2/rt_tables
echo "202 IPC" >> /etc/iproute2/rt_tables

Перезагрузите Promox один раз.

(2) Создать маршрутизатор

ip route del default table IPA
ip route add default via $IP_A_G  table IPA
ip route del default table IPB
ip route add default via $IP_B_G  table IPB
ip route del default table IPC
ip route add default via $IP_C_G  table IPC

(3) Добавить маршрут для каждой виртуальной машины

ip rule add from 172.16.0.2 lookup IPA pref 200
ip rule add from 172.16.0.3 lookup IPB pref 201
ip rule add from 172.16.0.4 lookup IPC pref 202
ip route flush cache

СДЕЛАННЫЙ

Другие вопросы по тегам