SSHポートフォワーディングによるDB接続の設定

SSHポートフォワーディングによるDB接続の設定 生産性UP

いきなりですが、問題です。

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ポートフォワーディングは次の処理に分けることができます。

  1. SSHでサーバーにログインしてマシン同士を接続する
  2. あるポートから別のポートに転送する

また、SSHポートフォワーディングには次の3つの方式があります。

  • ローカルポートフォワーディング
  • リモートポートフォワーディング
  • ダイナミックフォワーディング

ダイナミックフォワーディングに関しては、プロキシのようなモノになります。
そのため、ここでは対象外とします。

それ以外のモノは、ポート転送の方向が異なります。
上記の「2.あるポートから別のポートに転送する」にあたる処理部分です。

ローカルポートフォワーディングとは、
ロカールマシンのポートからリモートマシンのポートに転送することです。

リモートポートフォワーディングとは、
リモートマシンのポートからロカールマシンのポートに転送することです。

冒頭の問題は、ローカルポートフォワーディングで対応することになります。

以上、SSHポートフォワーディングについて説明しました。
次は、実際にSSHポートフォワーディングの設定を行います。

SSHポートフォワーディングの設定

システム環境は、次の設定とします。
(リモートマシンには、ユーザーtest_userを使ってパスワード認証でログインします)


ロカールマシンリモートマシン
OSWindows 10Ubuntu 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ポートフォワーディングの動作確認を説明しました。

タイトルとURLをコピーしました