SSHで多段ポートフォワーディングを1行コマンドと設定ファイルで実現する方法

ProxyJumpで多段SSHポートフォワード

セキュアなネットワーク環境において、内部サーバに安全にアクセスするためにSSHのポートフォワーディングは非常に有用です。複数のサーバを経由して接続先にリーチする必要がある場合、従来は複数のSSHコマンドを組み合わせる必要がありました。今回の記事では、SSHの高度な機能を使って、1行のコマンドや~/.ssh/configの設定で、多段ポートフォワーディングをシンプルに実現する方法をご紹介します。

目次

ネットワーク構成

以下のようなネットワーク環境を想定します。

  • クライアントPC:​test2, test3へ直接アクセス不可。

  • test1サーバー:​クライアントPCからアクセス可能だが、test3へは直接アクセス不可。

  • test2サーバー:​test1からアクセス可能で、test3へのアクセスが可能。

  • test3サーバー:​最終的にRDP接続を行いたいサーバー。

ネットワーク構成2

課題

2段階のポートフォワーディング設定があった場合を考えます。

  1. 踏み台サーバ(test1)経由でtest2に接続し、ローカルでポートを確保する例

    ssh -L 10022:test2.example.com:22 user1@test1.example.com

    → test1経由で、ローカルのポート10022にtest2のSSHポートをマッピング

  2. test2経由でtest3のRDPポートへ転送する例

    ssh -L 13389:test3.example.com:3389 user2@localhost -p 10022

    → ローカルのポート10022に接続し、さらにtest2からtest3の3389番ポートへ転送

このような構成では、各段階でコマンドを実行しなければならず、管理や自動化の面で手間がかかります。また、プロキシ環境では、test3.example.comの名前解決を接続先(test2)側で行わせるため、ホスト名の前にバックスラッシュ(\)を付ける必要がありました。
多段SSHポートフォワード

1行コマンドでの実現方法

SSHのProxyJumpオプションとLocalForwardオプションを組み合わせることで、上記の手順を1行のSSHコマンドで実現できます。具体的なコマンド例は以下の通りです。

ssh -J user1@test1.example.com user2@test2.example.com -L 13389:\test3.example.com:3389

コマンドの各オプションの解説

  • -J user1@test1.example.com
    → まずtest1.example.com(踏み台サーバ)にuser1として接続し、そこから次のホストへジャンプします。

  • user2@test2.example.com
    → 最終的な接続先はtest2.example.comで、そこでuser2として認証が行われます。

  • -L 13389:\test3.example.com:3389
    → ローカルポート13389が、test2側で「\test3.example.com:3389」へ転送されます。ここでバックスラッシュ(\)を付けることで、test3.example.comの名前解決をtest2上で実施し、プロキシ環境下でも正しく接続先に到達できます。

この1行コマンドで実行すれば、複数のSSH接続やポートフォワーディングの設定を簡略化でき、スクリプトにも組み込みやすくなります。
ProxyJumpで多段SSHポートフォワード

~/.ssh/configに記述する方法

同じ接続構成をSSHの設定ファイルに記述すれば、コマンドをシンプルに「ssh test3rdp」と実行するだけで済むようになります。設定例は以下の通りです。

# 踏み台サーバ(test1)への接続設定
Host test1
    HostName test1.example.com
    User user1

# 中継先サーバ(test2)への接続設定
Host test2
    HostName test2.example.com
    User user2
    ProxyJump test1

# 最終的なRDP接続用(test3rdp)の設定
Host test3rdp
    HostName test2.example.com
    User user2
    ProxyJump test1
    LocalForward 13389 \test3.example.com:3389

# 踏み台サーバへの接続設定なし
Host test3rdp2
    HostName test2.example.com
    User user2
    ProxyJump user1@test1
    LocalForward 13389 \test3.example.com:3389

設定内容のポイント

  • Host test1とtest2
    → 踏み台サーバ(test1)と中継先(test2)の情報を個別に設定しています。test2の設定では、ProxyJumpを使ってtest1経由で接続することを明示しています。

  • Host test3rdp
    → 実際にRDP接続を行うためのエントリで、HostNameはtest2.example.comとなっています。
    LocalForwardの転送先には、バックスラッシュを付けることで、test2側で「test3.example.com」の名前解決が行われるようにしています。

このような設定を~/.ssh/configに記述しておけば、コマンドラインでは単に次のように入力するだけで全自動の接続が可能です。

ssh test3rdp

この方法のメリット

  • シンプル化: 複雑なポートフォワーディング設定を1行のコマンドまたはシンプルなconfigエントリにまとめられ、管理が容易です。

  • 柔軟性: 複数のサーバを経由する接続環境でも、各サーバの認証情報や転送の詳細設定を個別に記述できるため、トラブルシューティングがしやすくなります。

  • 自動化が容易: スクリプトや定型作業に組み込みやすく、リモート環境へのアクセスが簡便になります。

まとめ

SSHの高度なオプションを使うことで、複数段階にまたがるポートフォワーディングの設定を1行のコマンドまたは~/.ssh/configの記述にまとめることができました。プロキシ環境下や複雑なネットワーク構成でも、名前解決のタイミングを制御するなどの工夫により、よりシンプルかつ安全な接続が実現できます。この記事が、皆様の環境でのSSH設定の効率化に役立つことを願っています。

比較&Tips

Posted by 納戸 工房