如何在 Linux 中阻止公共端口 (3306) 访问,但允许来自本地网络上其他节点的访问?

如何在 Linux 中阻止公共端口 (3306) 访问,但允许来自本地网络上其他节点的访问?

我有一个在端口 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 地址?

相关内容