パスワード認証つきプロキシサーバーを経由して443番ポートでGitHub/BitBucket/GitLabにssh接続する
先行研究として
などがあるが、プロキシへの接続にユーザー名 + パスワードで認証が必要な場合(つまり、例えばhttp://username:password@proxy.example.com:80
みたいなURLをhttp_proxy
やhttps_proxy
にセットして使うような環境)では追加で工夫が必要になったためメモしておく。
WSLなどが使える前提として、Linux環境での設定について記述する。
(なお、検証はWSL2のUbuntu24.04とBitBucketを使って実施した)
結論
netcat系のコマンドのオプションで頑張る
1. nc(netcat-openbsd)を使う場合
Ubuntu24.04(noble)などではたぶんデフォルトで入っているので手軽
man page:
以下の内容を~/.ssh/config
に追記する
# GitHub/BitBucket/GitLabについて必要なものを選んで追記する
# GitHub
Host github.com
HostName ssh.github.com
User git
Port 443
# ↓各自の環境で適当に変える
identityFile ~/path/to/git_secret_key
# ↓各自の環境に合わせて<>部分は適宜置き換える
ProxyCommand nc -X connect -x <プロキシのDNS名 or IPアドレス>:<ポート番号> -P <プロキシ認証のユーザー名> %h %p
# 環境変数https_proxyが設定されている場合、↓でもおそらく可
# ProxyCommand nc -X connect -x $(echo $https_proxy | awk -F"@" '{print $2}') -P $(echo $https_proxy | awk -F":" '{print $2}' | awk -F"//" '{print $2}') %h %p
# BitBucket
Host bitbucket.org
HostName altssh.bitbucket.org
User git
Port 443
# ↓各自の環境で適当に変える
identityFile ~/path/to/git_secret_key
# ↓各自の環境に合わせて<>部分は適宜置き換える
ProxyCommand nc -X connect -x <プロキシのDNS名 or IPアドレス>:<ポート番号> -P <プロキシ認証のユーザー名> %h %p
# 環境変数https_proxyが設定されている場合、↓でもおそらく可
# ProxyCommand nc -X connect -x $(echo $https_proxy | awk -F"@" '{print $2}') -P $(echo $https_proxy | awk -F":" '{print $2}' | awk -F"//" '{print $2}') %h %p
# GitLab
Host gitlb.com
HostName altssh.gitlab.com
User git
Port 443
# ↓各自の環境で適当に変える
identityFile ~/path/to/git_secret_key
# ↓各自の環境に合わせて<>部分は適宜置き換える
ProxyCommand nc -X connect -x <プロキシのDNS名 or IPアドレス>:<ポート番号> -P <プロキシ認証のユーザー名> %h %p
# 環境変数https_proxyが設定されている場合、↓でもおそらく可
# ProxyCommand nc -X connect -x $(echo $https_proxy | awk -F"@" '{print $2}') -P $(echo $https_proxy | awk -F":" '{print $2}' | awk -F"//" '{print $2}') %h %p
ただし、ncコマンドでは認証パスワードをオプションなどで設定出来ないため都度プロキシ認証のパスワードを入力しないといけない。
awk
を使ったワンライナー部分について、こっちを使うとあらゆる環境で使いまわしが出来る一方、プロキシ認証のユーザー名およびパスワードに:
や@
が入っているとうまく動かない可能性もあるので注意。
2. ncat(nmap-ncat)を使う場合
apt install ncat
やdnf install nmap-ncat
でインストールできる。
後発な分高機能なようで、こちらはオプションでパスワードまで設定できるので便利
ncatを使う場合は以下の内容を~/.ssh/config
に追記
# GitHub/BitBucket/GitLabについて必要なものを選んで追記する
# GitHub
Host github.com
HostName ssh.github.com
User git
Port 443
# ↓各自の環境で適当に変える
identityFile ~/path/to/git_secret_key
# ↓各自の環境に合わせて<>部分は適宜置き換える
ProxyCommand ncat --proxy-type http --proxy <プロキシのDNS名 or IPアドレス>:<ポート番号> --proxy-auth <プロキシ認証のユーザー名>:<プロキシ認証のパスワード> %h %p
# 環境変数https_proxyが設定されている場合、↓でもおそらく可
# ProxyCommand ncat --proxy-type http --proxy $(echo $https_proxy | awk -F"@" '{print $2}') --proxy-auth $(echo $https_proxy | awk -F":" '{print $2}' | awk -F"//" '{print $2}'):$(echo $https_proxy | awk -F":" '{print $3}' | awk -F"@" '{print $1}') %h %p
# BitBucket
Host bitbucket.org
HostName altssh.bitbucket.org
User git
Port 443
# ↓各自の環境で適当に変える
identityFile ~/path/to/git_secret_key
# ↓各自の環境に合わせて<>部分は適宜置き換える
ProxyCommand ncat --proxy-type http --proxy <プロキシのDNS名 or IPアドレス>:<ポート番号> --proxy-auth <プロキシ認証のユーザー名>:<プロキシ認証のパスワード> %h %p
# 環境変数https_proxyが設定されている場合、↓でもおそらく可
# ProxyCommand ncat --proxy-type http --proxy $(echo $https_proxy | awk -F"@" '{print $2}') --proxy-auth $(echo $https_proxy | awk -F":" '{print $2}' | awk -F"//" '{print $2}'):$(echo $https_proxy | awk -F":" '{print $3}' | awk -F"@" '{print $1}') %h %p
# GitLab
Host gitlb.com
HostName altssh.gitlab.com
User git
Port 443
# ↓各自の環境で適当に変える
identityFile ~/path/to/git_secret_key
# ↓各自の環境に合わせて<>部分は適宜置き換える
ProxyCommand ncat --proxy-type http --proxy <プロキシのDNS名 or IPアドレス>:<ポート番号> --proxy-auth <プロキシ認証のユーザー名>:<プロキシ認証のパスワード> %h %p
# 環境変数https_proxyが設定されている場合、↓でもおそらく可
# ProxyCommand ncat --proxy-type http --proxy $(echo $https_proxy | awk -F"@" '{print $2}') --proxy-auth $(echo $https_proxy | awk -F":" '{print $2}' | awk -F"//" '{print $2}'):$(echo $https_proxy | awk -F":" '{print $3}' | awk -F"@" '{print $1}') %h %p
先ほどと同様で、awk
を使ったワンライナー部分について、こっちを使うとあらゆる環境で使いまわしが出来る一方、プロキシ認証のユーザー名およびパスワードに:
や@
が入っているとうまく動かない可能性もあるので注意。
ちょっとだけ補足
前提として、SaaS版(グローバルに使われてる方)のGitHub/BitBucket/GitLabは443番ポートでsshできるための代替のDNS名を持っている。
GitHub: ssh.github.com
BitBucket: altssh.bitbucket.org
↑直接的な記述は無いが、
- Q: I’m using port 443 instead of default port 22 to connect to bitbucket.org over SSH and run my connection via altssh.bitbucket.org to connect to Bitbucket. (...)
などと書いてある
GitLab: altssh.gitlab
ここで、GitHub/BitBucket/GitLabにおけるssh接続を使った場合のgitリモートリポジトリのURLは基本的に
- GitHub:
git@github.com:<ユーザー名やプロジェクト名>/<リポジトリ名>.git
- BitBucket:
git@bitbucket.org:<ユーザー名やプロジェクト名>/<リポジトリ名>.git
- GitLab:
git@gitlab.com:<ユーザー名やプロジェクト名>/<リポジトリ名>.git
のようになっている。
これに対して先程書いたような内容でsshconfig(~/.ssh/config
)を設定すると、
上記URLは一切変更せずとも、実際に接続しにいくときはURLとポート番号を443接続用の方に変えられる、というのが大まかな仕組み。
Host <任意の名前>
HostName <実際のDNS名>
# その他sshのオプションに対応したあらゆる設定
と書いておくと、ssh <任意の名前>
とすると実際にはssh <もろもろのオプション> <実際のDNS名>
に変換されるため、
Hostにbitbucket.org
、HostNameにaltssh.bitbucket.org
を設定しておくとbitbucket.org
へのsshは適当なオプションを設定したaltssh.bitbucket.org
へのsshへと上書きされるようになる。
ここで、おそらくオンプレ環境などで自前で立てたGitLabだったり、GitHub Enterpriseなどでは相当する仕組みを自分で作らないと同じことは出来ないので注意。
その他
プロキシと闘う(?)ノウハウとして、
なども参考
Discussion