いきなりですが、問題です。
MySQLのインストールされたLinuxサーバーがあるとします。
このサーバーを[S]と呼びます。
- [S]にはSSH(22番ポート)でアクセスが可能
- [S]上のMySQL(3306番ポート)へのアクセスが可能
- [S]で開放されているポートは22番ポートのみ
- [S]上のインストール権限はナシ
上記の状況において、
「Windowsから[S]上のMySQLのデータをGUIで見ることは可能か?」
答えを言うと、「可能」です。
そのための手段として、SSHポートフォワーディングがあります。
本記事の内容
- SSHポートフォワーディングとは?
- SSHポートフォワーディングの設定
- SSHポートフォワーディングの動作確認
それでは、上記に沿って解説していきます。
SSHポートフォワーディングとは?
SSHポートフォワーディングは、少し理解するのが難しい用語です。
そのため、次の二つに分けて説明します。
- SSHポートフォワーディング周辺の用語整理
- SSHポートフォワーディングの機能
少し長くなりますが、頑張ってついてきてください。
SSHポートフォワーディング周辺の用語整理
SSHポートフォワーディングの説明の前に、次の用語をご覧ください。
- SSHポートフォワード
- SSHポート転送
- SSHトンネル
- 踏み台サーバー
- 多段SSH
これらの用語は、一緒に使われることが多いです。
そのため、初めに用語を整理しておきます。
冒頭の問題では、サーバーは[S]一つだけでした。
そのため、SSHによるログインは1度のみです。
よって、「踏み台サーバー」と「多段SSH」は関係ありません。
関係ないとは、SSHポートフォワーディング自体の説明には無関係ということです。
合わせ技のように、一緒に使われることはありますけどね。
では、SSHポートフォワーディングを説明していきます。
フォワーディングは、英語だと「forwarding」となります。
これは、「forward」に「ing」を付けたものです。
この場合の「forward」は、転送を意味します。
メールの転送における「Fw:」と同じ意味ですね。
よって、SSHポートフォワーディングは「SSHポート転送」という意味になります。
ここまで来ると、ポートフォワーディングをイメージしやすいです。
「あるポートから別のポートへアクセスを転送する」
これが、ポートフォワーディングの意味です。
そして、このことは次のようにも言い換えることができます。
「あるポートと別のポートをトンネルのようにつなぐ」
この意味で、SSHポートフォワーディングは「SSHトンネル」とも言えます。
実際、そのように使われるケースもあります。
しかし、次のような意味で「SSHトンネル」を使う場合もあるようです。
「あるサーバーと別のサーバーをトンネルのようにつなぐ」
この場合だと、「SSHトンネル」は「踏み台サーバー」と「多段SSH」と一緒に用いられます。
どちらが正解なのでしょうか?
「あるサーバーのSSHポートと別のサーバーのSSHポートをトンネルのようにつなぐ」
上記のように捉えれば、ポート転送となります。
話が複雑になってきました。
これらが、SSHポートフォワーディングの理解を困難にしている原因でもあります。
とにかく、「SSHトンネル」という用語は使わない方がおススメです。
誤解を生む可能性が高いと言えます。
SSHポートフォワーディングの機能
意味的には、次の用語と同じ意味となります。
- SSHポートフォワード
- SSHポート転送
そして、SSHポートフォワーディングは次の処理に分けることができます。
- SSHでサーバーにログインしてマシン同士を接続する
- あるポートから別のポートに転送する
また、SSHポートフォワーディングには次の3つの方式があります。
- ローカルポートフォワーディング
- リモートポートフォワーディング
- ダイナミックフォワーディング
ダイナミックフォワーディングに関しては、プロキシのようなモノになります。
そのため、ここでは対象外とします。
それ以外のモノは、ポート転送の方向が異なります。
上記の「2.あるポートから別のポートに転送する」にあたる処理部分です。
ローカルポートフォワーディングとは、
ロカールマシンのポートからリモートマシンのポートに転送することです。
リモートポートフォワーディングとは、
リモートマシンのポートからロカールマシンのポートに転送することです。
冒頭の問題は、ローカルポートフォワーディングで対応することになります。
以上、SSHポートフォワーディングについて説明しました。
次は、実際にSSHポートフォワーディングの設定を行います。
SSHポートフォワーディングの設定
システム環境は、次の設定とします。
(リモートマシンには、ユーザーtest_userを使ってパスワード認証でログインします)
ロカールマシン | リモートマシン | |
OS | Windows 10 | Ubuntu 18.04 |
IPアドレス | - | 192.168.33.200 |
ここでは、ローカルポートフォワーディングの設定を説明します。
おそらく、ローカルポートフォワーディングが最も利用頻度は高くなるはずです。
冒頭の問題で言えば、リモートマシンの3309番ポートに転送するように設定します。
ローカルマシンのポートは、適当に9999番としましょう。
この条件であれば、ローカルマシン上で次のコマンドを実行することになります。
コマンドプロンプトでもPowerShellでもOKです。
ssh test_user@192.168.33.200 -NL 9999:localhost:3306
オプション「-N」を付けているため、リモートコマンドが無効です。
ポート転送のみが行われている状況になります。
マシン同士の接続は、「test_user@192.168.33.200」で行います。
もちろん、鍵認証にも対応しています。
鍵認証については、次の記事で説明しています。
そして、ポート転送は「-NL 9999:localhost:3306」ということです。
ここでの「localhost」は、リモートマシン(上のローカル)を意味しています。
つまり、192.168.33.200=localhostということです。
以上、SSHポートフォワーディングの設定の説明でした。
最後は、SSHポートフォワーディングの動作確認を行います。
SSHポートフォワーディングの動作確認
「Windowsから[S]上のMySQLのデータをGUIで見ることは可能か?」
このことが可能であることを確認しましょう。
リモートマシンには、MySQLがインストール済みとします。
UbuntuへのMySQLのインストールは、次の記事でまとめています。
また、ローカルマシンのWindowsにはGUIのデータベース管理ツールがインストール済みとします。
GUIのデータベース管理ツールは、HeidiSQLを利用しています。
HeidiSQLについては、次の記事で説明しています。
では、準備が整ったら、次のコマンドを実行します。
ssh test_user@192.168.33.200 -NL 9999:localhost:3306
次に、ポートに9999番設定してMySQLへ接続します。
ここでは、ポートに9999番を指定してHeidiSQL上でセッションを作成しています。
ただ、ホスト名は、「127.0.0.1」 のままです。
接続が成功すれば、次のようにデータを確認できます。
GUIでリモートマシン上にあるMySQLのデータを見ることができました。
以上、SSHポートフォワーディングの動作確認を説明しました。