Linux 服务器配置防火墙是保障系统安全的关键步骤,防火墙作为网络安全的第一道防线,能够有效过滤非法访问请求,防止未经授权的访问和攻击,在 Linux 系统中,常用的防火墙工具包括 iptables、firewalld 和 ufw,不同发行版可能默认使用不同的工具,CentOS 7+ 使用 firewalld,Ubuntu 使用 ufw,而传统系统多使用 iptables,本文将以 firewalld 和 iptables 为例,详细介绍 Linux 服务器防火墙的配置方法,包括基本规则管理、端口开放与限制、服务策略设置及高级安全策略等内容。

防火墙工具选择与基础概念
- firewalld:动态防火墙管理工具,支持区域(Zone)概念,可根据网络连接类型(如公共网络、家庭网络、受信任网络等)应用不同规则,支持运行时规则与永久规则分离,无需重启即可生效。
- iptables:基于内核的静态防火墙工具,通过链(Chain)和表(Table)管理规则,规则优先级从上到下匹配,一旦匹配即停止,灵活性高但配置相对复杂。
选择建议:对于新手或需要动态调整规则的场景,优先选择 firewalld;对于需要精细控制或旧系统兼容的场景,可使用 iptables。
firewalld 配置详解
启动与启用防火墙
# 启动 firewalld 服务 sudo systemctl start firewalld # 设置开机自启 sudo systemctl enable firewalld # 查看防火墙状态 sudo firewall-cmd --state
区域(Zone)管理
firewalld 默认包含多个区域,常用区域及作用如下:
| 区域名称 | 默认策略 | 适用场景 |
|----------|----------|----------|
| public | 拒绝所有连接,仅允许选定的服务 | 公共网络(如云服务器) |
| trusted | 允许所有连接 | 内部受信任网络 |
| drop | 丢弃所有数据包,不返回任何响应 | 高安全性需求,拒绝所有未知访问 |
| home | 允许 SSH、DHCP 等,限制其他服务 | 家庭网络 |
查看当前区域:
sudo firewall-cmd --get-active-zones
切换区域(临时生效,重启后恢复):

sudo firewall-cmd --set-zone=public --zone=trusted
永久设置区域:
sudo firewall-cmd --permanent --set-zone=trusted
端口与服务管理
-
开放端口(以 80 端口为例):
# 临时开放 sudo firewall-cmd --add-port=80/tcp # 永久开放 sudo firewall-cmd --permanent --add-port=80/tcp
-
开放服务(firewalld 预定义服务,如 HTTP):
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload # 重新加载规则使永久生效
-
查看已开放端口/服务:
(图片来源网络,侵删)sudo firewall-cmd --list-ports sudo firewall-cmd --list-services
-
关闭端口/服务:
sudo firewall-cmd --permanent --remove-port=80/tcp sudo firewall-cmd --permanent --remove-service=http sudo firewall-cmd --reload
富规则(Rich Rules)高级配置
富规则支持更复杂的条件判断,如基于 IP、端口、协议等限制访问。
示例:仅允许 192.168.1.100 访问 22 端口:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept' sudo firewall-cmd --reload
拒绝特定 IP 访问:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.50" reject' sudo firewall-cmd --reload
iptables 配置详解
基础语法与表结构
iptables 默认包含 4 个表,每个表包含不同的链:
| 表名称 | 作用 | 包含链 |
|--------|------|--------|
| filter | 数据包过滤 | INPUT、OUTPUT、FORWARD |
| nat | 网络地址转换 | PREROUTING、POSTROUTING、OUTPUT |
| mangle | 数据包修改 | PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING |
| raw | 原始数据包处理 | PREROUTING、OUTPUT |
常用命令参数:
-A:添加规则到链末尾-I:插入规则到链指定位置(默认首部)-D:删除规则-p:协议(tcp/udp/icmp)--dport:目标端口-j:动作(ACCEPT/DROP/REJECT)
基本规则配置
-
查看当前规则:
sudo iptables -L -n -v # -n 不解析域名,-v 显示详细信息
-
允许本地回环:
sudo iptables -A INPUT -i lo -j ACCEPT
-
允许已建立的连接:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-
开放 SSH 端口(22):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
拒绝所有其他连接(默认拒绝策略):
sudo iptables -P INPUT DROP # 设置 INPUT 链默认策略为 DROP
规则保存与持久化
CentOS/RHEL:
sudo yum install iptables-services sudo systemctl enable iptables sudo service iptables save # 保存规则到 /etc/sysconfig/iptables
Ubuntu/Debian:
sudo apt install iptables-persistent sudo netfilter-persistent save # 保存规则 sudo netfilter-persistent reload
端口转发配置
示例:将本机 8080 端口转发到 192.168.1.100 的 80 端口:
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT sudo iptables-save > /etc/iptables/rules.v4 # 保存规则
防火墙安全加固建议
-
最小权限原则:仅开放必要的端口和服务,避免全开策略。
-
定期更新规则:根据业务变化调整防火墙策略,及时关闭无用端口。
-
日志监控:开启防火墙日志,记录被拒绝的连接,便于分析攻击行为。
- firewalld 日志:
sudo firewall-cmd --set-log-denied=all # 记录所有拒绝的连接 sudo journalctl -u firewalld # 查看日志
- iptables 日志:
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: "
- firewalld 日志:
-
禁用 ICMP 请求:防止 ICMP 隧道攻击和端口扫描(部分场景需谨慎)。
sudo iptables -A INPUT -p icmp -j DROP # 禁用所有 ICMP sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # 仅禁用 ping 请求
-
结合 fail2ban 防暴力破解:通过防火墙规则自动封禁频繁失败的登录 IP。
相关问答 FAQs
问题 1:如何查看 Linux 服务器当前使用的防火墙工具?
解答:可通过以下命令判断:
- 对于 firewalld:
sudo systemctl status firewalld(若显示 active (running) 则正在使用)。 - 对于 iptables:
sudo iptables -L -n(若返回规则列表则说明 iptables 已配置)。 - 部分系统可能同时安装两者,需通过
systemctl确认哪个服务处于激活状态。
问题 2:防火墙规则配置错误导致无法远程登录,如何紧急恢复?
解答:可通过以下方式恢复:
- firewalld:若因规则错误导致 SSH 被拒,可通过物理控制台或 VNC 登录服务器,执行
sudo firewall-cmd --panic-on启用“紧急模式”(拒绝所有连接),再通过sudo firewall-cmd --panic-off关闭并重新配置规则。 - iptables:若无法远程登录,可通过控制台执行
sudo iptables -F清空所有规则(临时恢复),再通过sudo iptables -P INPUT ACCEPT设置默认允许策略,之后重新配置正确的规则并保存。
