Назад | Перейти на главную страницу

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

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

У меня есть два идентичных сервера, которые обслуживают несколько гостей. У серверов есть два интерфейса: один для внешнего 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-адреса, если я не создам некоторые правила для этого и для гостя.

Обновление 2

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

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

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