~/.ssh/config をカスタマイズする

半年前くらいから~/.ssh/configを使い始めました.
今のところ使っていて便利だなと思った機能を紹介します.

ホスト情報

example.comにuserで秘密鍵~/.ssh/id_rsa_exampleを使って接続するとき,毎回

ssh user@example.com -p 22 -i ~/.ssh/id_rsa_example

と書くのは面倒です. ここで~/.ssh/config

Host example
    HostName example.com
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_example

と書くと

ssh example

で簡単に接続できるようになります.

多段ssh

ホスト情報が省略できるだけでも十分便利なのですが,例えば家の環境に接続したいときは外向けに解放しているゲートウェイサーバーを経由して接続しなければなりません.
しかしいちいちゲートウェイサーバーにsshしてからローカルマシンにsshするのは手間がかかります. そこで

Host home
    HostName 192.168.10.10
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home
    ProxyCommand ssh -W %h:%p gateway   # %h -> host, %p -> port

Host gateway
    HostName home.net
    User user
    Port 2222
    IdentityFile ~/.ssh/id_rsa_gateway

という風に書いてやると,ssh homegatewayホスト経由でローカルネットワークの192.168.10.10に接続してくれます.

2段以上のときも,

Host home_1
    HostName 192.168.10.11
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_1
    ProxyCommand ssh -W %h:%p gateway

Host home_2
    HostName 192.168.10.12
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_2
    ProxyCommand ssh -W %h:%p home_1

という具合に書けばremote -> gateway -> home_1 -> home_2のような接続が ssh home_2 を叩くだけで行えます.

ワイルドカード

家にマシンが増えてくると,各々のマシンに対してリモートから接続するための設定と家のネットワークから直接接続する設定を書く必要が出てきます.

Host home_1
    HostName 192.168.10.11
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_1
    ProxyCommand ssh -W %h:%p gateway

Host home_1_local
    HostName 192.168.10.11
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_1

Host home_2
    HostName 192.168.10.12
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_2
    ProxyCommand ssh -W %h:%p gateway

Host home_2_local
    HostName 192.168.10.12
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_2

.
.
.

という具合にリモート用とローカル用で分けても良いのですが,同じ記述が複数回出てくるのはちょっと不格好です.

~/.ssh/configのHostにはワイルドカードを指定することができて,これにマッチしたHostに適用されます. 例えば,

Host *_via_home
    ProxyCommand ssh -W %h:%p gateway

と書くとssh ~~~~_via_homeは必ずgateway経由で接続されます.
これを利用して,

Host home_1*                 # 末尾に*を付けないとマッチしません
    HostName 192.168.10.11
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_1

Host home_2*
    HostName 192.168.10.12
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_2

Host *_via_home
    ProxyCommand ssh -W %h:%p gateway

と書いておくと
ローカル: ssh home_1
リモート: ssh home_1_via_home
とするだけで簡単に入れるようになります.(ただしsshコマンドのホスト補完が効かなくなります)

多段SSHの場合

どうやらうまく動かないようです.

Host *via_home_0*
    ProxyCommand ssh -W %h:%p gateway

Host *via_home_1*
    ProxyCommand ssh -W %h:%p home_1

と書いておいて

ssh home_2_via_home_1_via_home_0

remote -> gateway -> home_1 -> home_2な接続ができるかと思ったのですが,home_2_via_home_1までの時点でssh -W 192.168.10.12:22 home_1が実行されているためvia_home_0部分が完全に無視されています.
多段SSHの時はおとなしく書いたほうが良さそうです…(もしどなたか知見ありましたら教えて下さい)