rcmdnk's blog
Last update

実用Git

外部から直接アクセスできないサーバーなどに 踏み台サーバーを通して一発でsshを行う設定がありますが、 Gitのsshを使ったアクセスについても同じようなことが出来ます。

Sponsored Links

sshを使ったGitアクセス

Gitではコマンドラインからサーバーにいくつかの方法でアクセスすることが出来ますが、 認証を要する接続では鍵認証を使ったsshの接続が一番良く使われています。

~/.ssh/git_rsaの様な鍵を用意しておいて、 同時に作ったgit_rsa.pubをサーバー側に登録し 以下の様な設定を~/.ssh/configに加えます。

~/.ssh/config
1
2
3
4
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/git_rsa

そうすると

$ ssh -T github.com
Hi rcmdnk! You've successfully authenticated, but GitHub does not provide shell access.

の様にきちんと鍵で認証できることが確認でき、git cloneなどもsshプロトコルを通して 行うことができる様になります。

GitHubなどではユーザーはすべてgitですが、 認証時に鍵を通じて各ユーザーを判断していることがわかります。

多段ssh

GitHubであれば通常どこからでもアクセスできますが、 自前で立ち上げているGitサーバーで外部から直接アクセスできない様な所にある サーバーもあるかと思います。

この様な場合に、外からgit cloneしようと思うと直接は出来ませんが、 多段sshを使うことで操作できる様になります。

多段sshを行うためには、内部サーバーにアクセスでき、かつ外側にオープンになっている 踏み台サーバーが必要になります。

直接アクセスしようとすると

$ ssh -T git.example.com -p 7000
ssh: connect to host git.exaple.com port 7000: Operation timed out
ssh_exchange_identification: Connection closed by remote host

となって繋がれない。

Gitのサーバーがgit.exmaple.com、外からアクセスできる踏み台サーバーがlogin.exmaple.comだとすると 以下の様な設定をすることで一発でアクセスできる様になります。

~/.ssh/config
1
2
3
4
5
6
7
8
9
10
11
12
Host login.example.com
  HostName login.example.com
  User user_at_login
  IdentityFile ~/.ssh/login_rsa

Host git.example.com
  HostName git.example.com
  User git
  Port 7000
  IdentityFile ~/.ssh/git_rsa
  ProxyCommand ssh login.example.com -W %h:%p
  #ProxyCommand ssh login.example.com nc %h %p

ここで、login_rsalogin.example.com用の鍵、git_rsagit.example.com用の鍵になります。 この場合login.example.comには鍵を置いておく必要はありません。

追記: 2018/11/18

ここではProxyCommandとして-Wオプションを使って設定しています。 このオプションはOpenSSHが5.4から有効ですが今はほとんど場合入っていると思います。

もし古いバージョンだったり、下に書くように-Wが使えない状況の場合、 コメントアウトしてある方のncコマンドを使った設定が使えます。 この場合、ncが踏み台用サーバーにインストールされている必要があります。

追記ここまで

これで

$ ssh -T git.example.com
Welcome to GitLab, @rcmdnk!

みたいな感じでアクセスできる様になります(この表示はGitLabの場合)。

git clone/git pushなども内部サーバーからやるのと同じ様にできる様になっているはずです。

ssh -Wオプションは使えない?

OpenSSHでは5.4から-Wというオプションが出来て、これを使って

ProxyCommand ssh login.example.com -W %h:%p

と言った設定をすることで通常のsshでは多段接続できる様になっています。 これにより踏み台サーバー側にncがインストールされてなくても多段接続できます。

ただ、この設定でGitサーバーにアクセスしようとしてみたところ

$ ssh -T git.exaple.com
Stdio forwarding request failed: Session open refused by peer
ssh_exchange_identification: Connection closed by remote host

の様な感じに失敗してしまいます。 メッセージ的にはポート指定が間違ってる様な感じなのですが、 ちょっと原因が分かりませんでした。 もしかしたら試したサーバー特有のものかもしれませんが、とりあえずncを使えばうまく行っているのでそれでOKとしています。

追記: 2018/11/18

-Wオプションが使えないのはGitサーバーだからではなく、 踏み台サーバーの/etc/ssh/sshd_configの設定で

AllowTcpForwarding=no

が設定されていることが原因でした。 実際、この踏み台サーバーを経由して通常の他のサーバーにログインしようと同じ現象が起きましたし、 これをyesにしたらGitでもうまくいきました。

このサーバーではポートフォワードを許したくないのでこの設定を入れていたので、 やはりncを使った方法を行うことにします。

通常の多段sshを行う際にも踏み台サーバーでポートフォワーディングを許可していない場合には -Wは使えいのでncを使った方法を行う必要があります。

-Wオプションもncを使った方法も、ProxyCommandに書くと似たような設定になりますが、 実際に行っていることはちょっと違って、

  • ssh -W: 踏み台経由でポートフォワードを行い、そこにアクセスする
  • nc: 踏み台経由でncコマンドを実行して目的のサーバーにアクセスする

という感じ。

最近のsshを使っていて踏み台サーバーがポートフォワードを許可しているのであれば -Wを使ったほうが簡単です。

ポートフォワードが許可されてない場合、ncを使う必要がありますが、 この場合には踏み台サーバー側にncコマンドがインストールされている必要があります。

追記ここまで

まとめ

Gitのサーバーに対しても多段sshを使ったアクセスが可能です。

ただし、sshのオプションである-WをProxyCommandに設定するとうまくいかない場合があり、 その場合はncコマンドを指定することで通常のsshの様にアクセスすることができるようになります。

Sponsored Links
Sponsored Links

« ブラウザで'この接続ではプライバシーが保護されません'なサイトに直接アクセスする方法 AutoHotkeyでファイルをincludeする場合の注意 »