Linux 防火墙配置实战:从 ufw 到 firewalld,开放端口与放行服务不再踩坑

很多人装好 Linux 服务器,第一步想做的是「开个端口跑服务」,结果要么服务起不来,要么外网死活连不上——十有八九是防火墙挡了。Linux 防火墙并不玄学,主流就两套:Debian / Ubuntu 系的 ufw,和 RHEL / CentOS 系的 firewalld。本文带你把这两套搞明白,开放端口、放行服务、查看规则一次说清,并顺带讲清它们背后的 iptables / nftables 关系,避免你改了半天发现互相覆盖。

一、先看清本机用的是哪套防火墙

不同发行版默认防火墙不同。Ubuntu 和 Debian 默认用 ufw(Uncomplicated Firewall,本质是 iptables / nftables 的封装);CentOS 7+、Rocky、Alma 默认用 firewalld(基于 nftables)。先确认:systemctl status ufwsystemctl status firewalld,谁在跑就用谁,别两套混着改,否则规则互相打架、排查时一头雾水。可以用 sudo ufw status 看 ufw 是否激活,用 firewall-cmd --state 看 firewalld 是否运行;想交叉验证底层,还可分别用 iptables -L -nnft list ruleset 查看实际生效的规则表。

二、ufw:三条命令搞定端口开放

ufw 的设计哲学就是「简单」。常用操作如下:

  • sudo ufw allow 22 允许 SSH(22 端口);
  • sudo ufw allow 80/tcp 只允许 TCP 的 80;
  • sudo ufw allow from 192.168.1.0/24 to any port 3306 只允许内网访问 MySQL;
  • sudo ufw deny 23 主动拒绝 Telnet 等危险端口;
  • sudo ufw enable 启用,sudo ufw status numbered 看带编号的规则列表。

改完记得 sudo ufw reload。一个小提醒:在远程服务器上开 ufw 前,务必先 allow 22,否则一 enable 就可能把自己挡在门外。配合Linux SSH 密钥登录配置实战:从免密连接到防断线的安全进阶把登录做稳,比单纯依赖密码安全得多。另外要注意,如果你在服务器上跑 Docker,容器默认会往 iptables 写规则并可能绕过 ufw,需要在 Docker 配置里显式指定网桥或加 --iptables=false 后再用 ufw 托管,否则「我以为关了的端口」其实开着。

三、firewalld:用 zone 和服务名管理

firewalld 的概念稍多,核心是「区域(zone)」和「服务(service)」。开放端口用:sudo firewall-cmd --add-port=8080/tcp --permanent,放行后再 sudo firewall-cmd --reload--permanent 是关键,不加只临时生效,重启就没了。更推荐用服务名:sudo firewall-cmd --add-service=http --permanent,系统已预定义了 http / https / ssh 等,比记端口号更不容易错。查看当前放行:sudo firewall-cmd --list-all;删除规则把 --add 换成 --remove 即可。firewalld 还支持「富规则(rich rule)」,可以写出「拒绝某 IP、但允许其访问特定端口」这类精细逻辑,适合做临时封禁爬虫或限速。

四、放行服务后仍连不上?按这个顺序排查

防火墙放行了却连不上,别急着怪防火墙。按顺序查:1)服务本身监听了没(ss -ltnp 看端口是否 LISTEN);2)云厂商安全组是否放行(很多「连不上」其实是云平台那层挡的);3)本机防火墙规则是否真的 reload 生效;4)运营商 / 路由器有没有端口限制;5)如果是 Docker 端口,确认映射和防火墙网桥放行一致。这套思路也适用于日常网络问题,可对照Linux 网络故障排查实战:从 ping 到 traceroute 一步步定位连不上逐层定位。

五、进阶:记录被拦的包、配合 fail2ban

想看防火墙到底拦了什么,可以临时开日志:ufw 在 /etc/ufw/before.rules 里加一条 LOG 规则,firewalld 用 --add-rich-rule='rule family=ipv4 source address=... log prefix="DROP: " drop'。看到大量同一 IP 的扫描,就轮到 fail2ban 出场——它读取日志、自动把暴力破解的 IP 加进防火墙黑名单,和 ufw / firewalld 都能配合。对暴露在公网的服务器,这是性价比极高的安全加固。

如果不想装 fail2ban,也可以手动用富规则临时封禁:sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=203.0.113.5 reject' --permanent 就能把某个骚扰 IP 拒之门外,取证或观察一段时间后再 --remove-rich-rule 解封。ufw 的等价写法是 sudo ufw deny from 203.0.113.5。这种「看到异常先封、确认误封再解」的节奏,比等 fail2ban 自动触发更主动,适合流量不大、你能经常看日志的小型服务器。

六、日常维护:规则别越堆越乱

防火墙规则会随项目越加越多。建议每隔一阵用 ufw status numberedfirewall-cmd --list-all 复盘,删掉废弃端口。配合Linux 定时任务 cron 完全指南:从 crontab 配置到定时备份脚本实战,可以把「每周导出一次防火墙规则备份」写成定时任务,误删了也能快速还原。想进一步提升命令行效率,Linux 命令行效率翻倍:10 个被低估却每天用得上的实用命令与技巧里有不少能直接用在运维场景的快捷键,比如用 watch 实时盯规则变化。

七、图形化工具与底层关系

命令行之外也有 GUI:Ubuntu 上有 gufw,是 ufw 的可视化前端,点点鼠标就能开关端口;firewalld 对应 firewall-config,能图形化管理 zone 和富规则。新手用图形界面更直观,但服务器通常无桌面,还是得会命令行。至于底层,ufw 和 firewalld 最终都翻译成 nftables(新系统)或 iptables(老系统)规则,两者是「前端封装」而非「另一套引擎」。理解了这点,你就不会困惑「为什么 firewalld 和 iptables 命令看到的规则不一样」——它们只是同一张表的不同视图,别同时手动改 iptables 又用 firewalld,否则状态会乱。

八、一个完整实战示例

假设你在一台 Ubuntu 服务器上部署网站,需要:放行 SSH、放行 Web(80/443)、拒绝其他一切入站。用 ufw 一步步来:sudo ufw default deny incoming 先拒所有入站;sudo ufw allow 22 放 SSH;sudo ufw allow 80,443/tcp 放 Web;sudo ufw enable 启用。最后 sudo ufw status verbose 确认「Anywhere → 22」「Anywhere → 80,443」在列表里、默认策略是 deny。出站默认 allow 不动,不影响服务器主动拉取更新。这样一个最小可用又相对安全的边界就完成了。

如果用 firewalld,等价操作是:sudo firewall-cmd --add-service=ssh --permanent--add-service=http --permanent--add-service=https --permanent,再 --reload。firewalld 默认 zone(public)本就是「放行显式服务、拒绝其余」,和上面的 ufw 思路一致。

九、小结

Linux 防火墙配置记住一句话:先认准 ufw 还是 firewalld,再决定用端口还是服务名,永久规则记得加 permanent 并 reload,最后别忘了云安全组这层。「连不上」大多是多层拦截叠加,逐层排查比瞎改规则靠谱;而理解它们是 nftables 的前端封装,能帮你避开「两套命令混用」的大坑。配置完别急着放心,最好从另一台机器用 telnetnc 从外网探一下目标端口是否真通,确认规则生效再上线。把这套理顺,你以后开任何服务都能既对外可用、又不被乱扫。

© 版权声明
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容