我正在尝试在家庭服务器上设置 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,我很乐意听到。