SSHトンネリングというちょっとした技で楽しよう。
このホームページでサーバー環境を作っていてよくあるパターンに「Ubuntu Serverには Windowシステムをインストールしてないから、WEB管理画面にアクセスできない!」ってのがあります。
絵にするとこういうの。
サーバープログラムが WEBベースの管理画面を [80/tcp] で提供しているけど、デフォルトのバインドアドレスが localhostの [127.0.0.1] になってるようなケースです。
これだと WEB管理画面にアクセスできるのは Ubuntu Serverにある WEBブラウザだけということになりますが、そもそも WEBブラウザの絵がでませんよって。
まぁ普通は外部のクライアントPCから管理しなきゃなりませんので、サーバープログラムの設定を変更して [0.0.0.0](全ての IPアドレス) にバインドする手順を書くようにしています。
[0.0.0.0] にバインドすると、こういう感じになります。
これだとアクセスできるのが分かると思います。
さて、「それは面倒臭いな、ちょっと見られればそれで良いのに…」という事が多々あるんですが、そんな時に使えるテクニックが「SSHトンネル」とか「SSHポートフォワーディング」と呼ばれる SSHの機能です。
言葉で表現するなら「リモートホストのポートが自分のホストにあるように見える」って感じでしょうか。
絵にするとこんな感じ。
Ubuntu Serverの [80/tcp] がまるで Lubuntuの localhost [127.0.0.1:8000] であるように見させることができます。
この時に ssh通信がトンネルみたいな役割をするから SSHトンネリングと呼ばれます。
丁度 Ubuntu Serverで NGiNXが動いていて [80/tcp]で WEBサービスが提供されていますからそれを対象にします。
Lubuntu と Windows 10の TeraTermでやってみます。
1.Lubuntuのケース
別に Lubuntuに限りません。
どの Linuxディストリビューションでも一緒でしょう。
sshコマンドに [-L] オプションで、[localhost:8000] にきた通信を [UbuntuServer2204-1]サーバーの [127.0.0.1:80] に転送してくれます。
※分かりやすいよう、localhostのポートをあえて [8000] に変えています。
subro@Lubuntu2204:~$ ssh -L localhost:8000:127.0.0.1:80 UbuntuServer2204-1
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of 2024年 1月 12日 金曜日 16:40:27 JST
System load: 0.08740234375
Usage of /: 41.5% of 27.39GB
Memory usage: 5%
Swap usage: 0%
Processes: 235
Users logged in: 0
IPv4 address for docker0: 172.17.0.1
IPv4 address for ens32: 192.168.1.102
IPv6 address for ens32: 2408:82:a8:0:20c:29ff:fe6d:4b2c
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
Expanded Security Maintenance for Applications is not enabled.
17のアップデートはすぐに適用されます。
これらの追加アップデートを確認するには次を実行してください: apt list --upgradable
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
Last login: Fri Jan 12 16:36:33 2024 from 2408:82:a8:0:20c:29ff:fe6d:4b2c
その場合 sshコマンド実行には sudoコマンドを使って下さい。
一見単に Ubuntu Serverに sshで繋いだように見えますが…
ssコマンドでちょっと見てみましょう。
[-lt4p]オプションで「IPv4の tcpでリッスンしているもの(プロセス名も出す)」という意味。
subro@Lubuntu2204:~$ sudo ss -lt4p
[sudo] password for subro:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.1:8000 0.0.0.0:* users:(("ssh",pid=3498,fd=5))
LISTEN 0 4096 127.0.0.53%lo:domain 0.0.0.0:* users:(("systemd-resolve",pid=688,fd=14))
LISTEN 0 128 127.0.0.1:ipp 0.0.0.0:* users:(("cupsd",pid=785,fd=7))
sshが localhost [127.0.0.1] の [tcp:8000] を保持していることが分かります。
Firefoxで [http://localhost:8000] でアクセスすればこのように。
上手くいきました。
2.TeraTermのケース
Windows10では [UbuntuServer2204-1]サーバーの名前解決をしていませんので、IPアドレス [192.168.1.102] でやります。
TeraTermを立ち上げて、まずは [192.168.1.102] に SSH接続します。
ここの手順は割愛します。
接続したら、メニューから [設定] - [SSH転送] を選択します。
この画面が出るので追加を押します。
[ローカルのポート] を選択し、[8000] としました。
リモート側ホストを [127.0.0.1]、ポートを [80] とします。
これで Windows10の [8000/tcp] への通信を [192.168.1.102]サーバーの [127.0.0.1:80] に転送してくれるはずです。
OKを押します。
作った行をマウスで選択して(青反転)、OKを押します。
一見何も起きてないように見えます。
Edgeで [http://localhost:8000] にアクセスしてみました。
上手くいきました。
==========
SSHトンネル(ポートフォワード)は、逆にリモートホストのポートにきた通信をローカルホストのポートにアクセスさせることもできます。
今回は例として WEBサーバーとWEBブラウザでやりましたが、サーバーアプリやツールには関係なく、ポートの転送をしているだけです。
工夫次第で様々なシーンで使える技なので、覚えておいて損はないと思います。