Я пытаюсь настроить 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 с прокси-сервером, я был бы рад его услышать.