MySQL ERROR 1130: 'Host is not allowed to connect' の解決方法

intermediate🗄️ MySQL2026-06-05| Linux (Ubuntu/Debian/RHEL), Windows, MySQL 5.7, 8.0, 8.4 LTS

Error Message

ERROR 1130 (HY000): Host '192.168.1.100' is not allowed to connect to this MySQL server
#mysql#データベース管理#リモートアクセス#SQLセキュリティ#ネットワーク

30秒で解決する方法

特定のIPアドレスに今すぐアクセスを許可する必要がある場合は、MySQLが動作しているサーバーで以下のコマンドを実行してください。この例では、クライアントマシンのIPアドレスを 192.168.1.100 と想定しています。

# サーバーにローカルでログイン
mysql -u root -p

# アクセス許可を与える (MySQL 8.0以降の構文)
CREATE USER 'root'@'192.168.1.100' IDENTIFIED BY 'セキュアなパスワード';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.100' WITH GRANT OPTION;
FLUSH PRIVILEGES;

192.168.1.100 を実際のIPアドレスに置き換えてください。'%' を使用して任意のホストからの接続を許可することもできますが、rootアカウントでそれを行うのは、人通りの多い街中で玄関のドアを全開にしておくようなものです。

なぜこのエラーが発生するのか?

パスワードが正しいことやサーバーがオンラインであることは確認済みかもしれません。しかし、DBeaverやTablePlus、またはリモートターミナルから接続しようとした瞬間に、MySQLはアクセスを拒否します。その理由は、MySQLがユーザーを**「ユーザー名 + ホスト名」**の組み合わせで識別しているからです。

mysql.user テーブルにおいて、'admin'@'localhost''admin'@'192.168.1.100' は全く別の存在として扱われます。デフォルトでは、MySQLのセキュリティ設定は非常に厳格です。通常、localhost(サーバー自体)からの接続のみを許可されたrootユーザーしか用意されていません。接続元のIPアドレスが許可リストにない場合、MySQLはパスワードをチェックする前に接続を拒否します。

接続を修正する3つの方法

方法1:専用のリモートユーザーを作成する(推奨)

rootアカウントを外部に公開してはいけません。代わりに、アプリケーションや開発マシン専用の特定のユーザーを作成してください。これにより、データベースのセキュリティを維持しつつ、必要なアクセス権を確保できます。

-- 1. 特定のIP用のユーザーを作成
CREATE USER 'dev_user'@'192.168.1.100' IDENTIFIED BY 'アプリ用パスワード_2024!';

-- 2. 必要なデータベースのみに権限を付与
GRANT ALL PRIVILEGES ON ecommerce_db.* TO 'dev_user'@'192.168.1.100';

-- 3. 変更を確定
FLUSH PRIVILEGES;

方法2:既存のユーザーを任意のホスト用に更新する

安全な開発環境などで、IPアドレスに関係なくユーザーを接続させたい場合は、ワイルドカード % を使用します。MySQL 8.0以降では、システムテーブルを手動で更新する代わりに RENAME USER を使用してください。

-- ホストを 'localhost' からワイルドカード '%' に変更
RENAME USER 'root'@'localhost' TO 'root'@'%';

-- または、ローカル用を残す必要がある場合は新しくグローバルなrootを作成
CREATE USER 'root'@'%' IDENTIFIED BY 'あなたのパスワード';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

セキュリティのヒント: % を許可する場合は、サーバーのクラウドファイアウォール(AWSセキュリティグループなど)で、ポート3306へのアクセスを既知のIPアドレスのみに制限するようにしてください。

方法3:bind-addressの罠を確認する

権限設定が完璧であっても、サーバー自体が外部からのリクエストを「待ち受け」ていないことがあります。MySQLの設定ファイルを開きます。通常、Ubuntuでは /etc/mysql/mysql.conf.d/mysqld.cnf、CentOSでは /etc/my.cnf にあります。

以下の行を探してください:

bind-address = 127.0.0.1

これはMySQLに対し、ローカルのトラフィック以外をすべて無視するように指示しています。これを 0.0.0.0 に変更してすべてのネットワークインターフェースで待ち受けるようにするか、サーバーの内部VPC IPに設定してください。

bind-address = 0.0.0.0

ファイルを保存し、サービスを再起動して変更を適用します:

sudo systemctl restart mysql

接続のテスト

再び複雑なSQL操作に取り組む前に、ネットワーク経路が実際に開いているか確認しましょう。ローカルのクライアントマシンから以下のコマンドを実行してください:

# ポート3306に到達可能か確認
nc -zv サーバーのIPアドレス 3306

"Connection to [IP] 3306 port [tcp/mysql] succeeded!" と表示されれば、ネットワークは正常です。タイムアウトする場合は、ファイアウォールが通信を遮断している可能性が高いです。

トラブルシューティング・チェックリスト

- **クラウド・ファイアウォール:** AWS、Azure、DigitalOceanなどのダッシュボードでポート3306を開放しましたか?
- **ローカル・ファイアウォール:** `ufw status` や `iptables` を確認してください。Windowsの場合は、詳細設定のファイアウォール規則を確認します。
- **動的IP:** 自宅から作業している場合、IPアドレスが毎日変わる可能性があります。ローカルで接続した状態で `SELECT USER();` を実行し、MySQLが現在のホストをどのように認識しているか確認してください。
- **Docker:** コンテナの場合は、`3306:3306` がマッピングされていること、およびユーザーがDockerブリッジのサブネット(多くの場合 `172.17.0.0/16`)からの接続を許可されていることを確認してください。

Related Error Notes