自宅のサーバーに GitLab をセットアップしようとしています。HTTPS は機能しており、GitLab のインターフェースにアクセスできますが、SSH が機能していないため、サーバーにコードをプッシュできません。
セットアップは次のとおりです。
Cloudflare <--> Reverse Proxy (nginx, hosted on Digital Ocean) <--- VPN ---> Untangle Firewall <--> GitLab Server (on ESXi)
リバース プロキシから GitLab サーバーに直接 SSH 接続 (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-Cloudflare-s-proxy と互換性のあるネットワークポートの識別) なので、これは原因ではないはずです。SSH は GitLab ファイアウォール経由で許可されているので、これは原因ではないはずです。DigitalOcean でファイアウォールをまだ設定していないので、これは原因ではないはずです。
私は今道に迷っています。誰かが私にヒントを与えてくれることを願っています。
答え1
まあ、完全には満足できなかったものの、最終的には修正できました。
ストリーム構成から proxy_protocol on を削除する必要がありました。
Cloudflare は引き続き問題でした。Cloudflare 上のホスト/プロトコルに ssh -vvv を実行すると、通過を許可する代わりに 400 html ページが返されることが示されました。そのため、プロキシを使用せずに Cloudflare のネットワークを通過できるように新しいレコードを追加する必要がありましたが、これが、私が修正に完全に満足していない理由です。
最後に、各プロジェクトの git アップストリーム オリジンを修正する必要がないように、~/.ssh/config ファイルを編集して HostName パラメータを追加する必要がありました。
プロキシを使用して Cloudflare を使い続けるためのより良い解決策をお持ちの方がいらっしゃいましたら、ぜひ教えてください。