SSHを使用したポート転送やトンネリングの設定をわかりやすく図示したビジュアルガイド
「ポート転送」は、特定のポートへの通信をSSHを経由して別のコンピューターやポートへ転送する技術です。執筆者の身元はわからないものの、エキスパートエンジニアによる個人ブログの記事として「どんなコマンドを使えばどんな転送設定になるのか」についてのわかりやすいビジュアルガイドが公開されています。
Visual guide to SSH tunneling and port forwarding - ITTAVERN.COM
SSHの「-J」オプションではトンネリングの設定が可能です。例えば「ssh -J user@REMOTE-MACHINE:22 -p 22 user@10.99.99.1」というコマンドではリモートマシンを経由して10.99.99.1のマシンへSSH接続できます。下図のコマンドの背景色はそれぞれ図のどの部分を設定しているかを示しています。
SSHの「-L」オプションはローカルに届いた通信をリモートへ転送する設定ができます。「ssh -L 10.10.10.1:8001:localhost:8000 user@REMOTE-MACHINE」というコマンドは、「10.10.10.1:8001」への通信をリモートマシンの「localhost:8000」へ転送するという意味になります。
「ssh -L 8001:10.99.99.1:8000 user@REMOTE-MACHINE」と設定すると、「8001番のポートに届いた通信をリモートマシンを経由して10.99.99.1の8000番ポートへ転送する」という設定に。ローカルのアドレスを省略した場合はローカルマシン内からの通信のみ転送されます。
逆に、リモートへの接続をローカルに転送するのがSSHの「-R」オプションです。「ssh -R 8000:localhost:8001 user@REMOTE-MACHINE」とコマンドを書くと「リモートマシンの8000番ポートに届いた通信をローカルの8001番ポートへ転送する」ことが可能です。
ローカルマシンを経由して他のサーバーへ通信を転送することもできます。「ssh -R 8000:10.10.10.2:8001 user@REMOTE-MACHINE」は「リモートマシンの8000番ポートへの通信をローカルマシン経由で10.10.10.2の8001番ポートへ転送する」という意味です。
「ssh -R 10.99.99.2:8000:10.10.10.2:8001 user@REMOTE-MACHINE」のようにリモートのアドレスを記載するとリモートマシンの外部からの通信も転送できるようになります。
SSHの「-D」オプションではSOCKSプロトコルを使用したダイナミックポート転送を設定できます。「ssh -D 10.10.10.1:5555 user@REMOTE-MACHINE」のようにポート転送を確立した後、「curl -L -x socks5://10.10.10.1:5555 brrl.net/ip」のように接続先を指定することでリモートマシンから接続できる全てのサーバー・ポートにリモートマシン経由でアクセス可能です。
なお、SSHで「-f」オプションを指定することでバックグラウンドで実行でき、「-N」オプションで接続先でコマンドを使用しないようにできます。ポートの転送設定だけを行う場合、この2つのオプションをあわせて使用するのがおすすめです。