iptables 防火墙

type
status
date
slug
summary
tags
category
icon
password

一、核心概念

  • 防火墙类型:硬件防火墙 / 软件防火墙(如 iptables、firewalld)。
    • 硬件防火墙:国内市场常见的领先品牌包括天融信、华为、新华三(H3C)、山石网科等;而国际市场上知名的品牌则有Palo Alto Networks、Fortinet、Check Point、Juniper Networks、Cisco等。
  • 网络“五要素”(五元组):源 IP(src)、目的 IP(dst)、源端口(sport)、目的端口(dport)、协议(protocol)。防火墙规则通常基于这五项进行匹配。
    • 示例:允许来自 192.168.1.0/24 到本机 22 端口的 TCP:
      • -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
  • 核心模块:Linux 内核的 netfilter 提供包过滤与 NAT 能力;iptables/firewall-cmd 是用户空间管理工具。

二、Netfilter 表与链(四表五链)

notion image
  • 常见表
    • 表就是存储的规则;数据包到了该链处,会去对应表中查询设置的规则,然后决定是否放行、丢弃、转发还是修改等等操作。
    • filter:默认表,负责数据包过滤(常用链:INPUTFORWARDOUTPUT)。
    • nat:地址/端口转换(常用链:PREROUTINGPOSTROUTINGOUTPUT)。
    • page icon
      nat 表链不止 PREROUTING/POSTROUTING:nat 还可包含 OUTPUT(本机生成的包也可在 nat 表处理),因此不要只认为只有两个链。
    • mangle:用于修改数据包(标记、改 TOS 等),链较多(PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING)。
    • raw:用于连接跟踪前的特殊处理(常用 PREROUTING/OUTPUT)。
    • 在多数内核中还有 security 表,且 mangle、raw 的链比 PDF 列示更多。请以 iptables -t raw -L / iptables -t mangle -L 实际检查为准。
      security:用于 LSM(如 SELinux)相关的安全挂钩(视内核配置存在)。
  • 具体的五链
    • 链就是位置:共有五个 进路由(PREROUTING)、进系统(INPUT) 、转发(FORWARD)、出系统(OUTPUT)、出路由(POSTROUTING);
    • INPUT链——进来的数据包应用此规则链中的策略
    • OUTPUT链——外出的数据包应用此规则链中的策略
    • FORWARD链——转发数据包时应用此规则链中的策略
    • PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
    • POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
  • 数据包的大致处理顺序(简化)
    • PREROUTING → 路由决策(转发 or 本机进程) → INPUT / FORWARDOUTPUTPOSTROUTING
    • NAT 操作通常在 PREROUTING(目的地址变换 DNAT)、OUTPUT(本地生成)和 POSTROUTING(源地址变换 SNAT/MASQUERADE)发生。

三、常用 iptables 命令与选项

  • 查看规则
    • iptables -nL:列出 filter 表规则(数字形式显示 IP/端口)。
    • iptables -t nat -nL:列出 nat 表规则。
    • iptables -nL --line-numbers:显示规则并带行号(便于删除指定编号的规则)。
    • 常用组合:iptables -nvL --line-numbers(显示计数器、端口、行号)。
  • 添加 / 插入 规则
    • 追加(尾部):iptables -A CHAIN <match> -j ACTION
    • 插入(指定位置):iptables -I CHAIN [rulenum] <match> -j ACTION(例如 iptables -I INPUT 2 -s 192.168.140.11 -p tcp --dport 22 -j ACCEPT)。
    • 示例:
    • 删除 / 清理
      • 删除指定规则编号:iptables -D CHAIN <num>(先用 -line-numbers 看编号)。
      • 清空链中的所有规则:iptables -F(慎用,会清空全部规则)。
    • 常用匹配选项说明
      • s <addr>:源地址(支持 CIDR)
      • d <addr>:目的地址
      • p {tcp|udp|icmp}:协议类型
      • -sport / -dport:源/目的端口(与 p tcp/p udp 一起使用)
      • i / o:入/出接口(如 i ens33
      • j {ACCEPT|DROP|REJECT|MASQUERADE|SNAT|DNAT}:目标动作(跳转)
      • m 模块扩展示例:m state --state ESTABLISHED,RELATED(状态匹配)
    • 要点:iptables 是顺序匹配、先匹配先生效。规则顺序非常关键(插入 vs 追加)。
      • page icon
        写防火墙规则需注意顺序问题(匹配规则从上至下依次匹配)
        未写规则时,会执行默认规则

    四、NAT(nat 表)详解与示例

    notion image
    • SNAT(源地址转换):用于私网主机访问外网时把源地址改为公网地址(常用于静态公网 IP)。
      • SNAT的两种主要方式
        1. 静态SNAT (Static NAT)
        • 原理:将内部网络的私有IP地址一对一地永久映射到一个公网IP地址。
        • 特点
          • 为每个内部设备分配一个固定的公网IP地址。
          • 适用于需要外部设备能够直接访问的内部服务器,例如Web服务器或邮件服务器。
        • 不足:: 会消耗大量的公网IP地址,不适合大规模的网络。
        2. 动态SNAT (Dynamic NAT) / PAT (Port Address Translation)
        • 原理: 将内部网络中多个私有IP地址映射到少数几个公网IP地址池中的某个地址。 当数据包从内部网络发出时,路由器会将源IP地址转换成公网IP地址,并使用不同的端口号来区分来自不同内部设备的通信。
        • 特点
          • 允许多个内部设备共享少量的公网IP地址,极大地节约了公网IP资源。
          • 是目前解决IPv4地址短缺问题最常用的SNAT方式。
        • 应用场景: 大多数公司和家庭网络通过一个或几个公网IP地址访问互联网时,都采用了动态SNAT (PAT)。
      • 注意:路由/转发需启用内核转发 sysctl -w net.ipv4.ip_forward=1(并写入 /etc/sysctl.conf 以持久化)。
    • MASQUERADE:类似 SNAT,但适用于外网 IP 可能动态变化(例如拨号/使用 DHCP 的出口)。
      • DNAT(目的地址转换/端口映射):把访问公网 IP 的特定端口转发到内网主机(端口映射)。
        • 补充:DNAT 后须保证 FORWARD 链允许该流量通过(例如 iptables -A FORWARD -d 192.168.146.10 -p tcp --dport 80 -j ACCEPT),并确保回复路由正确(可能需要 SNAT/MASQUERADE 或使内网主机默认路由返回到 NAT 设备)。
      • 注意:端口冲突(多个 DNAT 规则映射同一外部端口)会导致冲突,需规划端口分配。

      五、firewalld(与 iptables 的关系与操作)

      • 查看/管理服务systemctl status firewalld.servicefirewall-cmd(命令行)、firewall-config(图形)。
      • zone(区域)概念firewall-cmd --get-zones / -get-default-zone / -list-all --zone=public。服务是以服务名称映射到端口(XML 文件中定义)。
        • 查看所有区域
          • 查看默认区域
            • 查看区域的详细信息
            • 放行服务(示例)
              • -permanent 改的是持久配置,-reload 将其应用到运行时。列表会更新为包含 http 服务(端口 80)。
              • -remove 删除
              • 自定义服务:复制 /usr/lib/firewalld/services/http.xml/etc/firewalld/services/,修改并 firewall-cmd --reload。注意 XML 结构必须合法。
                • 正确的最小化 service XML 示例:
                  放在 /etc/firewalld/services/ERP.xml 后执行 firewall-cmd --reload

              六、常见操作场景(步骤化流程示例)

              场景 A:搭建 NAT 网关并转发 Web(端口 80)到内网主机

              1. 开启 IP 转发:
                1. 配置 DNAT(把公网 IP 的 80 转到内网 192.168.146.10:80):
                  1. 确保 FORWARD 链允许转发:
                    1. 如果内网主机回复包需要 NAT(取决于路由):添加 SNAT/MASQUERADE:

                      场景 B:安全地设置默认 DROP(避免把自己踢掉)

                      • 插入允许 SSH 的规则(位于更前面),再在最后追加默认 DROP。或者使用 iptables-apply(如果系统有)或临时定时任务在 1 min 后回滚,以防锁死。示例:

                        七、保存与持久化

                        • iptables 临时 / 恢复iptables-save > /etc/iptables.rules,重启后用 iptables-restore < /etc/iptables.rules 恢复。
                        • 发行版差异:RHEL/CentOS 可安装 iptables-services 并使用 service iptables save(注意版本差异)。firewalld 使用 firewall-cmd --permanent 持久化。
                        • 现代替代:很多发行版已逐步向 nftables 过渡,firewalld 在后台可能使用 nftables 作为实现层(务必根据你的系统版本确认)。(补充)

                        八、速查表(常用命令)

                        • 列表(filter):iptables -nL --line-numbers
                        • 列表(nat):iptables -t nat -nL --line-numbers
                        • 插入规则:iptables -I INPUT 1 <match> -j ACCEPT
                        • 追加规则:iptables -A INPUT <match> -j DROP
                        • 删除规则(按编号):iptables -D INPUT <num>
                        • 清空规则:iptables -F(危险)
                        • 保存:iptables-save > /etc/iptables.rules
                        • 恢复:iptables-restore < /etc/iptables.rules
                        • 查看 firewalld zones:firewall-cmd --get-zones
                        • 添加 service(持久):firewall-cmd --permanent --add-service=http && firewall-cmd --reload

                        九、建议与排错要点

                        • 在远程操作防火墙前:总是先插入允许 SSH 的规则并确认,再做默认 DROP;或使用自动回滚机制以防被锁死。
                        • 端口映射失败时检查:是否启用了 IP 转发、FORWARD 链是否允许流量、是否需要 SNAT 返回路径、目标服务是否在内网主机监听。
                        • firewalld vs iptables:不要同时手工维护两套规则(会互相覆盖/冲突)。若使用 firewalld,请用 firewall-cmd 管理;若使用 iptables-services,请确保服务与系统兼容。
                        • 版本差异:不同 Linux 发行版/版本(尤其向 nftables 过渡的)在实现细节上会不同,实操前请确认内核/发行版文档。

                         
                        Loading...