Перенаправление порта на экземпляр без общедоступного IP-адреса в подсети

Классический способ сделать это с помощью iptables DNAT и включения пересылки IPv4 с помощью syctl, похоже, работает. Документация Google также предполагает это.

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

Правило перенаправления порта 8000 на серверную часть:

iptables -t nat -A PREROUTING -p tcp -i eth0 -d <1-local> --dport 8000 -j DNAT --to-destination <2-local>

Правило для исходящего трафика обратно к головному узлу:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Обозначение: <1-local> = локальный IP-адрес головки, <2-local> = локальный IP-адрес внутренней виртуальной машины

Обратите внимание, что маршрут был добавлен в сеть для исходящего трафика в соответствии с документацией Google (работает нормально). Я понимаю, что в разделе «Балансировка нагрузки» есть очень обширная функция переадресации портов, но, честно говоря, я понятия не имею, как ее использовать в таком простом случае.

Как мне убедиться, что исходные исходные IP-адреса сохранены? Я что-то упускаю, или это «особенность» подсетей GCE?

0
задан 26 November 2016 в 00:03
3 ответа

Наконец, я нашел решение и успешно протестировал его в производственной сети.

Проблема с переадресацией портов в GCE заключается в том, что экземпляры имеют только один сетевой интерфейс , поэтому для пакетов, пересылаемых с помощью DNAT, их исходный IP-адрес заменяется на SNAT немедленно, когда они проходят через цепочку POSTROUTING. Поскольку это происходит до того, как они достигнут своего экземпляра назначения, похоже, что DNAT не работает. Исправление теперь состоит в том, чтобы защитить перенаправленные пакеты после DNAT от немедленного SNAT, пропустив это правило в POSTROUTING. Второе правило ниже делает именно это:

iptables -t nat -A PREROUTING -i eth0 -p tcp -d <1-local> --dport 8000 -j DNAT --to-destination <2-local>
iptables -t nat -A POSTROUTING -o eth0 -p tcp -d <2-local> --dport 8000 -j RETURN

Вышеупомянутые правила могут повторяться для любого количества портов, которые нужно перенаправить. Последнее правило, приведенное ниже, гарантирует, что все экземпляры в локальной сети имеют доступ к Интернету без общедоступных IP-адресов (это правило заменяет правило MASQUERADE, предложенное в документации GCE):

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source <1-local>

Сетевой шлюз заменяет <1-local> на общедоступный IP перед отправкой пакетов обратно в Интернет.

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

Это решение обеспечивает переадресацию портов на серверные экземпляры без общедоступного IP-адреса, в то время как эти экземпляры также имеют полный доступ к Интернету. Для последнего также требуется, чтобы для головного узла была включена переадресация IP и добавлен маршрут по умолчанию в подсеть, как описано здесь: https://cloud.google.com/compute/docs/networking в разделе «Настройте шлюз NAT».

0
ответ дан 5 December 2019 в 09:24

Балансировщик нагрузки HTTP можно использовать с целевым прокси-сервером и сохранить IP-адрес клиента из поля X-Forwarded в заголовке запроса. Более подробную информацию об этом можно найти в статье Справочного центра .

0
ответ дан 5 December 2019 в 09:24

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

Вы можете создать несколько балансировщиков нагрузки, используя один общедоступный IP-адрес, если они Балансировщики нагрузки используют разные номера портов.

Балансировщик нагрузки UDP или TCP только с одним сервером и без проверки работоспособности очень похож на традиционную переадресацию портов.

0
ответ дан 5 December 2019 в 09:24

Теги

Похожие вопросы