SSHの踏み台有り・無しを,ネットワーク的居場所に応じて自動で切り替える

SSHで何がしかのホストに入るとき,自ホストのネットワーク的な居場所に応じて踏み台使用の有無を自動で切り替えるようなものを書いてみた.

やりたいこと

自分の居場所に関係無く,同一コマンドでSSHできるようにすることが最終的なゴール.

あるネットワークAからは踏み台無しでSSHできるけども,それ以外のネットワークからは踏み台を通さないとSSHできないようなホストがあるとする.

今までは,$HOME/.ssh/configに

Host univ-server1
    Host server1.example.jp
Host univ-server1-outside
    Host server1.example.jp
    ProxyCommand ssh univ-proxy nc %h %p
Host univ-proxy
    Host proxy.example.jp

と書いておいて,ネットワークAからは

$ ssh univ-server1

ネットワークA以外からは

$ ssh univ-server1-outside

と叩くようにしていた.


これを,自分の居場所に関係無く

$ ssh univ-server1

と叩けば入れるような状況にしたい.使い分けが面倒だし.

方法

$HOME/.ssh/configを以下のような感じで書く.ssh-autoproxy.pyはgithubから持ってきて適当にパスの通った場所へ.

Host univ-server*
    ProxyCommand ssh-autoproxy.py univ-proxy %h %p 192.0.2.0/24 198.51.100.0/24
Host univ-server1
    Host server1.example.jp
Host univ-server2
    Host server2.example.jp
Host univ-proxy
    Host proxy.example.jp

上記の例では,192.0.2.0/24と198.51.100.0/24以外からは踏み台が必要なホストを想定している.

これで,踏み台使用の有無に関係なく,

$ ssh univ-server1

を叩けば入れるようになる.

Know issue

  • インターネット接続性が無いと,アレな挙動を見せる
  • v4/v6 dual stackな環境だと,アレな挙動を見せる

Code

githubからどうぞ.ipaddrモジュールはPEP 3144版が必要なので注意.