MySQL/MariaDB服务器:绑定到多个IP地址
我在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:数据库名称。