外部(からの)アクセスに便利なsshポートフォワーディング
社内から社外へは接続できるけれども、社外から社内へは自由にアクセスできない…というのがよくあるセキュリティだと思いますが、この方法を使うことで、セキュリティ設定を変更せずに外部からアクセスが可能になります。
最初にこの方法を教えてもらった時に、感動しました。
条件
以下のマシンがあることが条件です。
- 内部ネットワーク→インターネットへ接続できるサーバが内部にあり、インターネット側へsshできること(
踏み台2
とします) 踏み台2
は最終的に繋ぎたい内部システム(例ではinternal:80
)などへアクセスできること- 最終的なアクセス元となる環境→インターネット上のサーバへssh接続できる環境があること(AWSなど)(
踏み台1
とします)
接続イメージ
説明する方法で、自分の端末の任意のポートが、内部ネットワークのアクセス先とマッピングされます。
localhost:20080
が、まるで内部ネットワークのinternal:80
に繋がるようなイメージです。
方法
- 内部ネットワーク(
踏み台2
)→外部(踏み台1
)へ接続する
踏み台2
から以下のコマンドを実行します。
ssh –N –R 10080:internal:80 user@x.x.x.x
これで、踏み台1
の10080
番ポートと踏み台2の先のinternal:80
が繋がります。
この時点で、x.x.x.x:10080
にアクセスするだけで、外部から内部へアクセスできます。
が、この場合は外部から内部ネットワークが丸見えになる危険性があります。Public IPとポート番号さえ分かってしまえば、外部からアクセスできてしまいます。(AWSの場合はSecurityGroupなどで制御することも可能ですが…)
そこで、自分の端末からだけ内部ネットワークにアクセスできるようにします。
- 自分の端末→外部(
踏み台1
)へ接続する
自分の端末から以下のコマンドを実行します。
ssh –N –L 20080:localhost:10080 user@x.x.x.x
これで、自分の端末の20080
番ポートが踏み台1の10080
番ポートと繋がりました。
1.と2.を組み合わせることで、自分の端末の20080番ポートが、内部ネットワークのinternal:80
に繋がることになります。
例えば内部ネットワーク上のwebシステムであれば、外部からでもhttp://localhost:20080/
でアクセスできるようになります。
仕組み
踏み台2
のコマンド:
ssh –N –R 10080:internal:80 user@x.x.x.x
-R
は、ssh接続先のポート番号と繋ぎたい先をマッピングするためのオプションです。
この場合は、x.x.x.x:10080
とinternal:80
をマッピングしています。
-N
は、リモートコマンドを発行しないオプションです。ポートフォワーディング用に指定するものと思ってください。
cron
などで、万が一切れてしまったら自動的に繋ぎ直すようにしておけばより安心です。
- 自分の端末のコマンド:
ssh –N –L 20080:localhost:10080 user@x.x.x.x
-L
は、自分自身のポート番号と繋ぎたい先をマッピングするためのオプションです。
この場合は、自分の端末の20080番ポートとx.x.x.x:10080
をマッピングしています。
-R
の時は、ssh接続先のポート番号を指定していましたが、-L
の場合はssh接続元のポート番号を指定しています。
また、コマンド中に出てくるlocalhost:10080
は、あくまで踏み台1
(x.x.x.x)から見たlocalhost
であることに注意してください。
ですので、ほぼ以下のコマンドと同義です。
ssh –N –L 20080:x.x.x.x:10080 user@x.x.x.x
最終的には、以下のようなイメージになります。
<自分の端末>:20080 → 踏み台1(x.x.x.x):10080 → 踏み台2 → internal:80
sshポートフォワーディングは、あくまでホスト:ポート同士をsshを通じてトンネリングしているだけなので、上記でいう踏み台1
は、sshのポートしか開放する必要がありません。
ですので、ある程度のセキュリティをは担保できることになります。公開鍵による認証にすれば、より安心だと思います。
使い方によってはリスクになりうる方法ですので、理解した上でご利用ください。