我有一个在端口 3306 上运行的 MySQL 服务器,其私有 IP:10.64.30.117。我还有一个 Web 应用程序在另一个节点上运行,其私有 IP:10.17.23.1。
我希望 Web 应用程序能够访问 MySQL 服务器,但我不希望 MySQL 公开可用。 (两个节点也有一个公共IP)。
我尝试使用 UFW 但它似乎阻止了所有内容,该ufw status
命令显示以下内容:
To Action From
-- ------ ----
3306 DENY Anywhere
3306 ALLOW 10.0.0.0/8
3306 ALLOW 10.0.0.0/24
3306 (v6) DENY Anywhere (v6)
完整的ifconfig
样子如下:
$ ifconfig
ens2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.64.30.117 netmask 255.255.255.254 broadcast 10.64.30.117
inet6 2001:xxxx:xxxx:xxx::1 prefixlen 127 scopeid 0x0<global>
inet6 fe80::dc1c:3cff:fe32:203b prefixlen 64 scopeid 0x20<link>
ether de:1c:3c:32:20:3b txqueuelen 1000 (Ethernet)
RX packets 363358 bytes 1082623290 (1.0 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 310592 bytes 37970748 (37.9 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2844 bytes 779466 (779.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2844 bytes 779466 (779.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
笔记:这些私有 IP 可以更改,因此我无法对它们进行硬编码。
还有其他方法可以在 UFW 或 iptables 中设置它吗?
答案1
你没有说你正在使用什么发行版,但我相信你的所有规则都存储在这个文件中:
$ sudo cat /etc/ufw/user.rules
您应该能够重新排列此文件的内容,以便具有 ALLOW 规则的私有 CIDR 排在第一位,而 DENY 规则则作为列表中的最后一项。如果您成功地重新排列了内容,该sudo ufw status
命令将显示您的规则,如下所示:
3306 ALLOW 10.0.0.0/8
3306 ALLOW 10.0.0.0/24
3306 DENY Anywhere
3306 (v6) DENY Anywhere (v6)
参考
答案2
防火墙的替代(或补充)策略是遵循没有不必要的服务/配置的黄金法则,因此首先不要让 Mysql 在公共地址中应答。
这里建议的策略是绑定/使Mysql守护进程/服务仅监听私有IP地址。
编辑my.cnf
和使用:
bind-address=10.64.30.117
正如您提到的 ip 地址更改一样,您可以将此指令与 /etc/hosts 中定义的主机名一起使用,并在(重新)启动 Mysql 之前更改它。 (或者使用它存在的私有 DNS 名称)
然后重新启动Mysql守护进程,设备将不再监听其他IP地址的请求。
PS 作为奖励,这样您就不必担心公共 IP 地址的变化。至于私有 IP 地址的更改,必须通过强制网络设置、使用虚拟 IP 地址或动态更改配置文件来解决。
PPS 这一原则也适用于其他服务,例如 Web 服务器后面的 Tomcat。仅当客户端驻留在同一台机器/VM 中时,您也可以将服务绑定到 localhost
另外,对于处理 IP 地址更改,请参阅相关问题如何处理 ISP 更改的 IP 地址?