我正在嘗試在我的家庭伺服器上設定 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-相容-with-Cloudflare-s-proxy),所以不應該是這樣。 SSH 允許通過 GitLab 防火牆,所以不應該是這樣。我還沒有在 DigitalOcean 中設置防火牆,所以不應該是這樣。
我現在迷茫了,希望有人能給我指點?
答案1
沒關係,我最終能夠修復它,儘管這並不完全符合我的喜好。
從我的串流配置中,我必須刪除 proxy_protocol on;
Cloudflare 仍然是一個問題。透過 Cloudflare 運行 ssh -vvv 到主機/協定將顯示它返回 400 html 頁面而不是允許它通過。因此,我必須添加新記錄,以允許流量通過 Cloudflare 網路而無需代理,這就是為什麼我對我的修復不太滿意。
最後,我必須編輯 ~/.ssh/config 檔案並新增 HostName 參數,這樣我就不必修復每個專案的 git 上游來源。
如果有人有更好的解決方案讓我繼續使用 Cloudflare 和 Proxy,我很樂意聽到。