お金をかけずにサーバーの勉強をしよう

SSHトンネリング

2024年1月12日

メニューへ戻る

SSHトンネリングというちょっとした技で楽しよう。

このホームページでサーバー環境を作っていてよくあるパターンに「Ubuntu Serverには Windowシステムをインストールしてないから、WEB管理画面にアクセスできない!」ってのがあります。

絵にするとこういうの。
SSHトンネル 1

サーバープログラムが WEBベースの管理画面を [80/tcp] で提供しているけど、デフォルトのバインドアドレスが localhostの [127.0.0.1] になってるようなケースです。

これだと WEB管理画面にアクセスできるのは Ubuntu Serverにある WEBブラウザだけということになりますが、そもそも WEBブラウザの絵がでませんよって。

まぁ普通は外部のクライアントPCから管理しなきゃなりませんので、サーバープログラムの設定を変更して [0.0.0.0](全ての IPアドレス) にバインドする手順を書くようにしています。

[0.0.0.0] にバインドすると、こういう感じになります。
これだとアクセスできるのが分かると思います。 SSHトンネル 2


さて、「それは面倒臭いな、ちょっと見られればそれで良いのに…」という事が多々あるんですが、そんな時に使えるテクニックが「SSHトンネル」とか「SSHポートフォワーディング」と呼ばれる SSHの機能です。

言葉で表現するなら「リモートホストのポートが自分のホストにあるように見える」って感じでしょうか。

絵にするとこんな感じ。
SSHトンネル 3

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
※ローカルホストの方につき、ポート番号が 1024より小さいものを「High Port]といい、それを使うには root権限が必要ですからご注意下さい。
その場合 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] でアクセスすればこのように。
SSHトンネル 4

上手くいきました。


2.TeraTermのケース

Windows10では [UbuntuServer2204-1]サーバーの名前解決をしていませんので、IPアドレス [192.168.1.102] でやります。

TeraTermを立ち上げて、まずは [192.168.1.102] に SSH接続します。
ここの手順は割愛します。
SSHトンネル 5

接続したら、メニューから [設定] - [SSH転送] を選択します。
SSHトンネル 6

この画面が出るので追加を押します。
SSHトンネル 7

[ローカルのポート] を選択し、[8000] としました。
リモート側ホストを [127.0.0.1]、ポートを [80] とします。
これで Windows10の [8000/tcp] への通信を [192.168.1.102]サーバーの [127.0.0.1:80] に転送してくれるはずです。
OKを押します。
SSHトンネル 8

作った行をマウスで選択して(青反転)、OKを押します。
SSHトンネル 9

一見何も起きてないように見えます。
SSHトンネル 10

Edgeで [http://localhost:8000] にアクセスしてみました。 SSHトンネル 11

上手くいきました。


==========
SSHトンネル(ポートフォワード)は、逆にリモートホストのポートにきた通信をローカルホストのポートにアクセスさせることもできます。

今回は例として WEBサーバーとWEBブラウザでやりましたが、サーバーアプリやツールには関係なく、ポートの転送をしているだけです。

工夫次第で様々なシーンで使える技なので、覚えておいて損はないと思います。