社内プロキシサーバと踏み台サーバを経由して多段SSH接続

社内プロキシサーバと踏み台サーバ経由の多段SSH接続にお悩みの貴方を救いたい
2022.05.06

こんにちは!コンサル部のinomaso(@inomasosan)です。

以前、踏み台サーバ経由の多段SSH接続を、ローカル端末の秘密鍵のみで実施する方法をご紹介しました。

今回は、踏み台サーバのフロントに社内プロキシが存在する場合の接続方法をまとめていきます。

検証環境の構成図

EC2はAmazon Linux 2で構築しました。
社内プロキシサーバには、ローカルネットワークかVPNで接続していることが前提となります。

やってみた

クライアント環境

検証環境のクライアント端末のOSは以下の通りです。

項目 バージョン
macOS BigSur 11.6.3

やり方その① ~/.ssh/configに記述

configの書き方は前回とほぼ同様の内容です。
社内プロキシサーバ経由の設定は、ハイライトした行となります。

~/.ssh/config

# ログインするサーバ毎にHostを記載
# Hostの名前は任意で設定可能
Host bastion
  # 踏み台サーバのパブリックIP(DNS名でも指定可能)
  HostName xxx.xxx.xxx.xxx
  # sshポート番号(省略可能)
  Port 22
  # ログインするユーザ名
  User ec2-user
  # 社内プロキシサーバ経由
  ProxyCommand nc -x [社内プロキシサーバのDNS名 or IP]:[社内プロキシサーバのポート] %h %p
  # ローカル端末に保存した、踏み台サーバの秘密鍵のパス指定
  IdentityFile ~/path/bastion.pem

Host private
  # プライベートサーバのプライベートIP(DNS名でも指定可能)
  HostName xxx.xxx.xxx.xxx
  # sshポート番号(省略可能)
  Port 22
  # ログインするユーザ名
  User ec2-user
  # 踏み台サーバを経由してログイン
  ProxyCommand ssh bastion -W %h:%p
  # ローカル端末に保存した、プライベートサーバの秘密鍵のパス指定
  IdentityFile ~/path/private.pem

プライベートサーバには、以下のコマンドで簡単にSSH接続することができます。

ssh private

やり方その② ProxyCommandにてワンライナーでSSH接続

~/.ssh/configを既に利用している等で記述が困難な場合は、以下のコマンドのみでプライベートサーバへSSH接続することも可能です。
ただ、ワンライナーで実行しているため、多少コマンドが複雑になっております。

ssh -o ProxyCommand=\
"ssh -i ~/path/bastion.pem -W %h:%p ec2-user@踏み台サーバのパブリックIP \
-o ProxyCommand='nc -x [社内プロキシサーバのDNS名 or IP]:[社内プロキシサーバのポート] 踏み台サーバのパブリックIP 踏み台サーバのSSHポート'" \
-i ~/path/private.pem ec2-user@プライベートサーバのプライベートIP

ワンライナーのProxyCommandをもっとスマートに書けなかったのか?

以下のように~/.ssh/configと同様なProxyCommandの設定でも検証してみました。

ssh -o ProxyCommand=\
"ssh -i ~/path/bastion.pem -W %h:%p ec2-user@踏み台サーバのパブリックIP \
-o ProxyCommand='nc -x [社内プロキシサーバのDNS名 or IP]:[社内プロキシサーバのポート] %h %p'" \
-i ~/path/private.pem ec2-user@プライベートサーバのプライベートIP

しかし、%h %pはProxyCommandをネストして記載すると文字列の置き換えができないせいか、以下のようなエラーが出力されてしまいました。

nc: read failed (7/10): Broken pipe
kex_exchange_identification: Connection closed by remote host
kex_exchange_identification: Connection closed by remote host

参考ブログ

まとめ

社内プロキシサーバも経由しなくてはいけない場合でも、~/.ssh/configやワンライナーのコマンドでSSH接続できることがわかりました。
~/.ssh/configで記載した方が、SSH接続用のコマンドが簡単になるため、まずはこちらでの設定を検討して頂くのが良いかと思います。

この記事が、どなたかのお役に立てば幸いです。それでは!