リモートデータベースアクセス:インターネット全体に公開しない方法
作業用コンピューターから VDS 上のデータベースに接続する 2 つの方法(SSH トンネルと制限付きのポート開放)について、選び方と確認方法を説明します。
更新日 2026年8月23日
0.0.0.0 で待ち受け、パスワードが root のデータベースは、最初のスキャンまでしか生き残れません。しかも、アドレス範囲全体は常時スキャンされています。一方で、ノートパソコンからクライアントでデータベースに接続するのは便利であり、しばしば必要でもあります。方法は2つあり、デメリットがないのはそのうち1つだけです。
方法1: SSHトンネル(推奨)
データベースは 127.0.0.1 にバインドされたままになり、外部に公開されるのはSSHだけです。自分のパソコンで:
ssh -L 5433:127.0.0.1:5432 root@YOUR_ADDRESS -N
ssh -L 3307:127.0.0.1:3306 root@YOUR_ADDRESS -N
あとはDBeaver、TablePlus、psqlで 127.0.0.1:5433 に接続します。データベース側から見ると、これはローカル接続のように見えます。
ほとんどのクライアントはトンネルを自分で設定できます。接続設定に「SSH」タブがあります。コントロールパネルの「概要」 /hosting/vds/m/<id> にあるマシンのアドレスと、自分の鍵を指定してください。
この方法の利点は、データベースやファイアウォールの設定を何も変更する必要がないことです。
方法2: 制限付きの開放ポート
これは最後の手段です。静的なアドレスが判明している外部サービスが接続する場合に使います。以下の手順はすべて必須です:
ufw allow from 203.0.113.10 to any port 5432 proto tcp
PostgreSQLの場合: listen_addresses = '*' と、pg_hba.conf に hostssl all all 203.0.113.10/32 scram-sha-256 の行を追加します。MySQLの場合: bind-address = 0.0.0.0 と、特定のアドレスにバインドしたユーザーを設定します:
CREATE USER 'app'@'203.0.113.10' IDENTIFIED BY 'long-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'203.0.113.10';
TLSなしでは、このような接続はデータを平文で送信します。送信元を指定しない ufw allow 5432 は、まさに「インターネット全体に開放する」という意味です。
確認
別のマシンから:
nmap -Pn -p 3306,5432,6379,27017 YOUR_ADDRESS
期待される応答は、すべてのポートで filtered または closed です。ローカルでは、何がどこで待ち受けているかを確認します:
ss -tulpn | grep -E '3306|5432|6379'
よくある間違い
| 症状 | 原因 |
|---|---|
| クライアントがトンネル経由で接続できない | ローカルポートが使用中 — 別のポートを選んでください |
Host ... is not allowed to connect | MySQLユーザーが localhost にバインドされている |
no pg_hba.conf entry for host | 自分のアドレスに対するルールがない |
| ポートは開いているのに応答がない | データベースが 127.0.0.1 でのみ待ち受けている |
| 動いていたのに止まった | プロバイダーが動的アドレスを割り当てている — トンネルを使うべきもう1つの理由 |
マシンにはIPv6も、2つ目のアドレスもありません。「概要」にある単一のパブリックIPv4アドレスに対してすべてのルールを記述してください。2つのスタックによる混乱は起きません。