透過 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-相容-with-Cloudflare-s-proxy),所以不應該是這樣。 SSH 允許通過 GitLab 防火牆,所以不應該是這樣。我還沒有在 DigitalOcean 中設置防火牆,所以不應該是這樣。

我現在迷茫了,希望有人能給我指點?

答案1

沒關係,我最終能夠修復它,儘管這並不完全符合我的喜好。

從我的串流配置中,我必須刪除 proxy_protocol on;

Cloudflare 仍然是一個問題。透過 Cloudflare 運行 ssh -vvv 到主機/協定將顯示它返回 400 html 頁面而不是允許它通過。因此,我必須添加新記錄,以允許流量通過 Cloudflare 網路而無需代理,這就是為什麼我對我的修復不太滿意。

最後,我必須編輯 ~/.ssh/config 檔案並新增 HostName 參數,這樣我就不必修復每個專案的 git 上游來源。

如果有人有更好的解決方案讓我繼續使用 Cloudflare 和 Proxy,我很樂意聽到。

相關內容