目次:
デフォルトでは、MySQLサーバーはlocalhostからの接続のみをリッスンします。つまり、同じホストで実行されているアプリケーションからのみアクセスできます。
ただし、状況によっては、リモートロケーションからMySQLサーバーにアクセスする必要があります。 たとえば、ローカルシステムからリモートMySQLサーバーに接続する場合、またはデータベースサーバーとは異なるマシンでアプリケーションが実行されているマルチサーバー展開を使用する場合。 1つのオプションは、SSHトンネルを介してMySQLサーバーにアクセスすることであり、別のオプションは、リモート接続を受け入れるようにMySQLサーバーを構成することです。
このガイドでは、MySQLサーバーへのリモート接続を許可するために必要な手順を説明します。 MariaDBにも同じ手順が適用されます。
MySQLサーバーの構成
最初のステップは、マシン上の特定のIPアドレスまたはすべてのIPアドレスでリッスンするようにMySQLサーバーを設定することです。
MySQLサーバーとクライアントがプライベートネットワークを介して相互に通信できる場合、最良のオプションは、プライベートIPでのみリッスンするようにMySQLサーバーを設定することです。 それ以外の場合、パブリックネットワーク経由でサーバーに接続する場合は、マシン上のすべてのIPアドレスでリッスンするようにMySQLサーバーを設定します。
そのためには、MySQL構成ファイルを編集し、
bind-address
オプションの値を追加または変更する必要があります。 単一のIPアドレスとIP範囲を設定できます。 アドレスが
0.0.0.0
場合、MySQLサーバーはすべてのホストIPv4インターフェースで接続を受け入れます。 システムでIPv6が構成されている場合、
0.0.0.0
代わりに
::
使用します。
MySQL構成ファイルの場所は、ディストリビューションによって異なります。 UbuntuおよびDebianでは、ファイルは
/etc/mysql/mysql.conf.d/mysqld.cnf
にありますが、CentOSなどのRed Hatベースのディストリビューションでは、ファイルは
/etc/my.cnf
ます。
テキストエディターでファイルを開きます。
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address
で始まる行を検索し、その値をMySQLサーバーがリッスンするIPアドレスに設定します。
デフォルトでは、値は
127.0.0.1
設定されます(localhostでのみリッスンします)。
この例では、値を
0.0.0.0
変更して、すべてのIPv4インターフェースでリッスンするようにMySQLサーバーを設定します
bind-address = 0.0.0.0 # skip-networking
skip-networking
を含む行がある場合は、行の先頭に
#
を追加して削除するかコメントアウトします。
MySQL 8.0以降では、
bind-address
ディレクティブが存在しない場合があります。 この場合、以下に追加します
セクション。
完了したら、MySQLサービスを再起動して、変更を有効にします。 rootまたはsudo特権を持つユーザーのみがサービスを再起動できます。
DebianまたはUbuntuでMySQLサービスを再起動するには、次を入力します。
sudo systemctl restart mysql
CentOSなどのRedHatベースのディストリビューションでは、サービスを再起動します。
リモートマシンからユーザーへのアクセスを許可する
次のステップは、リモートユーザーにデータベースへのアクセスを許可することです。
次のように入力して、rootユーザーとしてMySQLサーバーにログインします。
sudo mysql
mysql -uroot -p
MySQLシェル内から
GRANT
ステートメントを使用して、リモートユーザーにアクセスを許可します。
GRANT ALL ON database_name.* TO user_name@'ip_address' IDENTIFIED BY 'user_password';
どこ:
-
database_name
は、ユーザーが接続するデータベースの名前です。user_name
は、MySQLユーザーの名前です。ip_address
は、ユーザーが接続するIPアドレスです。%
を使用して、ユーザーが任意のIPアドレスから接続できるようにします。user_password
はユーザーパスワードです。
たとえば、IP
10.8.0.5
クライアントマシンからパスワード
my_passwd
を持つ
foo
という名前のユーザーにデータベース
dbname
へのアクセスを許可するには、次を実行します。
GRANT ALL ON dbname.* TO foo@'10.8.0.5' IDENTIFIED BY 'my_passwd';
ファイアウォールの構成
最後のステップは、リモートマシンからポート
3306
(MySQLのデフォルトポート)のトラフィックを許可するようにファイアウォールを構成することです。
Iptables
sudo iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT
特定のIPアドレスからのアクセスを許可します。
sudo iptables -A INPUT -s 10.8.0.5 -p tcp --destination-port 3306 -j ACCEPT
UFW
UFWはUbuntuのデフォルトのファイアウォールツールです。 インターネット上の任意のIPアドレスからのアクセスを許可するには(非常に安全ではない)を実行します。
sudo ufw allow 3306/tcp
特定のIPアドレスからのアクセスを許可します。
sudo ufw allow from 10.8.0.5 to any port 3306
FirewallD
FirewallDは、CentOSのデフォルトのファイアウォール管理ツールです。 インターネット上の任意のIPアドレスからのアクセスを許可するには(非常に安全でない)タイプ:
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --reload
特定のポート上の特定のIPアドレスからのアクセスを許可するには、新しいFirewallDゾーンを作成するか、リッチルールを使用します。
mysqlzone
という名前の新しいゾーンを作成します。
sudo firewall-cmd --new-zone=mysqlzone --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --permanent --zone=mysqlzone --add-source=10.8.0.5/32
sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcp
sudo firewall-cmd --permanent --zone=mysqlzone --add-source=10.8.0.5/32
sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcp
sudo firewall-cmd --reload
変更の検証
リモートユーザーがMySQLサーバーに接続できることを確認するには、次のコマンドを実行します。
mysql -u user_name -h mysql_server_ip -p
ここで、
user_name
はアクセスを許可したユーザーの名前で、
mysql_server_ip
はMySQLサーバーが実行されているホストのIPアドレスです。
すべてが正しくセットアップされていれば、リモートMySQLサーバーにログインできます。
ERROR 2003 (HY000): Can't connect to MySQL server on '10.8.0.5' (111)"
以下のエラーは、ログインしようとしているユーザーがリモートMySQLサーバーにアクセスする権限を持っていないことを示しています。
"ERROR 1130 (HY000): Host '10.8.0.5' is not allowed to connect to this MySQL server"
結論
デフォルトで最も人気のあるオープンソースデータベースサーバーであるMySQLは、ローカルホストでのみ着信接続をリッスンします。
MySQLサーバーへのリモート接続を許可するには、次の手順を実行する必要があります。
- すべてまたは特定のインターフェイスでリッスンするようにMySQLサーバーを構成します。リモートユーザーにアクセスを許可します。ファイアウォールのMySQLポートを開きます。