После долгих поисков я нашел ответ на свой вызов, но последний шаг не удался.
У меня есть два идентичных сервера, которые обслуживают несколько гостей. У серверов есть два интерфейса: один для внешнего IP-адреса, который я получил от своего интернет-провайдера, и один для внутренней внутренней сети. Все гости получают внутренний адрес серверной сети и подключаются к физической внутренней сети через мост. Оба сервера могут пинговать всех гостей на обоих серверах. Я выставляю гостей с помощью D / SNAT, устанавливая гостевой 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-адресом LAN другого сервера. Но я не могу связаться с гостями на другом сервере?
Настройка шлюза по умолчанию для гостя работает, но это не симметричное решение, как я хотел создать. Но если это необходимо, это небольшое изменение, чтобы все работало, пока я отслеживаю маршруты. Однако это сделает невозможной маршрутизацию разных протоколов через разные общедоступные IP-адреса, если я не создам некоторые правила для этого и для гостя.
Оказывается, я могу решить проблему, настроив шлюз по умолчанию только для гостя, но это не так «гибко», как я ожидал.
Есть ли более элегантное / гибкое решение?
Настройка шлюза по умолчанию для гостя кажется самым простым решением.