混乱しがちな「SSHトンネルの確立方法」をイメージ図とセットでまとめたコマンド集
あるポートへの通信をSSHで暗号化し、他のサーバーのポートへと転送する技術が「SSHポート転送」です。SSHポート転送は「ポートからポートへトンネルを通るようにデータが転送される」ことから、「SSHトンネル」とも呼ばれます。便利な技術ではありますが、「どっちのポートを転送するんだっけ……?」と、SSHトンネルを確立する方向に混乱してしまうこともしばしば。エンジニアのLinmiao Xu氏が、そんなSSHトンネルのイメージ図をコマンドとともにまとめています。
Visual guide to SSH tunnels
https://robotmoon.com/ssh-tunnels/
◆ポート転送の種類
SSHトンネルは、内部ネットワークにのみ公開されているサービスに外部からアクセスしたり、通信を暗号化したりする手段として知られています。一般的には、青色のローカルサーバーから、SSHサーバーを経由し、オレンジ色のリモートサーバーへポート転送を行う「ローカルポート転送」がよく利用されます。
ローカルポート転送とは逆に、リモートサーバーからローカルサーバーにSSHトンネルを確立する「リモートポート転送」の図はこんな感じ。インターネット上にないサーバーにSSHトンネルを「引き込む」場合などに利用されます。
「ダイナミックポート転送」は、ローカルサーバーのSOCKSプロキシからSSHサーバーを経由し、他のサーバーと通信を行うことができる仕組み。SSHサーバーの固定IPアドレスを送信元IPアドレスとしてローカルサーバーで利用したい場合などに利用されます。
◆ローカルポート転送
ローカルポート転送は「-L」オプションを指定して行います。以下の例では、ローカルサーバーの「127.0.0.1:8080」宛の通信を、SSHサーバーを経由して「example.org:80」に転送しています。
ssh -L 127.0.0.1:8080:example.org:80 ssh-server
ローカルサーバーのIPアドレスを省略するか、ワイルドカードの「*」とすることで、指定した番号のポートへの通信をすべて転送することができます。
ssh -L 8080:example.org:80 ssh-server ssh -L *:8080:example.org:80 ssh-server
SSHサーバーを「経由先」ではなく、直接「転送先」としたい場合は、転送先のIPアドレスを「127.0.0.1」に指定すればOK。
ssh -L 192.168.0.1:5432:127.0.0.1:5432 ssh-server
◆リモートポート転送
リモートポート転送の基本形は以下。「-R」オプションを指定します。図では、SSHサーバーの8080ポートへの通信をローカルサーバーの80ポートへ転送しています。
ssh -R 8080:localhost:80 ssh-server
SSHサーバー側のIPアドレスを指定すると、そのIPアドレスを宛先とした通信のみ転送を行うことができます。
ssh -R 1.2.3.4:8080:localhost:80 ssh-server
転送先のIPアドレスにローカルホスト以外を指定すると、SSHサーバーへの通信をいったんローカルサーバーに転送し、その後指定したIPアドレスやドメインに転送するという処理が行われます。
ssh -R 8080:example.org:80 ssh-server
◆ダイナミックポート転送
「ダイナミックポート転送」は「-D」オプションを指定して行います。図では、ローカルサーバーの3000ポートへの通信をすべてSSHサーバーに転送しています。
ssh -D 3000 ssh-server
送信先をもとに転送する通信を限定したい場合は、ローカルポート転送やリモートポート転送と同じようにローカルサーバーのIPアドレスを指定します。
ssh -D 127.0.0.1:3000 ssh-server
◆その他
確立したSSHトンネルは、何らかの障害で接続が切れたらそれきりです。「autossh」コマンドを使うと、SSHトンネルの接続状況を死活監視し、再接続を行ってくれます。
autossh -R 2222:localhost:22 ssh-server
autosshはSSHトンネルの死活監視用に別途ポートを開放しますが、「-M 0」オプションを指定すると「autosshによるsshが終了した場合」にSSHトンネルの再確立を行うようになり、ポートを節約できます。
いわゆる「ウェルノウンポート」を転送する場合は、特権でコマンドを実行する必要があります。
ローカルホスト以外への通信を転送する場合は、転送元サーバーの「/etc/ssh/ssh_config」にて、「GatewayPorts」オプションでIPアドレスを指定する必要があります。なお、すべてのIPアドレスについて転送を許可する場合は「yes」と指定します。
GatewayPorts IPアドレス もしくは GatewayPorts yes
・関連記事
UNIXライクなコマンドも使えるWindows用SSHサーバー「Bitvise SSH Server」を使ってみた - GIGAZINE
SSHのポート番号が「22」に決まった経緯を開発者のTatu Ylonen氏が公開 - GIGAZINE
開発者たちが慣れ親しんだ「scp」コマンドはなぜ「時代遅れで柔軟性がなくすぐに修正できない」のか? - GIGAZINE
Mozillaの独自VPNサービス「Mozilla VPN」のWindows・Android版がついに正式リリース - GIGAZINE
CloudflareがDNSサービス「1.1.1.1」に安全&高速なVPN機能「Warp」を追加予定 - GIGAZINE
・関連コンテンツ
in ソフトウェア, Posted by darkhorse_log
You can read the machine translated English article A collection of commands that summarizes….