Linux 防火墙 Iptables
Linux 防火墙 Iptables¶
1 iptables 本质是什么¶
1.1 定义¶
iptables 是 Linux 内核 netfilter 框架的用户态命令行工具,用来配置内核数据包过滤、NAT、流量修改规则。
- 真正干活的是内核里的
netfilter5 个挂载点(5 条钩子链); - iptables 只是命令,把规则下发到内核生效,重启 / 重载防火墙后规则会丢失(除非写入配置持久化)。
1.2 数据包在 Linux 主机的 5 种流转路径(5 大钩子链)¶
所有规则都挂载在这 5 个时机,这是整个 iptables 的核心,先记住流转顺序:
- PREROUTING:数据包刚进入网卡,路由决策之前
- INPUT:路由判定数据包目标是本机进程,发给本机应用
- FORWARD:路由判定数据包需要跨网卡转发(你本次内网互访、内网上网全走这条链)
- OUTPUT:本机进程主动向外发数据包(OpenWrt 本机可以上网就是走这条链,不走 FORWARD,所以最开始内网断网但 OpenWrt 本身能上网)
- 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 | ❌ | ✅ | ✅ | ❌ |
核心记忆:
- 过滤放行使 filter;地址转换用 nat;流量标记用 mangle;关闭跟踪用 raw。
- FORWARD 链只有 filter、mangle 两张表能用,nat 表没有 FORWARD 链,所以转发不能在 nat 表做放行
规则匹配顺序:
- 表优先级:raw → mangle → nat → filter
- 同一张表内:规则从上往下依次匹配,命中立即执行动作,不再向下匹配
3 规则通用语法¶
3.1 常用命令¶
| 参数 | 含义 |
|---|---|
-A |
Append:在链末尾追加规则(最常用) |
-I |
Insert:在链开头插入规则(优先级最高,优先匹配) |
-D |
Delete:删除指定规则 |
-L -n |
List:查看规则,-n 不解析域名,直接显示 IP |
-F |
Flush:清空当前链所有规则 |
-P |
Policy:设置内置链默认策略 |
3.2 五大常用匹配条件¶
- 源 / 目的 IP 匹配
-s-d
-s 192.168.31.0/24:匹配数据包源地址属于该网段
-d 192.168.0.0/24:匹配数据包目标地址属于该网段
- 网卡匹配
-i-o
-i eth1:入网卡,数据包从 eth1 网卡进来(仅 PREROUTING/INPUT/FORWARD 可用)
-o eth1:出网卡,数据包从 eth1 网卡出去(仅 FORWARD/OUTPUT/POSTROUTING 可用)
- 协议 + 端口匹配
-p--dport--sport
bash
iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT
- 连接状态匹配
-m conntrack --ctstate(最核心的安全规则)
4 种常用状态:
-
NEW:全新发起的 TCP/UDP 连接(客户端第一次发请求) -
ESTABLISHED:已建立的连接 -
RELATED:关联连接(如 FTP 被动模式、ICMP 回包) -
INVALID:非法异常数据包,直接 DROPbash # 默认万能回程放行规则 iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -
网段/ip集合匹配 -m ipset
批量管理大量 IP,家用、企业高频用法
3.3 核心跳转动作 -j(Action)¶
1)filter 表过滤类动作¶
ACCEPT:放行数据包,停止后续规则匹配DROP:丢弃数据包,无任何回复(推荐安全策略)REJECT:拒绝数据包,返回端口不可达报错RETURN:跳出当前自定义链,回到父链继续匹配规则
2)nat 表地址转换类动作¶
SNAT --to-source x.x.x.x:固定源 IP 转换,静态 IP 场景最优(你最终使用的规则)MASQUERADE:动态源 IP 伪装,自动使用出站网卡 IP,适合拨号动态 IPDNAT --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