防火墙是 Linux 系统安全的第一道防线。无论是保护互联网上的服务器,还是加固内网的工作站,正确配置防火墙都至关重要。然而,Linux 生态中防火墙工具繁多——iptables、nftables、firewalld、UFW……不同发行版的选择各不相同,初学者往往感到困惑。
本文将从底层原理出发,系统梳理 Linux 防火墙的演进脉络,再按发行版逐一讲解主流工具的配置方法,最后给出生产环境的加固建议。无论你使用的是 Ubuntu、CentOS、麒麟还是其他发行版,都能从中找到对应的操作指南。
所有 Linux 防火墙工具的本质,都是与内核中的 Netfilter 框架交互。Netfilter 位于 Linux 网络协议栈中,能够在数据包经过的各个关键节点(如进入本机、转发、发出等)挂载钩子函数,从而实现对数据包的过滤、修改或拒绝。
| 前端工具 | 底层后端 | 设计定位 |
|---|---|---|
| iptables | 直接操作 Netfilter | 传统手动管理,功能完整 |
| nftables | 新一代 Netfilter 框架 | 取代 iptables,语法更现代 |
| firewalld | iptables 或 nftables | 动态区域管理,企业级 |
| UFW | iptables 或 nftables | 简化操作,新手友好 |
firewalld 和 UFW 本质上是前端封装,并不替代内核框架。理解这一点有助于排查“为什么 UFW 规则和 iptables 规则同时存在”这类问题。
不同 Linux 发行版有各自的默认防火墙方案,下面是主流发行版的选择情况:
| 发行版 | 默认/推荐工具 | 底层后端 | 适用场景 |
|---|---|---|---|
| Ubuntu / Debian | UFW | iptables/nftables | 桌面/新手/入门服务器 |
| RHEL / CentOS / Fedora | firewalld | nftables | 企业服务器 |
| openSUSE | firewalld + YaST | nftables | 混合环境 |
| 银河麒麟 V10 | firewalld / kylin-firewall | iptables/nftables | 信创/国产化环境 |
| Arch Linux | 无默认,用户自选 | 用户自选 | 高级用户 |
| Alpine Linux | iptables | iptables | 容器/嵌入式 |
UFW(Uncomplicated Firewall)的设计目标是“让防火墙配置变得简单”。命令简洁直观,非常适合新手中小项目。
查看状态与启用:
sudo ufw status # 查看状态和规则列表
sudo ufw status numbered # 带编号显示,便于删除操作
sudo ufw enable # 启用防火墙
sudo ufw disable # 临时关闭(不删除规则)
⚠️ 安全提示:启用前务必先放行 SSH,否则会与服务器断开连接。
设置默认策略(推荐先做):
sudo ufw default deny incoming # 默认拒绝入站
sudo ufw default allow outgoing # 默认允许出站
放行服务与端口:
sudo ufw allow ssh # 按服务名放行
sudo ufw allow 22/tcp # 按端口放行
sudo ufw allow 80,443/tcp # 放行多个端口
sudo ufw allow from 192.168.1.100 to any port 22 # IP+端口白名单
删除规则:
sudo ufw status numbered # 先列出编号
sudo ufw delete 3 # 删除第3条规则
查看日志:日志位于 /var/log/ufw.log
firewalld 采用“区域(zone)”概念,不同网络接口可以绑定不同区域,适合多网络环境场景。其规则区分运行时和永久两类,配置更灵活。
查看状态:
sudo firewall-cmd --state # 查看运行状态
sudo firewall-cmd --list-all # 查看当前区域规则
sudo firewall-cmd --list-all-zones # 查看所有区域规则
sudo firewall-cmd --get-active-zones # 查看当前活跃区域
放行服务与端口(含永久生效):
sudo firewall-cmd --permanent --add-service=ssh # 放行 SSH 服务
sudo firewall-cmd --permanent --add-port=8080/tcp # 放行 8080 端口
sudo firewall-cmd --reload # 重载配置生效
IP 白名单(富规则):
# 仅允许 192.168.1.100 访问 3306 端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload
拒绝特定 IP:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.45" reject'
sudo firewall-cmd --reload
区域管理(生产环境推荐):
生产环境建议按信任级别划分区域来管理策略:
# 创建管理区域,仅允许堡垒机 IP 访问 SSH
sudo firewall-cmd --permanent --new-zone=management
sudo firewall-cmd --permanent --zone=management --add-source=10.0.0.0/16
sudo firewall-cmd --permanent --zone=management --add-service=ssh
# 业务区域放行 Web 服务
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
查看日志:sudo journalctl -u firewalld
直接操作 iptables 可以获得最精细的控制粒度,适合复杂规则和遗留系统。
查看规则:
sudo iptables -L # 查看所有链规则
sudo iptables -nvL # 带计数统计
sudo iptables -L --line-numbers # 带编号
放行端口(INPUT 链):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 放行 SSH
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 放行 HTTP
IP 白名单与拒绝:
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 3306 -j ACCEPT # 仅允许特定 IP
sudo iptables -A INPUT -s 203.0.113.45 -j DROP # 拒绝某 IP
⚠️ 持久化:iptables 规则默认重启后丢失,需要手动保存。保存方式因发行版而异:
- Debian/Ubuntu:
sudo iptables-save > /etc/iptables/rules.v4- CentOS/RHEL:需安装
iptables-services,然后sudo service iptables save
银河麒麟操作系统(V10 及 V10 SP1)默认集成 kylin-firewall 工具,同时兼容 firewalld 与 iptables 双引擎,操作逻辑清晰,符合等保二级要求。
图形界面方式:
8273,8274)命令行方式:
sudo kylin-firewall -s off # 禁用防火墙(临时)
sudo kylin-firewall -g # 刷新配置缓存
sudo kylin-firewall --add-rule "allow tcp in port 8443 from 10.0.0.0/8" # 添加规则
sudo kylin-firewall --apply-rules # 应用规则
firewalld 兼容方式(同样可用):
sudo systemctl status firewalld # 查看服务状态
sudo firewall-cmd --permanent --add-port=5236/tcp # 放行端口
sudo firewall-cmd --reload
永久禁用(不推荐生产环境):
sudo systemctl stop firewalld
sudo systemctl disable firewalld
官方文档明确提示:关闭防火墙将削弱网络层防护能力,建议仅在可信内网调试场景下谨慎操作,并及时恢复。
nftables 是目前主流发行版(Debian 10+、CentOS 8+、Ubuntu 20.04+)的底层默认框架,语法更简洁高效,适合新项目长期演进。
查看规则:
sudo nft list ruleset # 列出所有规则集
基础配置示例:
# 创建表
sudo nft add table inet my_table
# 创建输入链,挂载到 input 钩子
sudo nft add chain inet my_table my_input { type filter hook input priority 0 \; }
# 放行 SSH 和 HTTP/HTTPS
sudo nft add rule inet my_table my_input tcp dport 22 accept
sudo nft add rule inet my_table my_input tcp dport 80,443 accept
# 默认丢弃(放在最后)
sudo nft add rule inet my_table my_input drop
持久化:
sudo nft list ruleset > /etc/nftables.conf
sudo systemctl enable nftables
无论使用哪种工具,以下原则适用于所有 Linux 环境:
SSH(22 端口)应仅允许公司出口 IP、VPN IP 或堡垒机 IP 访问:
# UFW
sudo ufw allow from 203.0.113.0/24 to any port 22
# firewalld(富规则)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" port protocol="tcp" port="22" accept'
在云服务器上,切勿在未添加允许规则前直接启用防火墙,否则会切断 SSH 连接,导致实例“失联”。
正确的操作顺序:
ufw allow ssh 或 firewall-cmd --add-service=ssh)ufw enable 或 systemctl start firewalld)sudo journalctl -u firewalld/var/log/ufw.logLinux 防火墙生态虽丰富,但选型逻辑清晰:
核心安全原则始终不变:最小开放、默认拒绝、先放行后启用、来源 IP 白名单管控。掌握这些,你就掌握了 Linux 防火墙的精髓。

















