防火墙配置(ufw/firewalld)
防火墙配置命令全景:ufw 与 firewalld 规则管理、iptables 高级语法、华为 USG 安全策略(区域与安全策略、NAT)、默认策略设计、日志审计与规则备份
知识点地图
- 知识类别:网络边界防御——主机与网络防火墙的规则配置。防火墙是「默认拒绝、按需放行」的执行者:没有它,一台服务器的所有端口对全网敞开。
- 解决什么问题:同一件事在 Linux 世界有三套工具(ufw/simple、firewalld/zone、iptables/底层),企业硬件防火墙(华为 USG、Cisco ASA)又是一套区域化语法;不系统学一遍,就会出现「ufw 开了为什么端口还通」「云上安全组与本机防火墙谁在起作用」这类困惑。本篇按「易到难」排布三套 Linux 工具,再补华为防火墙策略与 NAT,最后是日志审计与备份恢复。
- 什么时候用到:
- 学完能做什么:用 ufw 五分钟给一台新服务器上锁;读懂 firewalld 的 zone 模型;写出规范的 iptables 规则;在华为防火墙上配置安全策略与源 NAT。
ufw 基础操作
基本写法:启用 ufw 防火墙
ufw enable
# 启用 ufw 防火墙(会提示会中断现有 SSH 连接)
sudo ufw enable基本写法:禁用 ufw 防火墙
ufw disable
# 关闭 ufw 防火墙
sudo ufw disable基本写法:查看 ufw 状态
ufw status verbose
# 查看 ufw 详细状态与规则
sudo ufw status verbose基本写法:重置 ufw 规则
ufw reset
# 重置所有 ufw 规则到默认状态
sudo ufw reset基本写法:重载 ufw 规则
ufw reload
# 重新加载 ufw 规则使配置生效
sudo ufw reloadufw 默认策略
基本写法:设置默认拒绝入站
ufw default deny incoming
# 默认拒绝所有入站流量
sudo ufw default deny incoming基本写法:设置默认允许出站
ufw default allow outgoing
# 默认允许所有出站流量
sudo ufw default allow outgoing基本写法:设置默认拒绝转发
ufw default deny forward
# 默认拒绝转发流量
sudo ufw default deny forward基本写法:查看默认策略
ufw status verbose | grep Default
# 查看 ufw 当前默认策略
sudo ufw status verbose | grep Defaultufw 规则管理
基本写法:允许 SSH 服务
ufw allow <端口>/<协议>
# 允许 SSH 服务
sudo ufw allow 22/tcp基本写法:允许 HTTP/HTTPS
ufw allow <服务名>
# 允许 Web 服务
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp基本写法:限制特定 IP 访问
ufw allow from <IP> to any port <端口>
# 仅允许特定 IP 访问 SSH
sudo ufw allow from 192.168.1.100 to any port 22基本写法:拒绝特定 IP
ufw deny from <IP>
# 拒绝特定 IP 所有访问
sudo ufw deny from 203.0.113.10基本写法:限制连接速率
ufw limit <端口>/<协议>
# 限制 SSH 连接速率防爆破
sudo ufw limit 22/tcp基本写法:删除规则
ufw delete allow <端口>/<协议>
# 删除指定端口允许规则
sudo ufw delete allow 80/tcpufw IPv6 与应用配置
基本写法:启用 IPv6 支持
sed -i 's/IPV6=no/IPV6=yes/' /etc/default/ufw
# 修改 ufw 配置启用 IPv6
sudo sed -i 's/IPV6=no/IPV6=yes/' /etc/default/ufw基本写法:使用应用配置文件
ufw app list
# 列出所有可用应用配置
sudo ufw app list基本写法:启用应用配置
ufw allow <应用名>
# 使用应用配置文件开放端口
sudo ufw allow "Nginx Full"基本写法:查看应用信息
ufw app info <应用名>
# 查看应用配置文件详情
sudo ufw app info "Nginx Full"基本写法:创建自定义应用配置
cat /etc/ufw/applications.d/<应用>
# 创建自定义应用配置文件
sudo tee /etc/ufw/applications.d/myapp << 'EOF'
[myapp]
title=My Application
description=Custom application
ports=8080/tcp
EOFfirewalld 基础操作
基本写法:启动 firewalld
systemctl start firewalld
# 启动 firewalld 服务
sudo systemctl start firewalld
sudo systemctl enable firewalld基本写法:查看 firewalld 状态
firewall-cmd --state
# 查看 firewalld 运行状态
sudo firewall-cmd --state基本写法:重载 firewalld 配置
firewall-cmd --reload
# 重载防火墙配置不中断连接
sudo firewall-cmd --reload基本写法:完全重载
firewall-cmd --complete-reload
# 完全重载会中断现有连接
sudo firewall-cmd --complete-reload基本写法:panic 模式
firewall-cmd --panic-on
# 紧急情况阻断所有流量
sudo firewall-cmd --panic-onfirewalld 区域管理
基本写法:列出所有区域
firewall-cmd --get-zones
# 列出所有预定义区域
sudo firewall-cmd --get-zones基本写法:查看默认区域
firewall-cmd --get-default-zone
# 查看默认区域
sudo firewall-cmd --get-default-zone基本写法:设置默认区域
firewall-cmd --set-default-zone=<区域>
# 设置默认区域
sudo firewall-cmd --set-default-zone=public基本写法:查看区域配置
firewall-cmd --zone=<区域> --list-all
# 查看 public 区域详细配置
sudo firewall-cmd --zone=public --list-all基本写法:更改接口区域
firewall-cmd --zone=<区域> --change-interface=<接口>
# 将 eth0 接口加入 trusted 区域
sudo firewall-cmd --zone=trusted --change-interface=eth0firewalld 服务与端口管理
基本写法:添加服务
firewall-cmd --permanent --add-service=<服务>
# 永久添加 HTTP 服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload基本写法:开放端口
firewall-cmd --permanent --add-port=<端口>/<协议>
# 永久开放 8080 端口
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload基本写法:限制特定 IP 访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<IP>" port port="<端口>" protocol="<协议>" accept'
# 仅允许特定 IP 访问 MySQL
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload基本写法:拒绝特定 IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<IP>" reject'
# 拒绝特定 IP 所有访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" reject'
sudo firewall-cmd --reload基本写法:端口转发
firewall-cmd --permanent --add-forward-port=port=<端口>:proto=<协议>:toport=<目标端口>
# 端口转发 80 到 8080
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
sudo firewall-cmd --reloadiptables 高级配置
基本写法:查看 iptables 规则
iptables -L -n -v --line-numbers
# 查看所有链的规则带行号
sudo iptables -L -n -v --line-numbers基本写法:阻止 IP
iptables -A INPUT -s <IP> -j DROP
# 丢弃特定 IP 所有数据包
sudo iptables -A INPUT -s 203.0.113.10 -j DROP基本写法:限速防爆破
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
# 60 秒内超过 4 次 SSH 连接则丢弃
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP基本写法:保存 iptables 规则
iptables-save > <文件>
# 保存 iptables 规则到文件
sudo iptables-save > /etc/iptables/rules.v4基本写法:恢复 iptables 规则
iptables-restore < <文件>
# 从文件恢复 iptables 规则
sudo iptables-restore < /etc/iptables/rules.v4华为防火墙安全策略
Linux 三件套之外,企业边界普遍是硬件防火墙。以华为 USG 系列为例,它的模型与 Linux 最大的不同是先分区、再定策略:接口先划入安全区域(trust/untrust/DMZ),流量控制以「区域到区域」为单位,而不是逐条端口规则。
# 创建安全区域并把接口划入
[FW] firewall zone trust
[FW-zone-trust] add interface GigabitEthernet0/0/1
[FW] firewall zone untrust
[FW-zone-untrust] add interface GigabitEthernet0/0/2
# 配置安全策略:trust 内网 10.1.1.0/24 允许访问 untrust 的 Web 服务
[FW] security-policy
[FW-policy-security] rule name Allow-Web
[FW-policy-security-rule-Allow-Web] source-zone trust
[FW-policy-security-rule-Allow-Web] destination-zone untrust
[FW-policy-security-rule-Allow-Web] destination-address 10.1.1.0 24
[FW-policy-security-rule-Allow-Web] service http https
[FW-policy-security-rule-Allow-Web] action permit
# NAT 策略:内网出口做源 NAT(easy-ip 复用出接口地址)
[FW] nat-policy
[FW-policy-nat] rule name SNAT
[FW-policy-nat-rule-SNAT] source-zone trust
[FW-policy-nat-rule-SNAT] destination-zone untrust
[FW-policy-nat-rule-SNAT] action source-nat easy-ip对照讲解,帮你在两套模型之间翻译:
- zone 对比 iptables 的接口维度:iptables 按接口(
-i eth0)区分内外,华为按 zone——一个 zone 可含多个接口,DMZ 就是第三个 zone。安全级别(trust 85 > DMZ 50 > untrust 5)决定默认的域间流动方向; - security-policy 对比 iptables 规则链:同样「从上到下先匹配先生效」,同样最后一条兜底(华为默认域间包过滤为 deny,等价于 iptables 的
-P INPUT DROP); service http https对比--dport 80,443:服务对象是预定义的,复杂业务自定义 service object——等价于 ipset/自定义链的组织方式;- SNAT
easy-ip对比 MASQUERADE:复用出接口公网地址做源地址转换,正是 iptables-j MASQUERADE的企业版。
运维提示:策略改动都要 commit 才生效(对比 firewalld 的 --permanent + reload);排障先看会话表 display firewall session table——连接是否被策略放行、命中了哪条规则一目了然,这是 Linux 三件套没有的内置可观测性。
防火墙日志审计
基本写法:启用 ufw 日志
ufw logging on
# 开启 ufw 日志记录
sudo ufw logging on
sudo ufw logging medium基本写法:查看 ufw 日志
tail -f /var/log/ufw.log
# 实时查看 ufw 日志
sudo tail -f /var/log/ufw.log基本写法:统计被拦截的 IP
grep "UFW BLOCK" /var/log/ufw.log | awk '{print $NF}' | sort | uniq -c | sort -rn
# 统计被 ufw 拦截的 IP 排行
sudo grep "UFW BLOCK" /var/log/ufw.log | grep -oE "SRC=[0-9.]+" | sort | uniq -c | sort -rn | head基本写法:firewalld 日志查看
journalctl -u firewalld -f
# 查看 firewalld 服务日志
sudo journalctl -u firewalld -f基本写法:iptables 记录日志
iptables -A INPUT -j LOG --log-prefix "iptables-drop: " --log-level 4
# 记录被丢弃的数据包
sudo iptables -A INPUT -j LOG --log-prefix "iptables-drop: " --log-level 4
sudo iptables -A INPUT -j DROP防火墙安全自检
基本写法:扫描开放端口
nmap -sT -p- <本机IP>
# 扫描本机所有开放端口
nmap -sT -p- 127.0.0.1基本写法:从外部验证端口
nc -zv <IP> <端口>
# 测试目标端口是否可达
nc -zv 192.168.1.10 22基本写法:检查 ufw 规则顺序
ufw status numbered
# 查看带编号的 ufw 规则
sudo ufw status numbered基本写法:批量检查防火墙配置
ufw status && firewall-cmd --list-all && iptables -L -n
# 一次性查看各类防火墙配置
sudo ufw status verbose && sudo firewall-cmd --list-all && sudo iptables -L -n防火墙规则备份与恢复
基本写法:备份 ufw 规则
tar -czf ufw-backup.tar.gz /etc/ufw /lib/ufw
# 备份 ufw 配置文件
sudo tar -czf ufw-backup-$(date +%F).tar.gz /etc/ufw /lib/ufw基本写法:备份 firewalld 配置
tar -czf firewalld-backup.tar.gz /etc/firewalld
# 备份 firewalld 配置
sudo tar -czf firewalld-backup-$(date +%F).tar.gz /etc/firewalld基本写法:导出 firewalld 配置
firewall-cmd --permanent --list-all-zones > <文件>
# 导出所有区域配置到文件
sudo firewall-cmd --permanent --list-all-zones > firewalld-export.txt基本写法:导出 iptables 规则
iptables-save > <文件>; ip6tables-save > <文件>
# 导出 IPv4 与 IPv6 规则
sudo iptables-save > iptables-v4.rules
sudo ip6tables-save > iptables-v6.rules