通过 VPN 将 SSH 从反向代理服务器转发到家庭服务器

通过 VPN 将 SSH 从反向代理服务器转发到家庭服务器

我正在尝试在家庭服务器上设置 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

如果我尝试使用反向代理的 IP 从我的笔记本电脑进行 SSH(从而切断 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 继续存在问题。通过 Cloudflare 运行 ssh -vvv 到主机/协议将显示它返回 400 html 页面而不是允许它通过。所以我不得不添加一条新记录以允许流量通过 Cloudflare 的网络而不进行代理,这就是我对我的修复并不完全满意的原因。

最后,我必须编辑我的 ~/.ssh/config 文件并添加一个 HostName 参数,这样我就不必为每个项目修复 git 上游来源。

如果有人有更好的解决方案,可以让我继续使用带有代理的 Cloudflare,我很乐意听到。

相关内容