firewalld 与 iptables 对比
一、如何选择
| 系统版本 | 默认防火墙 |
|---|---|
| CentOS 7/8/9、Rocky、AlmaLinux | firewalld |
| CentOS 6、Debian/Ubuntu 旧版 | iptables |
注意:firewalld 底层依然调用 iptables 内核模块,只是上层管理工具不同。
第一部分:firewalld(主流,重点)
1. 基础启停 & 开机自启
# 查看状态
systemctl status firewalld
# 启动/停止/重启
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
# 开机自启 / 开机禁用
systemctl enable firewalld
systemctl disable firewalld
2. 查看规则与区域
# 查看防火墙整体状态、默认区域
firewall-cmd --state
firewall-cmd --get-default-zone
# 查看当前所有放行规则(常用)
firewall-cmd --list-all
# 仅查看放行端口
firewall-cmd --list-ports
3. 放行端口(临时 + 永久)
临时规则(重启防火墙失效):
# 放行单个端口 80
firewall-cmd --add-port=80/tcp
# 放行端口段 30000-32767(K8s NodePort 常用)
firewall-cmd --add-port=30000-32767/tcp
永久规则(生产必加 --permanent,需重载生效):
# 永久放行 22、80、443
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
# 重载配置(永久规则生效)
firewall-cmd --reload
4. 关闭/删除端口规则
# 临时关闭
firewall-cmd --remove-port=80/tcp
# 永久删除(重载生效)
firewall-cmd --permanent --remove-port=80/tcp
firewall-cmd --reload
5. 放行指定 IP
# 永久放行 192.168.1.100 所有访问
firewall-cmd --permanent --add-source=192.168.1.100/32
# 永久放行某 IP 只访问指定端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
6. ICMP(ping)控制
# 禁止 ping
firewall-cmd --permanent --add-icmp-block=echo-request
# 允许 ping
firewall-cmd --permanent --remove-icmp-block=echo-request
firewall-cmd --reload
7. 伪装 & 端口转发(SNAT/DNAT)
# 开启 IP 伪装(内网机器上网)
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
# 端口转发(本机 8080 转发到 192.168.1.200:80)
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=192.168.1.200:toport=80
firewall-cmd --reload
8. 常用快捷方案
# 放行整个内网段
firewall-cmd --permanent --add-source=192.168.0.0/16 && firewall-cmd --reload
# 直接关闭防火墙(测试环境常用)
systemctl stop firewalld && systemctl disable firewalld
第二部分:iptables(CentOS 6 / 传统方案)
1. 启停 & 自启
service iptables status
service iptables start
service iptables stop
service iptables restart
chkconfig iptables on # 开机启动
chkconfig iptables off # 开机不启动
2. 查看规则
iptables -L -n --line-numbers
# -n 不解析域名;--line-numbers 显示行号,方便删除规则
3. 常用规则
# 放行 tcp 22 端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 放行 80、443
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 放行端口段
iptables -A INPUT -p tcp --dport 30000:32767 -j ACCEPT
# 放行指定 IP
iptables -A INPUT -s 192.168.1.100/32 -j ACCEPT
# 允许本机回环(必须保留)
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立/相关连接(必备)
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 默认拒绝所有入站(放在最后一条)
iptables -P INPUT DROP
4. 删除规则
# 先查行号
iptables -L -n --line-numbers
# 删除第 3 行规则
iptables -D INPUT 3
5. 保存规则(重启不丢失)
# CentOS 6
service iptables save
# 通用写法
/etc/init.d/iptables save
6. 清空所有规则(谨慎)
iptables -F
iptables -X
iptables -Z
三、选型小结
| 场景 | 推荐 |
|---|---|
| CentOS 7+ 生产环境 | firewalld,规则动态加载、区域管理更友好 |
| 老系统、容器/传统网络 | iptables,兼容性强 |
| 测试/临时环境 | 直接关闭防火墙最省事 |
| 云服务器 | 操作系统防火墙 + 云平台安全组两层都要放行 |
四、面试/运维高频命令速记
firewalld 速记:
- 看规则:
firewall-cmd --list-all - 永久放行端口:
--permanent+--add-port+--reload - 关闭防火墙:
systemctl stop && disable firewalld
iptables 速记:
- 查看带行号:
iptables -L -n --line-numbers - 删规则:按行号
iptables -D INPUT 编号 - 保存:
service iptables save
关联文档
- ../../linux/system/Linux — 防火墙是 Linux 系统管理的一部分
- ../../kubernetes/core/K8s 核心概念#kube-proxy — kube-proxy 依赖 iptables/IPVS
- ../../linux/system/SSH 认证原理与配置 — SSH 安全与防火墙联动