手把手教你服务器防火墙规则精准配置
为什么需要精准配置服务器防火墙规则
防火墙是服务器安全的第一道门,而精准配置防火墙规则能让你只开放必要的端口,关闭其余所有入口,从而大幅降低被攻击的风险。
很多新手一开始全开所有端口,或者规则顺序混乱导致服务无法访问,这都是因为没能精准控制。
下面我会从零开始,带你一步步完成配置。
准备工作:确认环境和工具
操作前先确认你使用的是哪款防火墙工具。
主流 Linux 发行版常用 firewalld 或 iptables,CentOS 7+/Rocky Linux 默认使用 firewalld,Ubuntu 常用 ufw(底层也是 iptables)。
本文以 firewalld 为例,因为它有 zone 概念,更直观。
如果你用的是宝塔面板,后台也有可视化防火墙模块,原理相同。
检查 firewalld 是否运行:
sudo systemctl status firewalld
如果未运行,先启动并设置开机自启:
sudo systemctl start firewalld
sudo systemctl enable firewalld
查看当前规则:
sudo firewall-cmd --list-all
这会显示默认 zone(通常是 public)下的所有规则。
核心配置步骤:从开放必要端口开始
精准配置的核心思想是“默认拒绝,按需放行”。
firewalld 的默认规则通常已经拒绝了外部的未授权访问,我们只需要添加必要的放行规则即可。
1. 开放 SSH 端口(务必先做这一步)
SSH 默认端口 22,如果现在连不上就麻烦了。
建议先永久放行:
sudo firewall-cmd --permanent --add-port=22/tcp
--permanent 表示永久生效,不加的话重启后丢失。
2. 开放 Web 服务端口(如 80/443)
如果你的服务器要跑网站,放行 HTTP 和 HTTPS:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
也可以直接指定端口:
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
3. 放行其他自定义服务(如数据库、游戏等)
比如开放 MySQL 的 3306 端口,但注意:数据库端口不应该暴露给公网,除非你明确知道自己在做什么。
如果只是内网访问,可以限制来源 IP:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
这样只有内网网段能访问。
4. 移除不需要的服务
检查 --list-all 输出中是否有你不认识的服务(如 dhcpv6-client、cockpit 等),如果不需要就移除掉:
sudo firewall-cmd --permanent --remove-service=cockpit
5. 重新加载配置
所有规则添加/删除后都要重载才能生效:
sudo firewall-cmd --reload
6. 再次查看最终规则
sudo firewall-cmd --list-all
确认只有必要的端口和服务在列表里。
避坑指南:这些细节不注意规则会失效
- 规则顺序很重要:firewalld 的默认 zone(public)按照“拒绝所有,放行许可”工作,所以添加放行规则时直接添加就行。但如果用了 rich-rule,注意先拒绝再放行的逻辑。
- 临时与永久混用:如果加了不带
--permanent的规则,运行--reload后会丢失。建议所有规则都用--permanent,确保重启后还在。 - 默认 zone 被改:查看当前 zone:
firewall-cmd --get-default-zone,如果不是 public,可以改为 public:firewall-cmd --set-default-zone=public。 - SSH 被锁:远程操作前先别关掉当前的 SSH 会话,开一个新终端测试新规则。如果发现连不上,立即用 VNC 或面板管理重设规则。
- 端口范围写法:比如开放 1000-2000 端口:
--add-port=1000-2000/tcp。
常见问题解答
Q:我添加了规则,但服务还是访问不了?
A:首先运行 firewall-cmd --list-all 确认规则已存在,并且处于当前默认 zone。然后检查服务本身是否正常启动(如 nginx 是否运行)。也可能是服务器提供商的安全组策略拦截了端口,需要同时放行云控制台的防火墙。
Q:重启服务器后规则全没了?
A:规则没加 --permanent,重新用 --permanent 添加并 --reload。如果问题依旧,检查 firewalld 是否开机自启。
Q:我想查看某个端口是否已放行?
A:使用 firewall-cmd --query-port=80/tcp,返回 yes 表示已放行。
效果验证:确认规则精准生效
- 本地验证:运行
curl -I http://你的服务器IP查看 HTTP 响应码,如果是 200 正常。 - 远程验证:从另一台机器用
telnet 你的服务器IP 80或者在线端口检测工具(如 yougetsignal.com)测试。 - 验证未放行的端口:比如测试 3306,预期连接超时或拒绝,说明规则生效。
- 查看日志:如果连接被防火墙拒绝,firewalld 会记录日志:
sudo journalctl -u firewalld | grep DENIED。
如果你正在处理服务器防火墙规则精准配置,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
精准配置需要一点耐心,但掌握了这些,你的服务器安全水平就上了一个台阶。