# SSHトンネル経由でデータベースに接続する

Source: https://support.kapsulehost.com/ja-jp/database-ssh-tunnel

データベースはサーバー自身のループバックアドレスでしか待ち受けていないため、TablePlus、Sequel Ace、DBeaver、MySQL Workbenchなどのデスクトップツールから直接接続することはできません。SSHトンネルを使うと、これらのツールにデータベースへ転送されるローカルポートが与えられます。これにより、MySQLをインターネットに公開することなく、適切なGUIでデータにアクセスできるようになります。

## トンネルが必要な理由

**ウェブサイト** を開き、サイトをクリックしてから **データベース** を選択します。**接続情報** カードには、ホストが`127.0.0.1`、ポートが`3306`と表示されます。これは仮の値ではありません。データベースは実際に、稼働しているマシンからの接続しか受け付けません。公開インターネット上のどこからもポート3306には到達できず、これによって攻撃の経路がまるごと一つ排除されます。

SSHトンネルはこのギャップを安全に埋めます。SSHクライアントがお使いのノートパソコン上にポートを開き、そこに送るすべての通信を暗号化し、あたかもローカルプロセスが接続したかのように、サーバー内部からデータベースへ渡します。

![KPanelで接続情報を表示するDatabaseタブ](https://support.kapsulehost.com/help/screenshots/database-ssh-tunnel.84df4ba6.webp)

## 事前に必要なもの

> **Note:** トンネルはSSH接続そのものなので、これらを行う前にサイトに対してSSHキーが登録されている必要があります。まず[サイトへのSSHキーの追加](https://support.kapsulehost.com/ja-jp/adding-ssh-keys)を参照してから、ここに戻ってきてください。

次の4つを揃えてください。

- **SSHのホスト、ポート、ユーザー名**: **設定** の **SSH キー** 内にある **接続情報** カードから取得します。
- **データベース名、ユーザー名、パスワード**: **データベース** から取得します。目のアイコンをクリックするとパスワードが表示され、コピーアイコンでクリップボードにコピーできます。

Databaseタブに **No database provisioned for this site type** と表示されている場合、このサイトにはデータベースがありません。静的サイトや一部のNode.jsサイトはデータベースなしで作成されます。

## ターミナルからトンネルを開く

基本的な考え方は、SSH接続の先にある`127.0.0.1:3306`にローカルポートを転送する、というものです。

```sh
ssh -N -L 3307:127.0.0.1:3306 <ssh-username>@<ssh-host> -p <ssh-port>
```

- `-L 3307:127.0.0.1:3306`は、お使いのマシンでポート3307を開き、サーバーのループバックインターフェース上のポート3306へ転送します。
- `-N`は、シェルを起動せずトンネルだけを開いたままにする、という指定です。
- このサイト用のキーがデフォルトのキーでない場合は、`-i /path/to/key`を追加してください。

そのターミナルウィンドウは開いたままにしておきます。開いている間は、お使いのノートパソコン上の`127.0.0.1:3307`がサイトのデータベースそのものになります。

> **Tip:** ローカル側では3306ではなく3307を使用してください。自分のマシンにMySQLやMariaDBがインストールされている場合、すでに3306が使われているため、トンネルのバインドに失敗し「address already in use」というエラーになります。空いているローカルポートであればどれでも構いません。

## データベースクライアントをトンネルに向ける

お使いのGUIクライアントで、以下の値を使って通常のMySQL接続を作成してください。

| 項目 | 値 |
|---|---|
| Host | `127.0.0.1` |
| Port | `3307`（転送したローカルポート） |
| User | Databaseタブの **Username** |
| Password | Databaseタブの **Password** |
| Database | Databaseタブの **データベース** 名 |

Hostの欄にSSHホストを入力しないでください。クライアントから見ると、これは自分自身のマシン上のデータベースと通信していることになります。

### SSHタブが組み込まれたクライアント

TablePlus、Sequel Ace、DBeaver、MySQL Workbenchはいずれもトンネル自体をクライアント側で管理できるため、ターミナルを開いたままにしておく必要がありません。2つのグループの項目を入力します。

- **SSHセクション**: SSH キー ページにあるホスト、ポート、ユーザー名、秘密鍵ファイル。
- **データベースセクション**: ホスト`127.0.0.1`、ポート`3306`、それにDatabaseタブのデータベース名、ユーザー、パスワード。

クライアントがトンネルを張る場合、データベースセクションにはローカルの転送先ポートではなく`3306`を使用してください。クライアントはサーバー側の視点から接続するため、実際のポートがそのまま見えることになります。

## 代わりにphpMyAdminを使う

テーブルをちょっと見るだけであれば、トンネルは一切不要です。Databaseタブには **phpMyAdmin** カードがあり、**phpMyAdmin を開く** ボタンがあります。KPanelを通じてサインインするため、別途覚えておくパスワードは不要で、新しいタブで開いた時点ですでにこのサイトのデータベースに接続された状態になっています。

閲覧、単発のクエリ実行、値の確認であればphpMyAdminのほうが速く済みます。大きなエクスポート、スキーマ作業、スクリプト化したい作業にはトンネル越しのデスクトップクライアントのほうが向いています。ブラウザ経由の方法については[phpMyAdminの使い方](https://support.kapsulehost.com/ja-jp/sites-phpmyadmin)を参照してください。

## トンネル経由でクエリやダンプを実行する

トンネルを開いた状態であれば、標準的なコマンドラインツールは通常どおり動作し、ローカルの転送先ポートに向けて実行できます。

```sh
mysql -h 127.0.0.1 -P 3307 -u <db-user> -p <db-name>

mysqldump -h 127.0.0.1 -P 3307 -u <db-user> -p <db-name> > backup.sql
```

> **Warning:** 手動でのダンプは便利なコピーであって、バックアップ戦略ではありません。実行した瞬間の状態しか反映されておらず、実行したノートパソコン上にしか存在しません。KapsuleHostはすでにサイトの自動日次バックアップを取得しており、30日間保持しています。ローカルの`.sql`ファイルに頼る前に[バックアップの取得](https://support.kapsulehost.com/ja-jp/taking-a-backup)を参照してください。

## トラブルシューティング

**トンネルを開く際に「Address already in use」と表示される。** そのローカルポートはすでにお使いのマシン上の何かが使用しています。別のポート、たとえば`-L 3399:127.0.0.1:3306`を選び、クライアント側のポート設定も合わせて変更してください。

**データベースクライアントから「Connection refused」と表示される。** トンネルが立ち上がっていません。SSHのターミナルがまだ動作しており、エラーを出力していないことを確認し、クライアント側のポートが`-L`引数のローカルポートと一致しているか確認してください。

**SSHは接続できるのに、クライアント側はタイムアウトしてしまう。** 転送先が`127.0.0.1:3306`になっていて、公開ホスト名になっていないことを確認してください。公開名への転送は、サーバーにインターネット経由でデータベースへ到達するよう求めることになり、これはまさにブロックされている動作です。

**「Access denied for user」と表示される。** SSHのログイン自体は成功していますが、MySQLの認証情報が間違っています。ユーザー名とパスワードは打ち直さず、コピーアイコンを使ってDatabaseタブから再度コピーし、接続先のデータベース名が正しいかも確認してください。

**MySQLにたどり着く前に「Permission denied (publickey)」が出る。** これはデータベースの問題ではなくSSH層の問題です。[サイトへのSSHキーの追加](https://support.kapsulehost.com/ja-jp/adding-ssh-keys)内のトラブルシューティングの項を確認してください。

## 次に読むべき記事

- [SFTPによるファイルのアップロード](https://support.kapsulehost.com/ja-jp/sftp-access)は、ファイル転送に同じSSH認証情報を使用します。
- ブラウザ上でのデータベース作業には[phpMyAdminの使い方](https://support.kapsulehost.com/ja-jp/sites-phpmyadmin)を参照してください。
- クエリの実行が想定より影響範囲を広げてしまった場合は[バックアップからの復元](https://support.kapsulehost.com/ja-jp/restoring-from-backup)を参照してください。
