Политика маршрутизации гостей на другой сервер

После долгих поисков я нашел ответ на свой вызов, но последний шаг не удался.

У меня есть два идентичных сервера, которые обслуживают нескольких гостей. Серверы имеют два интерфейса: один для внешних IP-адресов, которые я получил от своего провайдера, и один для внутренней внутренней сети. Все гости получают внутренний адрес внутренней сети и подключаются к физической внутренней сети через мост. Оба сервера могут пинговать всех гостей на обоих серверах. Я выставляю гостей, используя D/SNAT'ing гостевой IP-адрес одному из доступных IP-адресов на хосте. Это прекрасно работает для гостей, которые живут на хосте.

Чтобы D / SNAT работал на другом хосте, я узнал, что мне нужно добавить маршрут для пакетов, которые поступили на внутренний интерфейс, потому что маршрут по умолчанию велел стеку на другом сервере вернуться на неверный интерфейс. и неправильный публичный IP. У меня есть этот сценарий, работающий на двух локальных виртуальных тестовых машинах, даже через "фиктивный" мост к физическому внутреннему интерфейсу.

Это также работает на реальных серверах для DNAT'ов по внутреннему IP-адресу, который находится на внутреннем мосту, но НЕ для адресов, назначенных гостям на другом сервере, которые также подключены к тому же внутреннему мост.

Конфигурация, сервер A:

/etc/iproute2/rt_tables:
..
200 internal

iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o $WAN_IF -j SNAT --to $PUBLIC_IP
iptables -t nat -A PREROUTING -i $WAN_IF -p tcp -d $PUBLIC_IP --dport 53 -j DNAT --to $GUEST_IP
ip rule add from $LAN_IP table internal
ip route add default via $LAN_GW dev $LAN_IF table internal

Where
WAN_IF = WAN bridge interface (br1)
PUBLIC_IP = is public ip address on WAN bridge if
LAN_IP = private ip on LAN bridge (br0)
LAN_GW = private ip on LAN bridge on other server

brctl show
br0             8000.003018a96c83       no              eth0
                                                        vnet0
                                                        vnet1
                                                        vnet2
                                                        vnet3
                                                        vnet4
                                                        vnet5
br1             8000.003018a96c84       no              eth1

Когда $GUEST_IP - это ip гостя на том же хосте, все работает. Когда $GUEST_IP - это IP-адрес локальной сети другого сервера. Но я не могу связаться с гостями на другом сервере?

Обновить

Настройка шлюза по умолчанию гостя работает, но это не симметричное решение, как я хотел создать. Но если это необходимо, это небольшое изменение, чтобы заставить вещи работать, пока я отслеживаю маршруты. Это, однако, сделало бы невозможной маршрутизацию разных протоколов через разные публичные IP-адреса, если я не создам некоторые правила для этого и на гостевой.

Обновление 2

Оказывается, я могу решить проблему, настроив шлюз по умолчанию только для гостя, но это не так "гибко", как я надеялся.

Есть ли более элегантное / гибкое решение?

1 ответ

Настройка шлюза по умолчанию для гостя кажется самым простым решением.

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