Encaminhar SSH do servidor proxy reverso através de VPN para o servidor doméstico

Encaminhar SSH do servidor proxy reverso através de VPN para o servidor doméstico

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.

informação relacionada