作为 linux 防火墙软件,一直都不太习惯使用,大多使用服务商的安全组来配置端口、ip 放行规则。

有台服务器被同事添加了防火墙规则,导致数据库远程无法访问。网上找到 iptables 添加规则的指令

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 3306 -j ACCEPT

-A 后面是 INPUT 或 OUTPUT,分别表示入站规则和出站规则; -p 后面是使用的协议;--dport 后面是放行或禁用的端口;-j 后面一般是 ACCEPT 或 REJECT,分别表示接受和拒绝,对应放行规则和禁用规则。

后面是保存 iptables 设置并重启使之生效的指令:

service iptables save
service iptables restart
# 查看规则
iptables -L -n

指令的结果就是找不到 iptables 服务,一直尝试都没有用:ubuntu Failed to start iptables.service: Unit iptables.service not found.

此时我也意识到了管理 iptables 的指令好像在 centos 和 ubuntu 中不一样,搜索 ubuntu 下重启 iptables 服务,果然,ubuntu 下使用了 ufw 指令来控制 iptables 服务:

# 查看状态
ufw status
# 启用防火墙
ufw enable
# 禁用防火墙
ufw disable
# 重新加载防火墙
ufw reload

重载防火墙后,依然不能远程连接数据库。查看防火墙规则发现,存在 禁用 3306 的规则存在,我新添加的 放行 3306 规则明显没有起作用。

这时最直接的方法就是删除那条禁用的规则:

# 查看每条规则 chain 的列号
iptables -L -n --line-number
...
16   REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3306 reject-with icmp-port-unreachable
...
# 删除规则,需要指定是入站规则还是出站规则
iptables -D INPUT 16

此时再次重载防火墙,尝试远程连接数据库,好了!