firewalld 核心操作命令
服务基础管理 启动 firewalld 服务:
bash
systemctl start firewalld
停止 firewalld 服务:
bash
systemctl stop firewalld
查看 firewalld 运行状态:
bash
systemctl status firewalld
重新加载 firewalld 配置(不中断连接):
bash
systemctl reload firewalld
设置 firewalld 开机自启:
bash
systemctl enable firewalld
关闭 firewalld 开机自启:
bash
systemctl disable firewalld
查看防火墙简洁状态(running/not running):
bash
firewall-cmd --state
预定义资源查询
查看所有预定义区域
bash
firewall-cmd --get-zones
查看所有预定义服务
bash
firewall-cmd --get-services
格式化显示预定义服务(每行一个)
bash
firewall-cmd --get-services | tr ' ' '\n'
查看所有预定义 ICMP 类型
bash
firewall-cmd --get-icmptypes
预定义 ICMP 类型含义
- destination-unreachable:目的地址不可达
- echo-reply:应答回应(pong)
- parameter-problem:参数问题
- redirect:重新定向
- router-advertisement:路由器通告
- router-solicitation:路由器征寻
- source-quench:源端抑制
- time-exceeded:超时
- timestamp-reply:时间戳应答回应
- timestamp-request:时间戳请求
区域(Zone)管理
显示默认区域
bash
firewall-cmd --get-default-zone
设置默认区域
bash
firewall-cmd --set-default-zone=<区域名>
显示已激活的所有区域
bash
firewall-cmd --get-active-zones
显示指定网卡绑定的区域
bash
firewall-cmd --get-zone-of-interface=<网卡名>
为指定区域绑定网卡
bash
firewall-cmd --zone=<区域名> --add-interface=<网卡名>
更改指定区域绑定的网卡
bash
firewall-cmd --zone=<区域名> --change-interface=<网卡名>
为指定区域解绑网卡
bash
firewall-cmd --zone=<区域名> --remove-interface=<网卡名>
显示所有区域的完整规则
bash
firewall-cmd --list-all-zones
显示指定区域规则(省略则默认区域)
bash
firewall-cmd [--zone=<区域名>] --list-all
服务管理(基于预定义服务)
显示区域内允许的服务
bash
firewall-cmd [--zone=<区域名>] --list-services
为区域添加允许的服务
bash
firewall-cmd [--zone=<区域名>] --add-service=<服务名>
从区域移除允许的服务
bash
firewall-cmd [--zone=<区域名>] --remove-service=<服务名>
端口管理(自定义端口)
显示区域内允许的端口
bash
firewall-cmd [--zone=<区域名>] --list-ports
为区域添加允许的端口
bash
firewall-cmd [--zone=<区域名>] --add-port=<端口号/范围>-<协议>
从区域移除允许的端口
bash
firewall-cmd [--zone=<区域名>] --remove-port=<端口号/范围>-<协议>
ICMP 类型管理
显示区域内拒绝的 ICMP 类型
bash
firewall-cmd [--zone=<区域名>] --list-icmp-blocks
为区域添加拒绝的 ICMP 类型
bash
firewall-cmd [--zone=<区域名>] --add-icmp-block=<ICMP类型>
从区域移除拒绝的 ICMP 类型
bash
firewall-cmd [--zone=<区域名>] --remove-icmp-block=<ICMP类型>
富规则(精细化控制)
拒绝 10.0.0.1/24 网段访问 80 端口
bash
firewall-cmd --zone=public --add-rich-rule="rule family='ipv4' source address='10.0.0.1/24' port port=80 protocol=tcp drop"
查看区域内的富规则
bash
firewall-cmd [--zone=<区域名>] --list-rich-rules
配置模式与重载
永久配置生效,保持当前连接
bash
firewall-cmd --reload
配置永久规则(需 reload 生效)
bash
firewall-cmd --permanent [其他选项]
将运行时配置写入永久配置文件
bash
firewall-cmd --runtime-to-permanent
配置文件目录
- /etc/firewalld/:用户自定义配置目录,优先级更高
- /usr/lib/firewalld/:默认配置目录,不建议修改
iptables 核心概念:四表五链
四表(功能分类)
- filter(默认表):数据包过滤,控制是否允许数据包通过
- nat:网络地址转换,修改数据包源/目标地址
- mangle:修改数据包特殊标记(如 TTL、TOS)
- raw:跳过连接跟踪,处理特殊数据包
五链(处理流程环节)
- INPUT:处理进入本机的数据包
- OUTPUT:处理从本机发出的数据包
- FORWARD:处理经过本机转发的数据包(路由器场景)
- PREROUTING:数据包进入防火墙前处理,用于 DNAT
- POSTROUTING:数据包离开防火墙后处理,用于 SNAT
iptables 基本命令
查看规则
bash
iptables -L -n -v
显示指定链的规则(如 INPUT)
bash
iptables -L INPUT -n -v
清空规则
bash
iptables -F
清空指定链的规则(如 INPUT)
bash
iptables -F INPUT
删除所有自定义链
bash
iptables -X
重置所有链的计数器
bash
iptables -Z
添加规则
bash
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
允许特定端口的入站连接(如 SSH 的 22 端口)
bash
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
拒绝来自特定 IP 的访问
bash
iptables -A INPUT -s 192.168.1.101 -j DROP
删除规则
bash
iptables -D INPUT 2
根据匹配条件删除规则
bash
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
默认策略
bash
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
保存与恢复规则
bash
service iptables save
或(Ubuntu/Debian)
bash
iptables-save > /etc/iptables.rules
恢复规则
bash
iptables-restore < /etc/iptables.rules
NAT 规则
bash
sysctl -p
源地址转换(SNAT)
bash
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
端口转发(将 80 端口转发到内部 IP)
bash
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.100:80
其他常用选项
bash
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
记录被丢弃的数据包
bash
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "