跳转至

Linux 防火墙 Iptables

上传件:Linux 防火墙 Iptables.md(原文件可下载)。

Linux 防火墙 Iptables

1 iptables 本质是什么

1.1 定义

iptables 是 Linux 内核 netfilter 框架的用户态命令行工具,用来配置内核数据包过滤、NAT、流量修改规则。

  • 真正干活的是内核里的 netfilter 5 个挂载点(5 条钩子链);
  • iptables 只是命令,把规则下发到内核生效,重启 / 重载防火墙后规则会丢失(除非写入配置持久化)。
1.2 数据包在 Linux 主机的 5 种流转路径(5 大钩子链)

所有规则都挂载在这 5 个时机,这是整个 iptables 的核心,先记住流转顺序:

  1. PREROUTING:数据包刚进入网卡,路由决策之前
  2. INPUT:路由判定数据包目标是本机进程,发给本机应用
  3. FORWARD:路由判定数据包需要跨网卡转发(你本次内网互访、内网上网全走这条链)
  4. OUTPUT:本机进程主动向外发数据包(OpenWrt 本机可以上网就是走这条链,不走 FORWARD,所以最开始内网断网但 OpenWrt 本身能上网)
  5. POSTROUTING:路由决策完成,数据包即将离开网卡之前
1.3 流转三大路径

路径 1:外部数据包 → 访问本机端口(如 SSH 登录 OpenWrt)

PREROUTING → 路由判断 → INPUT → 本机程序处理 → OUTPUT → POSTROUTING

路径 2:数据包跨网卡转发(90% 场景:内网上网、跨网段互访、端口映射)

PREROUTING → 路由判断 → FORWARD → POSTROUTING

路径 3:本机进程主动访问外网(OpenWrt 本机 ping 8.8.8.8)

OUTPUT → POSTROUTING

2 四大表(Table):规则的分类容器

ptables 用4 张表区分规则用途,每张表内置不同的链,表有执行优先级:

raw → mangle → nat → filter(从高到低)

2.1 filter 表

默认表,最常用,数据包放行 / 丢弃

  • 作用:数据包过滤,允许 / 拒绝数据包,安全防火墙核心
  • 默认不写 -t 参数时,操作的就是 filter 表
  • 支持的链:INPUT、FORWARD、OUTPUT
2.2 nat 表

网络地址转换,改源 / 目的 IP / 端口

作用:SNAT/MASQUERADE(改源 IP)、DNAT(改目标 IP)、端口映射

支持的链:PREROUTING、POSTROUTING、OUTPUT

  • PREROUTING:只能做 DNAT(路由前改目标 IP)
  • POSTROUTING:只能做 SNAT/MASQUERADE(路由后改源 IP)
2.3 mangle 表

高级流量修改

作用:修改数据包 TTL、TOS、MARK 打流量标记、QoS 限速

全 5 条链都支持,日常防火墙、家庭路由几乎用不到,OpenWrt 流量整形才会用到

2.4 raw 表

最高优先级,关闭连接跟踪

作用:绕过 conntrack 连接跟踪,用于海量高并发服务器防内核内存溢出,家用场景基本不用

2.5 表与链的支持关系表
钩子链 raw mangle nat filter
PREROUTING ✅ ✅ ✅ ❌
INPUT ❌ ✅ ❌ ✅
FORWARD ❌ ✅ ❌ ✅
OUTPUT ✅ ✅ ✅ ✅
POSTROUTING ❌ ✅ ✅ ❌

核心记忆:

  1. 过滤放行使 filter;地址转换用 nat;流量标记用 mangle;关闭跟踪用 raw。
  2. FORWARD 链只有 filter、mangle 两张表能用,nat 表没有 FORWARD 链,所以转发不能在 nat 表做放行

规则匹配顺序:

  1. 表优先级:raw → mangle → nat → filter
  2. 同一张表内:规则从上往下依次匹配,命中立即执行动作,不再向下匹配

3 规则通用语法

3.1 常用命令
参数 含义
-A Append:在链末尾追加规则(最常用)
-I Insert:在链开头插入规则(优先级最高,优先匹配)
-D Delete:删除指定规则
-L -n List:查看规则,-n 不解析域名,直接显示 IP
-F Flush:清空当前链所有规则
-P Policy:设置内置链默认策略
3.2 五大常用匹配条件
  1. 源 / 目的 IP 匹配 -s -d

-s 192.168.31.0/24:匹配数据包源地址属于该网段

-d 192.168.0.0/24:匹配数据包目标地址属于该网段

  1. 网卡匹配 -i -o

-i eth1:入网卡,数据包从 eth1 网卡进来(仅 PREROUTING/INPUT/FORWARD 可用)

-o eth1:出网卡,数据包从 eth1 网卡出去(仅 FORWARD/OUTPUT/POSTROUTING 可用)

  1. 协议 + 端口匹配 -p --dport --sport

bash iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT

  1. 连接状态匹配 -m conntrack --ctstate(最核心的安全规则)

4 种常用状态:

  1. NEW:全新发起的 TCP/UDP 连接(客户端第一次发请求)

  2. ESTABLISHED:已建立的连接

  3. RELATED:关联连接(如 FTP 被动模式、ICMP 回包)

  4. INVALID:非法异常数据包,直接 DROP

    bash # 默认万能回程放行规则 iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

  5. 网段/ip集合匹配 -m ipset

批量管理大量 IP,家用、企业高频用法

3.3 核心跳转动作 -j(Action)
1)filter 表过滤类动作
  1. ACCEPT:放行数据包,停止后续规则匹配
  2. DROP:丢弃数据包,无任何回复(推荐安全策略)
  3. REJECT:拒绝数据包,返回端口不可达报错
  4. RETURN:跳出当前自定义链,回到父链继续匹配规则
2)nat 表地址转换类动作
  1. SNAT --to-source x.x.x.x:固定源 IP 转换,静态 IP 场景最优(你最终使用的规则)
  2. MASQUERADE:动态源 IP 伪装,自动使用出站网卡 IP,适合拨号动态 IP
  3. DNAT --to-destination ip:port:目的地址转换,端口转发、内网服务暴露

3 常用规则整合版

3.1 基础运维查看、清空、默认安全策略配置
# 1. 查看规则(日常排查必用)
iptables -L -n --line-number
iptables -t nat -L -n --line-number

# 2. 清空所有旧规则(初始化环境,谨慎执行)
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X

# 3. 设置三大内置链默认安全策略(基线标准:入站、转发默认拒绝,出站默认放行)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
3.2 基础安全必备放行规则(所有 Linux 机器通用)
# 放行本地回环网卡lo(127.0.0.1本地通信必须)
iptables -A INPUT -i lo -j ACCEPT

# 放行所有已建立连接、关联连接的回程数据包(最核心规则,替代手写双向放行)
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 丢弃无效、异常畸形数据包,防护异常流量攻击
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

# 仅允许指定管理IP远程SSH 22端口登录本机
iptables -A INPUT -s 192.168.31.100 -p tcp --dport 22 -j ACCEPT

# 放行内网全网段访问本机所有端口
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT

# 拉黑单个恶意IP,禁止访问本机所有服务
iptables -A INPUT -s 10.0.0.123 -j DROP

# 放行网站80、443端口对外提供服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 仅允许内网访问数据库3306端口,禁止外网访问
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 3306 -j ACCEPT
3.3 路由转发规则(多网卡、网关场景)
# 允许LAN内网(br-lan)转发流量到WAN网卡(eth1),实现内网上网
iptables -A FORWARD -i br-lan -o eth1 -j ACCEPT

# 禁止WAN侧主动访问内网LAN,安全隔离外网对内网的扫描攻击
iptables -A FORWARD -i eth1 -o br-lan -j DROP

# 仅允许指定外网IP跨网段访问内网服务
iptables -A FORWARD -i eth1 -o br-lan -s 192.168.31.100 -j ACCEPT
3.4 NAT 地址转换规则(SNAT 源地址伪装 + DNAT 端口映射)
3.4.1 NAT/MASQUERADE 源地址转换(内网上网、跨网段互通)
# 场景1:WAN动态IP(PPPoE/DHCP),内网访问公网自动源IP伪装
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# 场景2:静态IP跨网段SNAT(你的192.168.31.0/24访问192.168.0.0/24最优规则)
iptables -t nat -A POSTROUTING \
-s 192.168.31.0/24 \
-d 192.168.0.0/24 \
-j SNAT --to-source 192.168.0.1

# 场景3:固定公网静态IP,内网统一SNAT为固定公网IP上网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.10
3.4.2 DNAT 目的地址转换(外网端口转发,暴露内网服务)
# 场景1:外网访问WAN 8080端口,转发到内网192.168.0.10的80网页端口
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 \
-j DNAT --to-destination 192.168.0.10:80

# 场景2:外网2222端口映射内网SSH 22端口,远程管理内网服务器
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 2222 \
-j DNAT --to-destination 192.168.0.20:22

# 场景3:内网访问WAN公网IP回流NAT,解决内网无法用公网IP访问本机服务问题
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 203.0.113.10 \
-j SNAT --to-source 192.168.0.1
3.5 高级常用匹配规则(限流、防攻击、多端口、IP 黑名单)
# 1. 一次性放行多个业务端口(80、443、8080)
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

# 2. 单IP最大并发连接限制,防止CC暴力攻击(单个IP最多10条TCP连接)
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 10 -j DROP

# 3. ICMP限流:每秒最多放行3个ping请求,防止ICMP洪水攻击
iptables -A INPUT -p icmp -m limit --limit 3/s -j ACCEPT

# 4. ipset批量IP黑名单(海量恶意IP统一拉黑)
ipset create blacklist hash:ip
ipset add blacklist 10.0.0.5
iptables -A INPUT -m ipset --match-set blacklist src -j DROP
3.6 ICMP ping 控制 + MTU 优化规则
# 方案1:允许所有外部主机ping本机
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 方案2:禁止外部ping本机,本机可以正常ping外网(推荐安全配置)
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# 开启TCP MSS自动钳位,解决部分网站打不开、大文件传输卡顿丢包问题
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu