ルーターのポートフォワーディングとSSHポートフォワーディングの違いと設定方法を、OpenSSHの公式マニュアルに沿って整理し、社内から自宅のWindowsパソコンへ接続する例を紹介します。
管理人本記事の読者層は以下の方を想定しています。
- ポートフォワーディングについて知りたい方
- ルーターのポートフォワーディングとSSHポートフォワーディングの違いを知りたい方
- SSHポートフォワーディングのコマンド(-L・-R・-D)の使い方を知りたい方
- 社内から自宅のWindowsパソコンへ、リモートデスクトップで接続したい方
ポートフォワーディングの概要
「ポートフォワーディング」とは、インターネットから特定のポート番号宛てに届いたパケットを、あらかじめ設定しておいたLAN側の機器に転送する機能です。利用にはあらかじめ、ルーター等に設定しておく必要があります。
「ポートフォワーディング ssh」で調べると、ルーターの設定とは別に、SSHポートフォワーディング(SSHトンネルと呼ばれることもあります)が出てきます。こちらは、SSHの安全な通信路を通して、指定したポートの通信を転送する方法です。2つの違いは、次の表のとおりです。
| 比べる点 | ルーターのポートフォワーディング | SSHポートフォワーディング |
|---|---|---|
| 設定する場所 | ルーター等の機器 | SSHクライアントのコマンド(ssh -L・-R・-D)など |
| 転送のしくみ | 外部から特定のポート番号宛てに届いた通信を、LAN側の機器へ転送する | SSH接続を通して、指定したポートの通信を転送する |
| 本記事で扱う章 | 「(2) 自宅ルーターでポートフォワーディングの設定がされている場合」 | 「セキュアなポートフォワーディング方法」以降 |
セキュアなポートフォワーディング方法
SSHポートフォワーディングを使ったサーバー間の接続も下記の方法で利用できます。
サーバーを中継して、クライアントのポートをリモートホストのリモートポートに転送します。
ssh -L {ポート番号}:{リモートホスト}:{リモートポート番号} {サーバー}OpenSSHの公式マニュアルでは、このオプションを-L [bind_address:]port:host:hostportと記載しています。手元(クライアント)のポートに届いた接続を、SSHサーバーの側にあるhostのhostportへ転送する、という意味です。
SSHポートフォワーディングの種類(-L・-R・-D)
SSHポートフォワーディングには、転送の向きによって次の3種類があります。
| 種類 | オプション | 内容 |
|---|---|---|
| ローカルポートフォワーディング | -L | 手元(クライアント)のポートに届いた接続を、SSHサーバー側の指定した宛先へ転送する |
| リモートポートフォワーディング | -R | SSHサーバー側のポートに届いた接続を、手元(クライアント)側の指定した宛先へ転送する |
| ダイナミックポートフォワーディング | -D | 手元のポートで待ち受け、接続を受けたあとにアプリケーションのプロトコルで転送先を決める |
リモートポートフォワーディングのコマンドの形は、ローカルと同じ並びです。ただし、先に書くポートが待ち受ける側は、SSHサーバー側になります。
ssh -R {ポート番号}:{ホスト}:{ホストのポート番号} {サーバー}サーバー側で待ち受けるポートへ、サーバー以外のホストから接続させたい場合は、sshdのGatewayPortsの設定が関係します(既定値はno)。
転送ポートの待ち受け先と、接続したままにするオプション
手元で待ち受けるポートは、既定ではGatewayPortsの設定に従います。bind_addressにlocalhostを指定すると手元のパソコンだけ、空または*を指定するとすべてのインターフェースから接続できます。ほかのホストから手元の転送ポートへ接続させたい場合は、-gを付けます。
また、転送だけを行い、リモートでコマンドを実行しない場合は、-Nを付けます。
例:手元のブラウザで、SSHサーバー上のWebサーバーを開く
SSHサーバーから見たlocalhostの80番ポート(Webサーバー)を、手元のポート8080へ転送する場合は、次のようにします。
ssh -N -L 8080:localhost:80 {ユーザー名}@{サーバー}SSHの接続を維持したまま、手元のブラウザでhttp://localhost:8080を開くと、SSHサーバー上の80番ポートに接続されます。
社内から、自宅パソコンへ繋げたい場合
社内のWindowsパソコンから、自宅のWindowsパソコンへ繋げたい場合を考えてみます。
(1) 自宅サーバーに外部からアクセスできるSSHポートが開いている場合
自宅のWindowsパソコンで、リモートデスクトップ(RDP)が有効になっていて、ポート3389で待ち受けているとします。リモートデスクトップの既定のポートは3389ですが、Windowsの既定ではリモートデスクトップは無効です。接続を受ける側になれるのは、Pro・Enterprise・Educationなどのエディションで、Home版は受ける側になれません。
また、自宅のWindowsパソコンのIPアドレスが「192.168.12.100」とします。
社内から、SSHでセキュアなSSHポート25番を使用して自宅サーバー「hogehoge.com」へ接続します。そして、自身のパソコンのWindowsのRDPのポート番号も3389であれば、ポート番号を変更せずそのまま3389ポートとしてIPアドレス「192.168.12.100」のWindowsパソコンにつなげばいいわけです。
この場合のポートフォワーディングは以下のようになります。
ssh -L 3389:192.168.12.100:3389 hogehoge.comこのコマンドを実行すると、手元のパソコンのポート3389に届いた接続が、SSHサーバー「hogehoge.com」を経由して、「192.168.12.100」のポート3389へ転送されます。SSHの接続を維持したまま、リモートデスクトップの接続先をlocalhost:3389にして接続します。手元のパソコンですでにポート3389が使われている場合は、-Lの最初のポート番号を別の番号(例:13389)にして、接続先をその番号に合わせます。
なお、SSHの接続先ポートは、既定では22番です(sshdのPortの既定値)。22番以外のポートで待ち受けているSSHサーバーに接続する場合は、-pでポート番号を指定します。
(2) 自宅ルーターでポートフォワーディングの設定がされている場合
外部からポート番号3389がアクセスされた際、ポート番号3389でIP「192.168.12.100」に転送してある設定の場合は、SSHでなくとも、直接RDP画面上で自宅のIPアドレスを叩けばそのまま繋がります。
まとめ
ルーターのポートフォワーディングは外部からの通信をLAN側の機器へ転送する設定で、SSHポートフォワーディングはSSH接続を通して通信を転送する方法です。
- ルーターのポートフォワーディングは、外部から特定のポート番号宛てに届いた通信を、LAN側の機器へ転送する
- SSHポートフォワーディングは、
-L(ローカル)・-R(リモート)・-D(ダイナミック)で、SSH接続を通して通信を転送する - 社内から自宅のWindowsパソコンへは、
ssh -L 3389:192.168.12.100:3389 hogehoge.comで接続し、リモートデスクトップの接続先をlocalhost:3389にする
次回の記事をご期待ください。どうぞよろしくお願いいたします。
関連リンク









コメント