Estou tentando configurar o GitLab no meu servidor doméstico. O HTTPS está funcionando e consigo acessar a interface do GitLab, mas o SSH não está e, portanto, não consigo enviar o código para o servidor.
Aqui está a configuração:
Cloudflare <--> Reverse Proxy (nginx, hosted on Digital Ocean) <--- VPN ---> Untangle Firewall <--> GitLab Server (on ESXi)
Se eu tentar fazer o SSH diretamente do proxy reverso para o servidor GitLab (por meio de conexão VPN), funcionará perfeitamente.
Se eu tentar fazer o SSH do meu laptop usando o nome de domínio, recebo:
kex_exchange_identification: Connection closed by remote host
Connection closed by 104.31.73.156 port 2095
Se eu tentar fazer o SSH do meu laptop usando o IP do proxy reverso (cortando assim o Cloudflare), obtenho:
Bad packet length 1231976033.
ssh_dispatch_run_fatal: Connection to {{ IP }} port 2095: message authentication code incorrect
Atualmente estou tentando usar o módulo nginx stream para fazer isso, e esta é a configuração do stream:
stream {
upstream git-ssh {
server {{INTERNAL GITLAB IP}}:22;
}
server {
listen 2095;
proxy_pass {{INTERNAL GITLAB IP}}:22;
proxy_protocol on;
}
}
A razão pela qual eu tenho o git-ssh upstream e não o uso é porque estava me perguntando se esse era o problema, mas não faz diferença se eu o uso ou não.
Não estou familiarizado com o iptables, mas tentei os seguintes comandos:
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}}
Mas não pareceu funcionar. ssh apenas fica lá sem retornar nada e eventualmente expira.
O UFW está atualmente desativado no proxy para teste, então nada está acontecendo lá. 2095 é uma porta aprovada para Cloudflare (https://support.cloudflare.com/hc/en-us/articles/200169156-Identifying-network-ports-compatível-com-Cloudflare-s-proxy), então não deveria ser isso. SSH é permitido através do firewall GitLab, então não deveria ser isso. Ainda não tenho o Firewall configurado no DigitalOcean, então não deveria ser isso.
Estou perdido agora e esperava que alguém pudesse me dar dicas.
Responder1
Deixa pra lá, finalmente consegui consertar, embora não seja totalmente do meu agrado.
Na minha configuração de stream, tive que remover proxy_protocol on;
Cloudflare continuou a ser um problema. Executar ssh -vvv no host/protocolo no Cloudflare mostraria que ele estava retornando uma página html 400 em vez de permitir sua passagem. Então tive que adicionar um novo registro para permitir o tráfego pela rede da Cloudflare sem proxy, e é por isso que não estou totalmente satisfeito com minha correção.
Finalmente, tive que editar meu arquivo ~/.ssh/config e adicionar um parâmetro HostName para não precisar corrigir a origem upstream do git para cada um dos meus projetos.
Se alguém tiver uma solução melhor que me permita continuar usando Cloudflare com Proxy, adoraria ouvi-la.