Firewalld 教程:IDC 常用端口放行与拦截策略
搞 IDC 运维的,最烦的就是防火墙规则配错导致服务挂了,或者被恶意 IP 扫端口后直接打穿。别慌,这篇 Firewalld 教程直接上实战命令,从 SSH、HTTP、MySQL 端口放行,到封禁恶意 IP、排查 SELinux 冲突,一步到位。不管你是刚入行的 Linux 新手,还是被客户扯皮的运维老哥,照着操作就行。

一、Firewalld 基础操作:先别急着改规则
很多人在主机选看 Linux 教程时,上来就 `firewall-cmd –add-port`,结果重启后规则丢了。Firewalld 默认分 runtime(临时)和 permanent(永久)两种模式,不改 permanent 等于白干。
1. 查看当前默认区域和已放行端口
firewall-cmd –get-default-zone # 默认一般是 public
firewall-cmd –list-all # 列出当前区域所有规则
2. 永久放行一个端口(以 SSH 22 端口为例)
firewall-cmd –zone=public –add-port=22/tcp –permanent
firewall-cmd –reload # 重载配置,使永久规则生效
老鸟叮嘱:千万别在远程 SSH 窗口里直接 `–add-port=22/tcp` 而不加 `–permanent`,万一你切了 zone 或重启 firewalld,SSH 端口会被立刻关闭,你就只能去机房或 IPMI 救机器了。
二、IDC 常用端口放行实战
IDC 服务器最常见的端口就是 HTTP(80)、HTTPS(443)、MySQL(3306),以及一些自定义服务。下面直接给命令,别问为什么,照着敲。
1. 放行 HTTP 和 HTTPS
firewall-cmd –zone=public –add-service=http –permanent
firewall-cmd –zone=public –add-service=https –permanent
firewall-cmd –reload
2. 放行 MySQL 端口(仅限特定来源 IP)
生产环境绝对不能把 MySQL 3306 端口对全网开放,否则就是找打。
firewall-cmd –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.100″ port protocol=”tcp” port=”3306″ accept’ –permanent
firewall-cmd –reload
3. 放行自定义端口(例如 8080)
firewall-cmd –zone=public –add-port=8080/tcp –permanent
firewall-cmd –reload
排障区:放行端口后服务仍然连不上?先检查 SELinux,再检查云服务商的安全组。很多 VPS 厂商的防火墙是独立于系统 Firewalld 的,两头都得放行。
三、恶意 IP 拦截策略:别等被打穿了再后悔
IDC 运维中,经常有 IP 疯狂扫端口或暴力破解 SSH。Firewalld 的 rich-rule 可以直接封禁,比 iptables 省事。
1. 封禁单个恶意 IP
firewall-cmd –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”10.0.0.5″ drop’ –permanent
firewall-cmd –reload
2. 封禁整个 C 段(/24)
firewall-cmd –zone=public –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.0/24″ drop’ –permanent
firewall-cmd –reload
3. 查看被封禁的 IP 列表
firewall-cmd –zone=public –list-rich-rules
老鸟叮嘱:封禁前一定要确认这个 IP 不是你自己的跳板机或 CDN 节点,否则封完自己进不去,只能叫机房重启。
四、SELinux 与 Firewalld 的冲突排障
很多 Linux 小白遇到端口放行后服务还是连不上,第一反应是 Firewalld 没配好,其实八成是 SELinux 在搞鬼。
1. 临时关闭 SELinux(排障用,别长期关)
setenforce 0
2. 永久关闭 SELinux(不推荐但可以应急)
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
重启生效
3. 正确做法:放行 SELinux 对端口的上下文
semanage port -a -t http_port_t -p tcp 8080 # 放行 8080 端口给 httpd 用
排障区:如果 `semanage` 命令找不到,先装 `policycoreutils-python-utils` 包。
五、FAQ:Firewalld 实战常见问题
Q1: Firewalld 放行端口后,外部还是访问不了怎么办?
A: 先确认 Firewalld 是否在运行(`systemctl status firewalld`),再检查 SELinux 状态(`getenforce`),最后看云服务商的安全组或网络 ACL 有没有放开。
Q2: 怎么临时放行一个端口,不写入永久规则?
A: 去掉 `–permanent` 参数即可,例如 `firewall-cmd –add-port=8080/tcp`。服务器重启或 `firewall-cmd –reload` 后规则会丢失。
Q3: Firewalld 和 iptables 哪个更好用?
A: 新版 CentOS/RHEL 默认用 Firewalld,配置更直观。但如果你习惯 iptables 语法,可以 `systemctl mask firewalld` 后换回 iptables。
Q4: 封禁 IP 后,怎么解除?
A: 用 `firewall-cmd –permanent –remove-rich-rule` 删除对应规则,然后重载。
Q5: Firewalld 规则太多会不会影响性能?
A: 规则数量在几百条以内基本无感。如果上万条,建议用 nftables 代替。
Q6: 为什么我放行了 MySQL 3306 端口,远程还是连不上?
A: 确认 MySQL 配置文件 `/etc/my.cnf` 中 `bind-address` 是否设置为 `0.0.0.0`,默认只监听 127.0.0.1。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9493.html 商家投稿邮箱:zhujixuanblog@qq.com
