よくあるパターンだが環境によって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"
この場合はhost
がbastion.example.com
かつ特定のIPからのアクセスではない場合ProxyCommand
の設定を適用する
exec
は後に続くコマンドの終了コードをみて判断する(0
の場合に適用される)
なので、アクセス元のIPがxxx.xxx.xxx.xxx
以外の場合はgrepの終了コードが0
となるためproxy-a
経由でserver
までSSHする設定になる
ssh server
まとめ
なんとなく存在だけ知ってたものの実際に自分で試してみると理解してないこともありなるほどなーとなりました
蛇足ですがmanを読んでてLocalCommand
というSSH接続前にローカルで指定したコマンドを実行できるディレクティブを見つけました、ローカルでの実行であれば使いみち色々ありそうだなと思いました。時間ができたらいじってみます