Переадресация SSH с обратного прокси-сервера через VPN на домашний сервер

Переадресация SSH с обратного прокси-сервера через VPN на домашний сервер

Я пытаюсь настроить GitLab на своем домашнем сервере. HTTPS работает, и я могу получить доступ к интерфейсу GitLab, но SSH — нет, и поэтому я не могу отправить код на сервер.

Вот установка:

Cloudflare <--> Reverse Proxy (nginx, hosted on Digital Ocean) <--- VPN ---> Untangle Firewall <--> GitLab Server (on ESXi)

Если я попробую подключиться по SSH напрямую с обратного прокси-сервера к серверу GitLab (через VPN-соединение), то все работает отлично.

Если я попытаюсь подключиться по SSH со своего ноутбука, используя доменное имя, я получу:

kex_exchange_identification: Connection closed by remote host
Connection closed by 104.31.73.156 port 2095

Если я попытаюсь подключиться по SSH со своего ноутбука, используя IP-адрес обратного прокси-сервера (тем самым отключая Cloudflare), я получу:

Bad packet length 1231976033.
ssh_dispatch_run_fatal: Connection to {{ IP }} port 2095: message authentication code incorrect

В настоящее время я пытаюсь использовать для этого потоковый модуль nginx, и вот настройка потока:

stream {
        upstream git-ssh {
                server {{INTERNAL GITLAB IP}}:22;
        }
        server {
                listen 2095;
                proxy_pass {{INTERNAL GITLAB IP}}:22;
                proxy_protocol on;
        }
}

Причина, по которой у меня есть git-ssh, а я его не использую, заключается в том, что я задавался вопросом, в этом ли проблема, но не имеет значения, использую я его или нет.

Я не знаком с iptables, но я попробовал следующие команды:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2095 -j DNAT --to-destination {{GITLAB IP}}:22
sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 2095 -j SNAT --to-source {{PROXY IP}}

Но, похоже, это не сработало. ssh просто сидит и ничего не возвращает, а затем время ожидания истекает.

В настоящее время UFW отключен на прокси-сервере для тестирования, поэтому там ничего не происходит. 2095 — это одобренный порт для Cloudflare (https://support.cloudflare.com/hc/en-us/articles/200169156-Identifying-network-ports-compatible-with-Cloudflare-s-proxy), так что это не оно. SSH разрешен через брандмауэр GitLab, так что это не оно. У меня пока не настроен брандмауэр в DigitalOcean, так что это не оно.

Я теперь запутался и надеялся, что кто-нибудь сможет мне подсказать?

решение1

Ничего страшного, мне наконец удалось это исправить, хотя и не совсем так, как мне хотелось.

Из моей конфигурации потока мне пришлось удалить proxy_protocol;

Cloudflare продолжал быть проблемой. Запуск ssh -vvv к хосту/протоколу через Cloudflare показывал, что он возвращает 400 html-страницу вместо того, чтобы пропускать ее. Поэтому мне пришлось добавить новую запись, чтобы разрешить трафик через сеть Cloudflare без проксирования, поэтому я не совсем доволен своим исправлением.

Наконец, мне пришлось отредактировать файл ~/.ssh/config и добавить параметр HostName, чтобы мне не пришлось исправлять исходный файл git upstream для каждого из моих проектов.

Если у кого-то есть лучшее решение, которое позволит мне продолжать использовать Cloudflare с прокси-сервером, я был бы рад его услышать.

Связанный контент