SSHポートフォワードを利用する(OpenSSH編)

やまもとやま
2023-09-14
2023-09-14

かえってきたポートフォワード

どうも、やまもとやまです。
そういえば前に1回目記事にしたまま忘れていたような気がするので、ポートフォワードの続きでも書こうと思います。
今回はOpenSSHのLとかRオプションを利用したパターン。
こちらの方が応用がききます。

構成

3台のホスト(サーバー)の構成です。
1台はクライアントとなるホスト(sv1)、1台は踏み台となるホスト(sv2)、最後の1台は内部ホスト(sv3)とします。
IPアドレスは以下の通り。

sv1:192.0.2.100
sv2:192.0.2.200 198.51.100.200 ※インタフェースが2つあり、1つは内部セグメントと疎通可
sv3:198.51.100.10

sv1から踏み台のsv2へはアクセスできますが、sv1からsv3へは直接アクセスができません。

OpenSSHのポートフォワード用オプション

OpenSSHにはローカル転送用のLオプションとリモート転送用のRオプションがあります。
ローカル転送は前回Tera Termで実行したのと同様、ローカルのポートをSSH先へ転送します。
リモート転送は逆で、サービスが起動しているホスト側からSSHし、リモートからの接続をホストへ転送します。

今回は、前回のTera Termと同等の設定を行ってみましょう。
クライアントとなるホストsv1から、踏み台ホストへSSHしますが、その際にLオプションを指定します。
具体的なコマンドは以下になります。

sv1 # ssh 192.0.2.200 -L 8080:198.51.100.10:80 -N

Lオプションの指定で、ローカルの8080ポートをSSH接続先の踏み台ホストsv2からホストsv3(IPアドレス「198.51.100.10」)の80ポートへ転送しています。
また、NオプションはSSH接続するだけで何もしないオプションです。
ポートフォワードするだけの接続のときによく利用されます。

これで接続が確立されて転送可能なので、クライアントのホストで試してみましょう。
※当然ながら↑のsshコマンドを実行しても何も表示されないのでご注意!

sv1 # curl http://localhost:8080/
OK

表示されました!
転送先の内部ホストのログも確認しておきます。

sv3 # cat /var/log/httpd/access_log
198.51.100.200 - - [06/Jul/2023:15:40:57 +0900] "GET / HTTP/1.1" 200 3 "-" "curl/7.29.0"

たしかに、転送によって踏み台からのアクセスが行われていることが確認できます。

今回も無事いけました

OpenSSLを利用したSSHポートフォワードで、安全に内部へのアクセスを実現することができました。
これだけでは前回と同じになってしまいますが、OpenSSHで実現できるということは、多段でのトンネルも簡単に実現できます。
リモート転送やgオプションと組み合わせるとまた面白いので興味があればぜひ試してみてください。
それではまた!