よくあるパターンだが環境によって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接続前にローカルで指定したコマンドを実行できるディレクティブを見つけました、ローカルでの実行であれば使いみち色々ありそうだなと思いました。時間ができたらいじってみます