ソフトウェア

混乱しがちな「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

この記事のタイトルとURLをコピーする

・関連記事
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 here.