MySQLのエラー『エラー1130: Host Not Allowed to Connect』の解決方法

MySQLのエラー『エラー1130: Host Not Allowed to Connect』の解決方法

MySQLで「エラー1130: Host ‘xxx.xxx.xxx.xxx’ is not allowed to connect to this MySQL server」が発生する場合は、接続元ホストに対してMySQLのアクセス権限が付与されていないことが原因。主にリモート接続時に起こる。

1. エラーの具体的な内容

ERROR 1130 (HY000): Host '192.168.1.100' is not allowed to connect to this MySQL server

接続元ホスト(例:192.168.1.100)からMySQLサーバーへの接続が拒否されている状態。

2. 発生条件

  • MySQLのユーザーにホスト制限がかかっている
  • `bind-address`の設定により、リモートから接続できない
  • ファイアウォールやネットワーク制限により通信が遮断されている
  • MySQLサーバーが特定ホストからの接続を許可していない

3. ユーザーのホスト設定を確認する

SELECT Host, User FROM mysql.user WHERE User = 'example_user';

ホストが`localhost`や`127.0.0.1`になっていると、リモート接続できない。

4. ホストをワイルドカードで許可する

ユーザーのホストを`%`に設定すると任意のホストからの接続が可能になる。

CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'example_user'@'%';
FLUSH PRIVILEGES;

既存ユーザーのホスト設定を変更したい場合:

UPDATE mysql.user SET Host = '%' WHERE User = 'example_user';
FLUSH PRIVILEGES;

5. MySQL設定ファイルのbind-addressを確認

デフォルトではローカルホストにバインドされていることが多い。

# /etc/mysql/my.cnf または /etc/mysql/mysql.conf.d/mysqld.cnf

bind-address = 0.0.0.0

0.0.0.0に設定することで、全てのIPアドレスからの接続を許可する。

6. ファイアウォールの設定を確認

MySQLのデフォルトポート(3306)がブロックされていると接続できない。

sudo ufw allow 3306

CentOSなどfirewalld使用環境では以下を使用:

sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload

7. ネットワーク接続を確認する

pingやtelnetでポートの開放状況を確認:

ping mysql_server_ip
telnet mysql_server_ip 3306

接続できない場合は、ルーターやクラウド環境のセキュリティグループも確認。

8. 接続先ホスト名がDNSで解決されていない

ホスト名ではなくIPアドレスでの接続を試みる:

mysql -u example_user -p -h 192.168.1.100

9. Docker環境での接続制限

MySQLコンテナに接続する際、`docker-compose.yml`の設定に注意:

ports:
  - "3306:3306"
environment:
  - MYSQL_ROOT_HOST=%

ホスト制限に`%`を指定していないと接続できない。

10. MySQLログを確認して原因を特定する

詳細な原因を調査するにはログを確認する。

tail -f /var/log/mysql/error.log

11. クラウド環境(AWS, GCP等)のセキュリティ設定

パブリックIP経由でアクセスする場合は、セキュリティグループやファイアウォールで3306ポートの許可が必要。

AWS例:

  • セキュリティグループでインバウンドルールに3306を追加
  • アクセス元IPを制限する(0.0.0.0/0ではなく、信頼できるIPに限定)

12. mysql_native_password認証の使用

MySQL 8.0では認証方式の違いで接続できないこともある。以下で変更可能。

ALTER USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

MySQLクライアントやドライバのバージョンが古い場合に有効。