默认情况下,MySQL 服务器仅侦听来自本地主机的连接,这意味着它只能由同一主机上运行的应用程序访问。
然而,在某些情况下,需要从远程位置访问MySQL服务器。例如,您可能需要从本地系统或多服务器部署连接到远程 MySQL 服务器,其中应用程序与数据库服务器运行在不同的计算机上。一种选择是访问通过 SSH 隧道的 MySQL 服务器,另一个是配置MySQL服务器接受远程连接。
本文介绍了允许远程连接到 MySQL 服务器所需的步骤。相同的说明适用于 MariaDB。
配置 MySQL 服务器#
第一步是将MySQL服务器设置为侦听特定IP地址或机器上的所有IP地址。
如果MySQL服务器和客户端可以通过私有网络进行通信,最好的选择是将MySQL服务器设置为仅侦听私有IP。
否则,如果要通过公共网络连接到服务器,请将 MySQL 服务器设置为侦听计算机上的所有 IP 地址。为此,您需要编辑 MySQL 配置文件并添加或更改bind-address
选项。您可以设置单个 IP 地址和 IP 范围。如果地址是0.0.0.0
,MySQL 服务器接受所有主机 IPv4 接口上的连接。如果您的系统上配置了 IPv6,则无需0.0.0.0
, use ::
.
MySQL 配置文件的位置因发行版而异。在 Ubuntu 和 Debian 中,该文件位于/etc/mysql/mysql.conf.d/mysqld.cnf
,而在基于 Red Hat 的发行版(例如 CentOS)中,该文件位于/etc/my.cnf
.
使用您的打开文件文本编辑器
:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
搜索以以下内容开头的行bind-address
并将其值设置为 MySQL 服务器应侦听的 IP 地址。
默认情况下,该值设置为127.0.0.1
(仅在本地主机中侦听)。
在此示例中,我们将设置 MySQL 服务器以侦听所有 IPv4 接口,方法是将值更改为0.0.0.0
mysqld.cnf
bind-address = 0.0.0.0
# skip-networking
如果有一行包含skip-networking
,删除它或通过添加注释掉它#
在该行的开头。
在 MySQL 8.0 及更高版本中,bind-address
指令可能不存在。在这种情况下,将其添加到[mysqld]
部分。
完成后,重新启动 MySQL 服务以使更改生效。仅 root 或具有以下权限的用户sudo权限可以重启服务。
要在 Debian 或 Ubuntu 上重新启动 MySQL 服务,请键入:
sudo systemctl restart mysql
在基于 RedHat 的发行版(例如 CentOS)上重新启动服务运行:
sudo systemctl restart mysqld
从远程计算机授予用户访问权限#
下一步是允许远程用户访问数据库。
以 root 用户身份登录 MySQL 服务器,输入:
sudo mysql
如果您使用旧的本机 MySQL 身份验证插件以 root 身份登录,请运行以下命令并在出现提示时输入密码:
mysql -uroot -p
从 MySQL shell 内部,使用GRANT
声明给授予访问权限给远程用户。
GRANT ALL ON database_name.* TO user_name@'ip_address' IDENTIFIED BY 'user_password';
Where:
-
database_name
是用户将连接到的数据库的名称。
-
user_name
是 MySQL 用户的名称。
-
ip_address
is the IP地址用户将从其中进行连接。使用%
允许用户从任何 IP 地址进行连接。
-
user_password
是用户密码。
例如,授予对数据库的访问权限dbname
给一个名为foo
有密码my_passwd
从具有 IP 的客户端计算机10.8.0.5
,你会运行:
GRANT ALL ON dbname.* TO foo@'10.8.0.5' IDENTIFIED BY 'my_passwd';
配置防火墙#
最后一步是配置防火墙以允许端口上的流量3306
(MySQL 默认端口)来自远程计算机。
iptables#
如果您正在使用iptables作为您的防火墙,以下命令将允许从 Internet 上的任何 IP 地址访问 MySQL 端口。这是非常没有安全感的。
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中默认的防火墙工具。要允许从 Internet 上的任何 IP 地址进行访问(非常不安全),请运行:
sudo ufw allow 3306/tcp
允许来自特定IP地址的访问:
sudo ufw allow from 10.8.0.5 to any port 3306
防火墙D#
防火墙D是CentOS中默认的防火墙管理工具。要允许从 Internet 上的任何 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 --reload
验证更改#
要验证远程用户是否可以连接到 MySQL 服务器,请运行以下命令:
mysql -u user_name -h mysql_server_ip -p
Where user_name
是您授予访问权限的用户的名称,并且mysql_server_ip
是MySQL服务器运行的主机的IP地址。
如果一切设置正确,您将能够登录远程 MySQL 服务器。
如果您收到如下错误,那么3306端口未开放,或者 MySQL 服务器不是监听IP地址
.
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 端口。
如果您有疑问,请随时在下面发表评论。