Как выставить разные порты на одном и том же IP на GCE
Мы пытаемся разместить службу, которая должна предоставлять как минимум два разных порта по одному и тому же адресу на GCE.
В нашем случае это GitLab, который должен по крайней мере обеспечить доступ по SSH (порт 22) и HTTPS (порт 443). Но на самом деле это может быть любая служба, которой нужны два или более портов на одном домене или IP-адресе.
Служба работает нормально внутри экземпляра виртуальной машины GCE, и я ищу наиболее разумный способ представить ее миру. Конечно, HTTPS обязателен для любого производственного развертывания, подобного этому. Я предпочел бы не обрабатывать TLS в экземпляре по соображениям безопасности.
Все найденные нами варианты предоставления этой услуги не идеальны:
- Использование публичного IP на экземпляре
- Использование L4 LoadBalancer (TCP)
- Использование L7 LoadBalancer (HTTPS)
Использование публичного IP на экземпляре
Это означает непосредственное раскрытие сервисных портов. В этом случае служба на ВМ должна быть связана с известными портами (22, 443). В нашем случае это немного раздражает, поскольку служба работает в Docker, а порт 22 сталкивается с сервером SSH на хосте. Таким образом, нам пришлось бы использовать другой порт SSH для хоста и обрабатывать сертификаты TLS самостоятельно. Не так здорово
Использование L4 LoadBalancer (TCP)
В основном применяются те же ограничения, так как похоже, что L4 LB перенаправляет трафик на те же порты, по которым он их получает. Также эта опция добавляет некоторые накладные расходы для конфигурации LoadBalancer. И нам все еще нужно управлять HTTPS в этом случае.
Использование L7 LoadBalancer (HTTPS)
Это довольно гибкий подход, но мы потеряли бы возможность предлагать SSH, что для нас бесполезно.
Мой вопрос: есть ли лучший способ выставить этот вид сервиса на GCE?
В AWS вы можете просто иметь ELB с несколькими слушателями (HTTPS и TCP:22), указывающими на произвольные порты в одном экземпляре. Также ELB может прекратить HTTPS для вас. Я не могу себе представить, что GCE не предлагает такую функцию.
1 ответ
Если я правильно понимаю, то, что вы ищете, это перенаправление портов, например, предоставление порта 2443 для общего доступа, но ваша служба прослушивает 443 внутри. Вы можете сделать это:
1) Настройте iptables для перенаправления портов на вашей виртуальной машине:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport <public-port> -j REDIRECT --to-port <internal-port>
См. http://www.cyberciti.biz/faq/linux-port-redirection-with-iptables/
2) Создайте правило брандмауэра GCE, чтобы разрешить общий порт:
gcloud compute firewall-rules create <name> --allow tcp:<public-port> --network <network> --source-ranges "0.0.0.0/0"