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 表与链(四表五链)

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

- SNAT(源地址转换):用于私网主机访问外网时把源地址改为公网地址(常用于静态公网 IP)。
- 原理:将内部网络的私有IP地址一对一地永久映射到一个公网IP地址。
- 特点:
- 为每个内部设备分配一个固定的公网IP地址。
- 适用于需要外部设备能够直接访问的内部服务器,例如Web服务器或邮件服务器。
- 不足:: 会消耗大量的公网IP地址,不适合大规模的网络。
- 原理: 将内部网络中多个私有IP地址映射到少数几个公网IP地址池中的某个地址。 当数据包从内部网络发出时,路由器会将源IP地址转换成公网IP地址,并使用不同的端口号来区分来自不同内部设备的通信。
- 特点:
- 允许多个内部设备共享少量的公网IP地址,极大地节约了公网IP资源。
- 是目前解决IPv4地址短缺问题最常用的SNAT方式。
- 应用场景: 大多数公司和家庭网络通过一个或几个公网IP地址访问互联网时,都采用了动态SNAT (PAT)。
- 注意:路由/转发需启用内核转发
sysctl -w net.ipv4.ip_forward=1(并写入/etc/sysctl.conf以持久化)。
SNAT的两种主要方式
1. 静态SNAT (Static NAT)
2. 动态SNAT (Dynamic NAT) / PAT (Port Address Translation)
- 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.service、firewall-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)到内网主机
- 开启 IP 转发:
- 配置 DNAT(把公网 IP 的 80 转到内网 192.168.146.10:80):
- 确保 FORWARD 链允许转发:
- 如果内网主机回复包需要 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...