MySQL/MariaDB服务器:绑定到多个IP地址

时间:2020-01-09 10:46:01  来源:igfitidea点击:

我在FreeBSD/Linux服务器上运行MySQL/MariaDB数据库系统。服务器具有多个IP地址。许多网站使用的mysqld托管在其他两个基于CentOS Linux的服务器上。如何将在Linux或者类Unix服务器上运行的MySQL服务器绑定到多个IP地址,例如192.54.1.2、192.54.1.10和192.54.1.15。如何将mysqld绑定到多个IP?

简短答案不能。
您不能在FreeBSD或者类似Linux/Unix的操作系统上运行的MySQL数据库服务器下绑定多个IP地址。

长答案

MySQL服务器在单个网络套接字上侦听TCP/IP连接。
该套接字绑定到一个地址,但是一个地址可以映射到多个网络接口。
默认地址是0.0.0.0。
要显式指定地址,请在服务器启动时使用bind-address = addr选项,其中addr是IPv4地址或者主机名。
如果addr是主机名,则服务器将名称解析为IPv4地址并绑定到该地址。
服务器按以下方式处理不同类型的地址:

  • 如果地址为0.0.0.0,则服务器在所有服务器主机IPv4接口上接受TCP/IP连接。
  • 如果该地址是常规IPv4地址(例如127.0.0.1),则服务器仅接受该特定IPv4地址的TCP/IP连接。

使用防火墙

请考虑以下设置:

+----------------------------------------------------------+
|                   +==========Server_IP1 192.54.1.2       |
|  +--------+       |                                      |
|  | mysqld +-------+==========Server_IP2 192.54.1.10      +-------> LAN/WAN ---->
|  +--------+       |                                      |
|  Server_IP0       +==========Server_IP3 with 192.54.1.15 |
|  192.54.1.1                                              |
+----------------------------------------------------------+
           UNIX/Linux Box called db1.theitroad.local

其中:

  • Mysqld服务器将绑定到所有接口上的所有IP。
  • 使用防火墙控制对在此服务器上运行的mysqld的访问。确保仅允许连接到192.54.1。{2,10,15} tcp端口#3306

配置

您可以在my.cnf中设置bind-address指令。
编辑/etc/my.cnf或者/usr/local/etc/my.cnf,运行:

# vi /usr/local/etc/my.cnf

或者

# vi /etc/my.cnf

将地址设置为0.0.0.0:

bind-address    = 0.0.0.0

确保删除以下行或者注释掉以下行:

#skip-networking

保存并关闭文件。
接下来,设置防火墙,并允许仅从中选择IP或者从中选择IP。

Linux iptables规则

阻止除192.54.1.2、192.54.1.10和192.54.1.15以外的所有与mysqld TCP端口3306的传入连接:

### Now, allow 192.54.1.2, 192.54.1.10, and 192.54.1.15 ###
/sbin/iptables -A INPUT -p tcp -s 192.54.1.2 --dport 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -s 192.54.1.10 --dport 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -s 192.54.1.15 --dport 3306 -j ACCEPT
## Block all connections to 3306 ##
/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP

或者

## Block all connections to 3306 except for three ips##
/sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.54.1.2 -j DROP
/sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.54.1.10 -j DROP
/sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.54.1.15 -j DROP

保存设置:

# service iptables save

执行以下命令以验证新设置:

echo -e "target     prot opt source               destination\n$(iptables -L INPUT -n | grep 3306)"

输出示例:
MySQL服务器:iptables否定了iptables的范围

pf防火墙规则

在/etc/pf.conf中使用以下语法:

## our interface ##
ext_if="vr0"
 
## do not block mysqld on ##
mysqld_ip="{ !192.54.1.2, !192.54.1.10, !192.54.1.15 }"
 
## Block everything for tcp port number 3306 except $mysqld_ip  ###
block in on $ext_if proto tcp from any to  $mysqld_ip port 3306

使用pf.conf文件加载更新的防火墙规则:

# pfctl -f /etc/pf.conf

显示当前规则集,执行:

# pfctl -sr
# pfctl -sr | grep 3306

输出示例:
BSD PF防火墙阻止了除少数IPS到MySQL端口之外的所有IP

添加/更新mysql服务器用户和权限设置

让我们假设您总是与来自远程IP的192.54.1.10建立连接,而该远程IP则与用于用户bar的名为foo的现有mysqld数据库有关,要授予对该IP地址的访问权限,请在mysql服务器192.54.1.1上执行以下命令:

mysql> update db set Host='192.54.1.10' where Db='foo';
mysql> update user set Host='192.54.1.10' where user='bar';

重新启动/重新加载mysql服务器

执行以下命令以重新启动mysqld。
如果您在Red Hat Enterprise Linux上和朋友一起使用:

# service mysqld restart

Debian Linux和朋友使用以下命令:

# service mysql restart

FreeBSD unix用户执行以下命令以重新启动mysql服务器:

# /usr/local/etc/rc.d/mysql-server stop && /usr/local/etc/rc.d/mysql-server start

如何测试我的设置?

从客户端(192.54.1.10)执行以下命令以连接到192.54.1.1:3306,执行:

[[email protected] ]$ mysql -u foo -h 192.54.1.1 -P 3306 -p bar

其中:

  • -u foo:连接到服务器时要使用的MySQL用户名。
  • -h 192.54.1.1:连接到给定主机/IP地址上的MySQL服务器。
  • -P 3306:用于连接的TCP/IP端口号。
  • bar:数据库名称。