如何允许到MySQL数据库服务器的远程连接

时间:2020-03-05 15:30:24  来源:igfitidea点击:

默认情况下,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'。

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”(仅在本地主机中监听)。

在此示例中,我们将值更改为“ 0.0.0.0”,从而将MySQL服务器设置为在所有IPv4接口上进行侦听

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';

其中:

  • “ 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

如果我们将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

FirewallD是CentOS中的默认防火墙管理工具。

要允许从Internet上的任何IP地址访问(非常不安全),请输入:

sudo firewall-cmd --permanent --zone=public --add-port=3306/tcpsudo firewall-cmd --reload

要允许从特定端口上的特定IP地址进行访问,我们可以创建一个新的FirewallD区域,也可以使用一个丰富的规则。
好创建一个名为“ mysqlzone”的新区域:

sudo firewall-cmd --new-zone=mysqlzone --permanentsudo firewall-cmd --reloadsudo firewall-cmd --permanent --zone=mysqlzone --add-source=10.8.0.5/32sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcpsudo firewall-cmd --reload

验证更改

要验证远程用户可以连接到MySQL服务器,请运行以下命令:

mysql -u user_name -h mysql_server_ip -p

其中“ 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"