notebook

都内でWEB系エンジニアやってます。

特定の条件のときのみ経由する踏み台を追加する

よくあるパターンだが環境によってSSHの踏み台の経由を変えたいパターンの備忘録

serverに対してsshする際に社内からの場合と社外からの場合で経由内容を変えたい

例としては下記

  • 社外から
local -> proxy-a -> proxy-aws -> server
  • 社内から
local -> proxy-aws -> server

色々な事情で社外からのアクセスの場合はproxy-aを経由しなければならない

ただその箇所以外は設定などほぼ同じなのでうまくできないかなーという感じ

結論としてはssh_configのMatchディレクティブを使うことで条件によって設定内容を分岐できる

簡素化した設定例を下記に記す

  • .ssh/config
Host proxy-a
    HostName x.x.x.x

Host server
    HostName 10.0.1.1
    ProxyCommand ssh proxy-aws "nc -w 30 %h %p"

Host proxy-aws
    HostName bastion.example.com

Match host bastion.example.com exec "curl -s ifconfig.me | grep -qFv xxx.xxx.xxx.xxx"
    ProxyCommand ssh  proxy-a "nc -w 30 %h %p"

この場合はhostbastion.example.comかつ特定のIPからのアクセスではない場合ProxyCommandの設定を適用する

execは後に続くコマンドの終了コードをみて判断する(0の場合に適用される)

なので、アクセス元のIPがxxx.xxx.xxx.xxx以外の場合はgrepの終了コードが0となるためproxy-a経由でserverまでSSHする設定になる

ssh server

まとめ

なんとなく存在だけ知ってたものの実際に自分で試してみると理解してないこともありなるほどなーとなりました

蛇足ですがmanを読んでてLocalCommandというSSH接続前にローカルで指定したコマンドを実行できるディレクティブを見つけました、ローカルでの実行であれば使いみち色々ありそうだなと思いました。時間ができたらいじってみます