Linux防火墙 firewalld 实战

发布时间:2026/9/28 20:44:36
Linux防火墙 firewalld 实战 Linux防火墙 firewalld 实战简介讲解 Linux 内核 Netfilter 框架firewalld 核心概念 zone 区域runtime 运行时与 permanent 永久配置放行服务端口、源 / 网卡绑定、MASQUERADE 源地址转换、端口转发 DNAT、ICMP 控制、rich‑rule 富规则。一、防火墙基础概念防火墙分类按保护范围主机防火墙只保护本机firewalld、iptables。网络防火墙保护整个局域网硬件防火墙设备。按实现方式硬件防火墙专用硬件设备华为、华三、天融信等。软件防火墙运行在通用操作系统之上firewalld、iptables。按 OSI 模型网络层包过滤防火墙工作在四层检查源 IP、目的 IP、端口、协议速度快无法解析应用层内容。应用层 WAFWeb 应用防火墙解析 HTTP/HTTPS防御 SQL 注入、XSS 等 Web 攻击消耗 CPU 高。Netfilter 内核子系统Netfilter 是Linux 内核态网络过滤子系统真正负责处理数据包用户空间工具只是编写规则交给内核执行。 配套用户层工具iptablesIPv4 包过滤ip6tablesIPv6arptablesARP 协议过滤防 ARP 欺骗ebtables二层数据链路过滤多用于桥接、VLAN 环境[rootcentos7 ~]# ls -1 /sbin/*tables -rwxr-xr-x 1 root root 59872 11月 6 2016 /sbin/arptables -rwxr-xr-x. 1 root root 7016 4月 11 2018 /sbin/ebtables lrwxrwxrwx. 1 root root 13 8月 1 15:45 /sbin/ip6tables - xtables-multi lrwxrwxrwx. 1 root root 13 8月 1 15:45 /sbin/iptables - xtables-multiNftables新一代 netfilter 增强框架CentOS7 firewalld 底层可使用 nftables 后端。静态防火墙 vs 动态防火墙静态防火墙iptables‑service修改规则后要完整 reload 全部规则会中断现有 TCP 连接。动态防火墙firewalld只增量更新变更的规则不中断已有连接生产环境优势大。注意不要同时混用 firewalld 和 iptables 两套服务两套规则会互相干扰。二、firewalld 核心Zone 区域zone 就是一套预定义的规则集合把网卡、源 IP 流量绑定到不同 zone实现不同安全策略。全部 zone 说明表格zone 名称策略说明trusted全部流量允许通过public默认 zone仅允许 ssh、dhcpv6‑client其余拒绝external允许 ssh开启 IPv4 地址伪装 SNAT适合路由器外网网卡home家庭内网放行 ssh、samba‑client 等internal同 homework工作环境放行 sshdmz隔离区仅允许 ssh 访问block拒绝入站数据包返回拒绝应答包drop直接丢弃数据包不回复任何 ICMP 错误报文对方看不到拒绝提示数据包匹配 zone 优先级如果数据包源 IP 匹配 zone 配置的 source 源地址 → 使用该 zone 规则。不匹配 source则看数据包进入的网卡接口绑定哪个 zone。都不匹配使用系统default 默认 zone默认 public。lo 本地回环网卡默认绑定 trusted。 不匹配允许规则的流量默认拒绝trusted 除外。规则内部优先级端口转发、伪装普通允许规则service、port普通拒绝规则日志审计✅富规则 rich‑rule 优先级高于普通 zone 规则全部规则不匹配默认拒绝三、runtime 运行时 vs permanent 永久配置非常重要实操最容易踩坑runtime运行时不加--permanent规则立即生效重启 firewalld 服务全部丢失。permanent永久加--permanent参数写入磁盘配置文件不会立刻生效需要执行firewall‑cmd --reload加载。reload vs complete‑reloadfirewall‑cmd --reload加载永久规则不切断已经建立好的 TCP 连接。firewall‑cmd --complete‑reload全部重新加载现有连接全部断开。推荐实操写法两条一起执行立刻生效同时保存永久配置# 示例放行http服务永久立即生效 [rootcentos7 ~]# firewall-cmd --permanent --add-servicehttp [rootcentos7 ~]# firewall-cmd --add-servicehttp另一种方式先只写 permanentreload或者运行时配置完成后--runtime‑to‑permanent把内存规则保存到磁盘。四、zone 区域基础管理命令# 列出全部可用zone [rootcentos7 ~]# firewall-cmd --get-zones # 查看当前激活的zone绑定网卡/源 [rootcentos7 ~]# firewall-cmd --get-active-zones # 查看系统默认zone [rootcentos7 ~]# firewall-cmd --get-default-zone # 修改系统默认zone同时会写永久配置 [rootcentos7 ~]# firewall-cmd --set-default-zonepublic # 查看默认zone完整规则 [rootcentos7 ~]# firewall-cmd --list-all # 查看指定zone完整规则 [rootcentos7 ~]# firewall-cmd --list-all --zonehome五、source 源地址管理按源 IP 网段匹配 zone来自指定源 IP / 网段的流量交给对应 zone 处理。# 将10.1.1.0/24网段流量交给home zone运行时 [rootcentos7 ~]# firewall-cmd --add-source10.1.1.0/24 --zonehome # 永久生效 [rootcentos7 ~]# firewall-cmd --permanent --add-source10.1.1.0/24 --zonehome # 查看home zone绑定的source [rootcentos7 ~]# firewall-cmd --list-sources --zonehome # 查询网段属于哪个zone [rootcentos7 ~]# firewall-cmd --get-zone-of-source10.1.1.0/24 # 删除source绑定 [rootcentos7 ~]# firewall-cmd --remove-source10.1.1.0/24 --zonehome [rootcentos7 ~]# firewall-cmd --permanent --remove-source10.1.1.0/24 --zonehome六、interface 网卡接口管理网卡设备绑定 zone流量从该网卡进来就使用对应 zone 策略。# 查看绑定网卡 [rootcentos7 ~]# firewall-cmd --list-interfaces # 查询网卡属于哪个zone [rootcentos7 ~]# firewall-cmd --get-zone-of-interfaceens32 # 修改网卡归属zone [rootcentos7 ~]# firewall-cmd --change-interfaceens32 --zonehome # 删除网卡和zone绑定 [rootcentos7 ~]# firewall-cmd --remove-interfaceens32 --zonehome [rootcentos7 ~]# firewall-cmd --permanent --remove-interfaceens32 --zonehome七、放行服务 service 管理firewalld 内置服务定义对应端口写在/usr/lib/firewalld/services/*.xml例如 http 对应 80/tcphttps 对应 443/tcp。# 查看系统预定义全部服务 [rootcentos7 ~]# firewall-cmd --get-services # 放行http服务运行时 [rootcentos7 ~]# firewall-cmd --add-servicehttp # 永久放行http [rootcentos7 ~]# firewall-cmd --permanent --add-servicehttp # 查看当前zone放行的服务 [rootcentos7 ~]# firewall-cmd --list-services # 查询是否放行http [rootcentos7 ~]# firewall-cmd --query-servicehttp # 移除放行 [rootcentos7 ~]# firewall-cmd --remove-servicehttp [rootcentos7 ~]# firewall-cmd --permanent --remove-servicehttp八、直接放行端口 port 管理没有预定义 service直接放行端口 / 端口范围。格式端口号/协议(tcp/udp)# 放行5900/tcp端口运行时 [rootcentos7 ~]# firewall-cmd --add-port5900/tcp # 永久放行 [rootcentos7 ~]# firewall-cmd --permanent --add-port5900/tcp # 查看放行端口列表 [rootcentos7 ~]# firewall-cmd --list-ports # 查询端口是否放行 [rootcentos7 ~]# firewall-cmd --query-port5900/tcp # 删除端口放行 [rootcentos7 ~]# firewall-cmd --remove-port5900/tcp [rootcentos7 ~]# firewall-cmd --permanent --remove-port5900/tcp九、MASQUERADE 地址伪装路由器功能内网机器经过本机上网把内网源 IP 替换成本机公网 IPexternal zone 默认自带 masquerade。# 查看是否开启masquerade [rootcentos7 ~]# firewall-cmd --query-masquerade # 开启masquerade运行时 [rootcentos7 ~]# firewall-cmd --add-masquerade # 永久开启 [rootcentos7 ~]# firewall-cmd --permanent --add-masquerade # 关闭 [rootcentos7 ~]# firewall-cmd --remove-masquerade [rootcentos7 ~]# firewall-cmd --permanent --remove-masquerade⚠️端口转发 forward‑port必须当前 zone 开启 masquerade 才会生效。十、forward‑port 端口转发 DNAT把访问本机某端口的流量转发到其他 IP:port可以转发到本机端口也转发内网其他服务器。 语法--add-forward‑portport源端口:prototcp:toport目标端口[:toaddr目标IP]# 示例1访问本机8000端口转发到本机80端口 [rootcentos7 ~]# firewall-cmd --add-forward-portport8000:prototcp:toport80 # 示例2访问本机1022转发到内网机器10.1.1.11的22端口 [rootcentos7 ~]# firewall-cmd --add-forward-portport1022:prototcp:toport22:toaddr10.1.1.11 # 永久配置加上--permanent [rootcentos7 ~]# firewall-cmd --permanent --add-forward-portport1022:prototcp:toport22:toaddr10.1.1.11 # 查看端口转发规则 [rootcentos7 ~]# firewall-cmd --list-forward-ports # 删除端口转发 [rootcentos7 ~]# firewall-cmd --remove-forward-portport8000:prototcp:toport80 [rootcentos7 ~]# firewall-cmd --permanent --remove-forward-portport1022:prototcp:toport22:toaddr10.1.1.11十一、ICMP 控制icmp‑block‑inversion 总开关默认no放行全部 ICMP可以单独 block 某类 icmp 类型。设置yes全部 ICMP 默认禁止再通过规则放行部分 icmp 类型。# 查看状态 [rootcentos7 ~]# firewall-cmd --query-icmp-block-inversion # 开启全局禁止ICMP [rootcentos7 ~]# firewall-cmd --add-icmp-block-inversion [rootcentos7 ~]# firewall-cmd --permanent --add-icmp-block-inversion # 恢复默认关闭 [rootcentos7 ~]# firewall-cmd --remove-icmp-block-inversion [rootcentos7 ~]# firewall-cmd --permanent --remove-icmp-block-inversionicmp‑block屏蔽指定 ICMP 类型echo‑request就是 ping 请求报文屏蔽它别人无法 ping 通本机。# 查看系统支持的icmp类型 [rootcentos7 ~]# firewall-cmd --get-icmptypes # 禁止ping屏蔽echo‑request [rootcentos7 ~]# firewall-cmd --add-icmp-block echo-request [rootcentos7 ~]# firewall-cmd --permanent --add-icmp-block echo-request # 查看被屏蔽的icmp清单 [rootcentos7 ~]# firewall-cmd --list-icmp-blocks # 删除屏蔽恢复ping [rootcentos7 ~]# firewall-cmd --remove-icmp-block echo-request [rootcentos7 ~]# firewall-cmd --permanent --remove-icmp-block echo-request注意修改 icmp‑block 后如果旧连接还能 ping 通执行--complete‑reload完全重载清空连接状态。[rootcentos7 ~]# firewall-cmd --complete-reload十二、rich‑rule 富规则普通 service/port 只能对整个 zone 生效富规则可以精细控制源 IP、目的 IP、协议、日志、限流、审计优先级高于普通 zone 规则。富规则基础语法rule [source] [destination] service|port|protocol|icmp‑type [log][audit][accept|reject|drop]实操示例示例 1拒绝所有 IPv4 的 icmp所有人无法 ping 本机[rootcentos7 ~]# firewall-cmd --add-rich-rulerule familyipv4 protocol valueicmp drop [rootcentos7 ~]# firewall-cmd --permanent --add-rich-rulerule familyipv4 protocol valueicmp drop # 查看富规则列表 [rootcentos7 ~]# firewall-cmd --list-rich-rules # 删除富规则 [rootcentos7 ~]# firewall-cmd --remove-rich-rulerule familyipv4 protocol valueicmp drop [rootcentos7 ~]# firewall-cmd --permanent --remove-rich-rulerule familyipv4 protocol valueicmp drop示例 2只允许 10.1.8.10 这台主机 ping 本机其他全部禁止 ping# 全局禁止ping [rootcentos7 ~]# firewall-cmd --permanent --add-icmp-block-inversion # 允许指定源IP的ping请求 [rootcentos7 ~]# firewall-cmd --permanent --add-rich-rulerule familyipv4 source address10.1.8.10 icmp-type nameecho-request accept # 完全重载规则 [rootcentos7 ~]# firewall-cmd --complete-reload示例 3只允许 10.1.8.0/24 网段访问 http 服务其他源拒绝访问 80[rootcentos7 ~]# firewall-cmd --permanent --add-rich-rulerule familyipv4 source address10.1.8.0/24 service namehttp accept十三、direct 直接规则direct 直接规则优先级最高直接使用类似iptables语法用来做补充业务优先使用 firewalld 自身 zone/rich‑rule。# 查看全部direct规则 [rootcentos7 ~]# firewall-cmd --direct --get-all-rules简单示例把 192.168.0.0/24 网段拉黑每分钟限制一次日志输出然后 drop。[rootcentos7 ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist [rootcentos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist [rootcentos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix blacklisted [rootcentos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP [rootcentos7 ~]# firewall-cmd --reload清理 direct 规则[rootcentos7 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 raw blacklist [rootcentos7 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 raw PREROUTING [rootcentos7 ~]# firewall-cmd --direct --remove-chain ipv4 raw blacklist [rootcentos7 ~]# firewall-cmd --reload十四、其他实用功能panic 应急模式全部网络丢弃被入侵应急断网# 开启panic所有进出数据包全部丢弃 [rootcentos7 ~]# firewall-cmd --panic-on # 查询panic状态 [rootcentos7 ~]# firewall-cmd --query-panic # 关闭panic恢复网络 [rootcentos7 ~]# firewall-cmd --panic-offruntime 配置写入永久磁盘调试全部使用运行时规则确认没问题一键保存到永久配置不用每条加 --permanent。[rootcentos7 ~]# firewall-cmd --runtime-to-permanent临时生效的超时规则调试用单位秒# http服务放行10秒之后自动失效不需要手动删除 [rootcentos7 ~]# firewall-cmd --add-servicehttp --timeout10