侧边栏壁纸
  • 累计撰写 154 篇文章
  • 累计收到 0 条评论

firewalld防火墙

2025-4-24 / 0 评论 / 14 阅读

1. 基本概念

  • Firewalld 是 Linux 系统中用于管理防火墙规则的工具,基于 D-Bus 接口,支持动态更新规则而无需重启服务,适用于 CentOS 7+RHEL 7+Fedora 等系统。
  • 核心功能:通过 区域(Zone) 和 服务(Service) 简化防火墙配置,支持 IPv4/IPv6、网络地址转换(NAT)、端口转发等。

2. 关键术语

  • 区域(Zone):预定义的规则集合,根据网络环境的安全等级应用不同规则(如 publicprivatetrusted 等)。
  • 服务(Service):预定义的端口 / 协议组合(如 sshhttphttps 等),可直接调用。
  • 永久规则(Permanent):重启服务或系统后仍生效的规则。
  • 临时规则(Non-permanent):仅在当前运行时生效,重启后失效。

二、Firewalld 常用命令

1. 服务控制

命令

说明

systemctl start firewalld

启动防火墙服务

systemctl stop firewalld

停止防火墙服务

systemctl restart firewalld

重启防火墙服务

systemctl enable firewalld

设置开机自启

systemctl disable firewalld

取消开机自启

systemctl status firewalld

查看服务状态(是否运行、规则加载情况等)

2. 查看状态

  • 查看默认区域:bash
firewall-cmd --get-default-zone
  • 查看所有区域及规则:bash
firewall-cmd --list-all-zones
  • 查看当前区域规则:bash
firewall-cmd --list-all  # 临时规则
firewall-cmd --list-all --permanent  # 永久规则

3. 区域管理

  • 设置默认区域:bash
firewall-cmd --set-default-zone=<zone-name>  # 如 public
  • 查询接口所属区域:bash
firewall-cmd --get-zone-of-interface=<interface-name>  # 如 eth0
  • 将接口添加到指定区域:bash
firewall-cmd --zone=<zone-name> --add-interface=<interface-name> --permanent

4. 服务与端口操作

  • 允许服务通过防火墙:bash
firewall-cmd --zone=<zone-name> --add-service=<service-name> --permanent  # 如 ssh
  • 禁止服务通过防火墙:bash
firewall-cmd --zone=<zone-name> --remove-service=<service-name> --permanent
  • 允许端口 / 协议通过防火墙:bash
firewall-cmd --zone=<zone-name> --add-port=<port>/<protocol> --permanent  # 如 80/tcp

  • 示例:允许 TCP 8080 端口:bash
  • firewall-cmd --add-port=8080/tcp --permanent
  • 删除端口规则:bash
  • firewall-cmd --zone=<zone-name> --remove-port=<port>/<protocol> --permanent

    5. 重载与生效

    • 加载永久规则(使修改生效):bash
    firewall-cmd --reload
    • 临时规则立即生效(无需重启):bash
    firewall-cmd --add-service=http  # 临时规则,重启后失效

    三、预定义区域(Zone)详解

    区域名称

    安全级别

    默认规则(允许的流量)

    适用场景

    public

    最低

    仅允许 SSH、DHCPv6 客户端

    公共网络(如开放 Wi-Fi)

    private

    中等

    允许 SSH、MDNS、Samba 客户端等

    家庭或办公网络

    trusted

    最高

    允许所有流量

    可信网络(如本地局域网)

    dmz


    允许 SSH,拒绝其他入站流量

    隔离区(DMZ)服务器

    block

    拒绝所有入站

    仅响应出站请求

    阻断所有外部连接

    drop

    拒绝所有入站

    丢弃数据包(不响应)

    严格阻断外部连接

    四、高级功能配置

    1. 端口转发(NAT)

    • 启用 IP 转发(需先配置内核参数):bash
    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
    sysctl -p  # 立即生效
    • 配置端口转发规则:bash
    # 将外部 8080 端口转发到内部服务器 80 端口
    firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100 --permanent
    firewall-cmd --reload

    2. 富规则(Rich Rules)

    用于定义更复杂的规则(优先级高于普通规则):bash

    # 允许来自 192.168.1.0/24 的 SSH 连接
    firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent
    
    # 拒绝特定 IP 访问 80 端口
    firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="80" protocol="tcp" reject' --permanent

    3. 查看规则优先级

    bash

    firewall-cmd --list-rich-rules  # 查看富规则
    firewall-cmd --list-ports  # 查看端口规则
    firewall-cmd --list-services  # 查看服务规则

    五、故障排除与注意事项

    1. 规则不生效?
    • 检查是否添加了 --permanent 参数(永久规则需重载生效)。
    • 使用 firewall-cmd --reload 重新加载规则。
    • 确认区域是否正确应用到接口(firewall-cmd --get-zone-of-interface=<interface>)。
    1. 端口仍被阻止?
    • 检查是否同时存在临时规则和永久规则,临时规则优先级更高。
    • 使用 tcping 或 nmap 测试端口连通性:bash
    nmap -p <port> <target-ip>
    1. 服务与端口映射
    • 部分服务(如 Docker)可能动态占用端口,需单独配置或关闭防火墙。
    • 若服务未在预定义 service 中,需手动添加端口规则。

    六、参考资料

    • 官方文档Firewalld Documentation
    • CentOS 手册man firewall-cmd
    • 最佳实践:生产环境中建议先在测试环境验证规则,避免误封导致服务中断。


    通过以上笔记,可快速掌握 Firewalld 的基础配置和高级功能,根据实际网络环境灵活调整规则,确保系统安全。

    Firwalld防火墙笔记多

    以下是进一步补充和扩展的 Firewalld 防火墙笔记,涵盖更多细节、实战技巧和常见场景,帮助你更全面地掌握这一工具:

    七、Firewalld 配置文件解析

    Firewalld 的配置存储在 /etc/firewalld/ 目录下,主要文件包括:


    1. firewalld.conf
    • 全局配置文件,定义默认区域、日志级别、IPv6 支持等。
    • 示例配置:ini
    [firewalld]
    default-zone=public
    ipv6_routing=no
    logging=off
    1. zones/ 目录
    • 每个区域对应一个 .xml 文件(如 public.xml),存储该区域的规则。
    • 手动编辑示例(添加 8080 端口规则):xml
    <zone name="public">
      <port port="8080" protocol="tcp"/>
    </zone>
    • 注意:手动修改配置文件后需执行 firewall-cmd --reload 加载规则。
    1. services/ 目录
    • 预定义服务的 .xml 文件(如 ssh.xml),可自定义服务。
    • 自定义服务示例(创建 myapp.xml):xml
    <service name="myapp" short="My App Service" description="Allow My App Traffic">
      <port port="5000" protocol="tcp"/>
      <port port="5001" protocol="udp"/>
    </service>
    • 加载自定义服务:bash
    firewall-cmd --add-service=myapp --permanent

    八、实战场景配置示例

    1. 多网卡不同区域配置

    需求:服务器有两张网卡,eth0 连接公网(public 区域),eth1 连接内网(private 区域)。
    配置步骤


    bash

    # 将 eth0 加入 public 区域(默认可能已生效)
    firewall-cmd --zone=public --add-interface=eth0 --permanent
    
    # 将 eth1 加入 private 区域
    firewall-cmd --zone=private --add-interface=eth1 --permanent
    
    # 分别配置区域规则:
    # public 区域仅允许 SSH 和 HTTP
    firewall-cmd --zone=public --add-service={ssh,http} --permanent
    
    # private 区域允许 SSH、Samba(文件共享)和自定义端口 3306
    firewall-cmd --zone=private --add-service={ssh,samba} --add-port=3306/tcp --permanent
    
    firewall-cmd --reload

    2. 基于时间的访问控制

    需求:仅允许办公时段(9:00-18:00)访问 Web 服务(80 端口)。
    实现方法:结合富规则和 time 模块:


    bash

    firewall-cmd --zone=public --add-rich-rule='rule service name="http" accept time "weekdays 09:00-18:00"' --permanent
    firewall-cmd --reload

    3. 容器环境下的防火墙配置(Docker)

    问题:Docker 容器默认使用 NAT 模式,可能导致防火墙规则失效。
    解决方案


    • 允许 Docker 桥接接口(docker0)流量:bash
    firewall-cmd --zone=public --add-interface=docker0 --permanent
    firewall-cmd --reload
    • 为容器指定固定 IP 并配置端口映射规则:bash
    # 假设容器 IP 为 172.17.0.2,映射主机 8080 到容器 80
    firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=172.17.0.2 --permanent
    firewall-cmd --reload

    九、性能优化与安全策略

    1. 批量操作提升效率

    • 使用 --permanent 和 --zone 参数批量添加规则,减少 --reload 次数:bash
    firewall-cmd --permanent --zone=public --add-service={ssh,https,dns} --add-port={8080,9090}/tcp
    firewall-cmd --reload  # 仅需一次重载

    2. 限制并发连接数与速率

    通过富规则配置连接限制(防止 DDoS 入侵):bash

    # 限制 SSH 并发连接数为 5 个
    firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" limit value="5/minute" accept' --permanent
    
    # 限制 HTTP 流量速率为 100 包/秒
    firewall-cmd --zone=public --add-rich-rule='rule service name="http" limit value="100/s" accept' --permanent

    3. 启用日志记录

    • 配置防火墙日志(记录被拒绝的流量):bash
    # 修改全局配置文件
    sed -i 's/logging=off/logging=on/' /etc/firewalld/firewalld.conf
    sed -i 's/log-level=error/log-level=info/' /etc/firewalld/firewalld.conf
    
    # 在区域中开启日志(以 public 为例)
    firewall-cmd --zone=public --set-log-level=info --permanent
    firewall-cmd --zone=public --add-rich-rule='rule action="log" log-prefix="DENY: " level="info"' --permanent
    firewall-cmd --reload
    • 查看日志:bash
    tail -f /var/log/firewalld

    十、与其他工具对比

    工具

    优势

    劣势

    适用场景

    Firewalld

    动态更新、区域管理、图形界面支持

    配置复杂度高于 iptables

    企业级服务器、需要灵活规则的场景

    Iptables

    性能高、灵活性强

    静态配置、需手动管理链

    传统 Linux 服务器、性能敏感场景

    Nftables

    下一代防火墙,支持更复杂规则

    学习曲线陡峭

    高级网络策略、容器化环境(如 Kubernetes)

    十一、常见错误与解决方法

    1. 错误:No rule to chain
    • 原因:手动修改 iptables 规则导致 Firewalld 管理混乱。
    • 解决:清空 iptables 规则并由 Firewalld 接管:bash
    iptables -F && iptables -X && iptables -t nat -F && iptables -t nat -X
    firewall-cmd --reload
    1. 错误:ZONE_CONFLICT
    • 原因:同一接口被分配到多个区域。
    • 解决:检查接口所属区域并调整:bash
    firewall-cmd --get-zone-of-interface=eth0  # 确认当前区域
    firewall-cmd --zone=public --remove-interface=eth0 --permanent  # 移除冲突区域
    1. 端口映射失效
    • 原因:未启用 IP 转发或目标地址不可达。
    • 解决:bash
    sysctl -w net.ipv4.ip_forward=1  # 临时启用
    # 检查目标服务器是否可达
    ping 192.168.1.100

    十二、扩展学习资源

    1. 官方教程Firewalld 入门指南
    2. 实战案例使用 Firewalld 构建 DMZ 网络
    3. 社区工具
    • FirewallD Configuration Assistant:图形化配置工具(firewall-config 命令)。
    • Ansible 模块:通过 firewalld 模块自动化配置防火墙。