MatchでSSH/SCP接続時のProxyCommand有無を区別する
ども、大瀧です。
IPアドレスベースのアクセス制限を設定しているサイトにSSH/SCPで接続するために、SOCKSプロキシを経由する環境があります。以下のブログ記事のような構成です。
- VPN利用者のためにdelegateでSOCKSサーバーを立ててみました | Developers.IO
- ProxyCommandを使って踏み台(Bastion)経由で直接ssh/scpする | Developers.IO
~/.ssh/config
ファイルにProxyCommandパラメータを設定すれば良いのですが、常時プロキシ経由で良いかというとアクセス元IPアドレスが許可IPアドレスに含まれるオフィス出勤時はプロキシを経由したくないといったケースがやっぱり出てくるわけです。
そこで本記事ではMatchパラメータを用いてProxyCommandパラメータの有無を区別する設定をご紹介します。
Matchパラメータ
MatchパラメータはSSH/SCPの接続オプションを適用する様々な条件を設定します。~/.ssh/config
のHostパラメータに記述しているホスト名をパターンマッチして複数ホストに同じオプションを適用するほかに、Match exec
にコマンドを記述することで、コマンドの終了値によってオプションの付与をオン/オフすることができます。
今回は
- リモートアクセス時はプロキシを経由する
- オフィスからはプロキシを経由しない
としたかったので、リモートアクセスサーバー10.XX.XX.XX
(リモートアクセス時にだけ疎通できるIPのローカルIP)にpingを送出しリプライが返ってきたときにProxyCommand
パラメータを適用してSOCKSプロキシ10.YY.YY.YY
にncする、としてみました。以下の様な感じです。
Match exec "ping -c 1 -o 10.XX.XX.XX -t 1> /dev/null" ProxyCommand nc -x 10.YY.YY.YY %h %p
SSH/SCP実行時に毎回pingが試行される点は注意が必要です。疎通できない場合は試行回数分タイムアウトを待つことになるので、支障の無い範囲でそれを短くするようにオプションを工夫してください。今回はタイムアウトが1秒、1回でもREPLYが返れば終了値0で成功、となるように設定しています。
これで、リモートアクセスサーバーに接続しているときのみプロキシ経由でSSH/SCPを実行するようになりました。Match exec
には任意のコマンドを指定できるので、OSのネットワークインターフェースの有無や活性化の確認ができるコマンドで代用するのも良いと思います。
まとめ
~/.ssh/configファイルのMatchパラメータで、条件によってSSH/SCP接続時のオプションを変える設定をご紹介しました。ロケーションに依らない、シームレスなSSH/SCPライフを!