当前位置: 首页 > news >正文

Linux iptables 深度解析:从规则匹配到 NAT 转发实战

摘要:iptables 是 Linux 内核 Netfilter 框架的用户空间管理工具,通过五链(PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING)和三表(filter/nat/mangle)实现包过滤、地址转换与流量控制。本文从 Netfilter 架构出发,详解 iptables 规则匹配、NAT 原理、连接追踪、限速防护等核心机制,并给出防 SSH 暴力破解、端口转发等实战脚本,最后对比 iptables 与 nftables 的差异,帮助读者系统掌握 Linux 防火墙底层原理。

提到 Linux 防火墙,很多人第一反应是 ufwfirewalld。但真正在生产环境摸爬滚打过的都知道,底层真正干活的是 iptables。理解 iptables,不仅是掌握一个命令,更是理解 Linux 网络栈的流量控制机制。

Netfilter 架构:iptables 的底层支撑

iptables 不是一个独立的防火墙,而是 Netfilter 框架的用户空间管理工具。Netfilter 在内核协议栈中植入了 5 个钩子(Hook):

PREROUTING → INPUT → [本机进程] → OUTPUT → POSTROUTING↓               ↑FORWARD ─────────┘

这五个钩子点构成了"五链":

  • PREROUTING:数据包进入网卡后、路由判断前
  • INPUT:数据包目标是本机,进入前
  • OUTPUT:本机发出的数据包,路由判断后
  • FORWARD:数据包经过本机转发
  • POSTROUTING:数据包离开网卡前

每个钩子点可以挂载多条规则,规则按顺序匹配,匹配即执行动作(ACCEPT/DROP/REJECT)。

三表分工:filter/nat/mangle

iptables 默认三张表,各司其职:

filter 表(默认表)

包过滤,控制"放行还是丢弃":

# 拒绝来自 192.168.1.100 的所有连接
iptables -A INPUT -s 192.168.1.100 -j DROP# 只允许 SSH 和 HTTP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j DROP  # 默认拒绝

nat 表

网络地址转换,控制"源地址或目标地址改写":

# SNAT:内网出口伪装(MASQUERADE 动态获取出口 IP)
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE# DNAT:端口转发(外部访问 8080 转发到内网 192.168.1.50:80)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.50:80

mangle 表

修改 IP 头字段(TTL/TOS/DSCP),用于 QoS 或特殊路由策略:

# 降低 P2P 流量优先级
iptables -t mangle -A FORWARD -p tcp --dport 6881:6889 -j MARK --set-mark 0x1

规则匹配:从简单到复杂

iptables 的强大在于丰富的匹配条件:

基础匹配

# 协议匹配
-p tcp, -p udp, -p icmp, -p all# 地址匹配
-s 192.168.1.0/24      # 源地址
-d 10.0.0.1            # 目标地址# 端口匹配(需配合 -p tcp/udp)
--sport 1024:65535     # 源端口范围
--dport 80             # 目标端口# 网卡匹配
-i eth0                # 入口网卡(INPUT/PREROUTING/FORWARD)
-o eth1                # 出口网卡(OUTPUT/POSTROUTING/FORWARD)

扩展匹配:状态检测

state 模块基于连接追踪(conntrack)识别连接状态:

# 只允许已建立连接和相关连接(被动模式 FTP)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 拒绝无效包(可能被篡改)
iptables -A INPUT -m state --state INVALID -j DROP

四种状态:

  • NEW:新连接的第一个包
  • ESTABLISHED:双向通信已建立
  • RELATED:与已有连接相关(如 FTP 数据连接、ICMP 错误响应)
  • INVALID:无法识别状态

扩展匹配:限速防护

limit 模块实现令牌桶算法:

# 限制 SSH 登录尝试:每分钟最多 3 次, burst 5
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \-m limit --limit 3/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP

扩展匹配:字符串过滤

string 模块匹配应用层数据:

# 阻止包含特定关键词的 HTTP 请求
iptables -A FORWARD -p tcp --dport 80 -m string --string "badword" --algo bm -j DROP

--algo bm 使用 Boyer-Moore 算法(比 kmp 快)。

NAT 原理:SNAT vs DNAT

SNAT(源地址转换)

场景:内网机器共享一个公网 IP 上网

# 网关服务器配置
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j SNAT --to-source 203.0.113.10# 或者用 MASQUERADE(动态 IP 场景,如拨号上网)
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

工作流程:

  1. 内网机器 192.168.1.50 发包到公网 8.8.8.8
  2. 经过网关,PREROUTING 链记录源地址
  3. POSTROUTING 链将源地址改为 203.0.113.10
  4. 回包到达网关,查 conntrack 表,还原目标地址为 192.168.1.50

DNAT(目标地址转换)

场景:公网访问内网服务

# 外网访问网关 80 端口,转发到内网 Web 服务器
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080

工作流程:

  1. 外网请求到达网关 203.0.113.10:80
  2. PREROUTING 链将目标地址改为 192.168.1.100:8080
  3. 回包经过 POSTROUTING,源地址改为网关 IP
  4. conntrack 确保会话一致性

端口转发完整示例

需求:外网通过网关 2222 端口 SSH 到内网服务器 192.168.1.50:22

# DNAT:修改目标地址
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.50:22# FORWARD 链放行
iptables -A FORWARD -p tcp -d 192.168.1.50 --dport 22 -j ACCEPT# 开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

实战:防 SSH 暴力破解

#!/bin/bash
# 防护脚本:限制 SSH 登录频率 + 封禁暴力破解 IP# 清空现有规则
iptables -F
iptables -X# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT# 允许回环
iptables -A INPUT -i lo -j ACCEPT# 允许已建立连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# SSH 限速:每分钟最多 4 次新连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \-m recent --name SSH --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \-m recent --name SSH --rcheck --seconds 60 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT# 允许 ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

recent 模块记录最近访问的 IP,--rcheck --seconds 60 --hitcount 5 表示 60 秒内超过 5 次新连接即丢弃。

常见陷阱

1. 规则顺序

iptables 规则按顺序匹配,匹配即停止

# 错误:先放行所有,后面的 DROP 永不执行
iptables -A INPUT -j ACCEPT
iptables -A INPUT -s 192.168.1.100 -j DROP# 正确:先拒绝,再放行其他
iptables -A INPUT -s 192.168.1.100 -j DROP
iptables -A INPUT -j ACCEPT

2. conntrack 表溢出

高并发场景,连接追踪表满了会导致丢包:

# 查看当前连接数
cat /proc/sys/net/netfilter/nf_conntrack_count# 查看表大小上限
cat /proc/sys/net/netfilter/nf_conntrack_max# 调大上限(临时)
echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max# 永久生效
echo "net.netfilter.nf_conntrack_max = 262144" >> /etc/sysctl.conf

3. NAT 后服务器看不到真实 IP

DNAT 后,内网服务器看到的是网关 IP,不是真实客户端 IP:

# 方案 1:HTTP 层面用 X-Forwarded-For(需反向代理支持)
# 方案 2:改用透明代理(TPROXY),但配置复杂

4. 规则不持久化

重启后规则丢失,需要保存:

# 保存规则(Ubuntu/Debian)
iptables-save > /etc/iptables/rules.v4# 恢复规则
iptables-restore < /etc/iptables/rules.v4# 或者安装 iptables-persistent 包
apt install iptables-persistent

iptables vs nftables

Linux 内核 3.13+ 引入了 nftables,旨在替代 iptables。对比:

特性 iptables nftables
规则语法 分散(-A/-D/-I) 统一(add/delete)
性能 线性匹配 字典/集合 O(1)
灵活性 固定链/表 可自定义
向后兼容 - iptables-translate 转换

新项目建议学习 nftables,但生产环境维护的 iptables 规则短期不会消失。

总结

iptables 难在理解 Netfilter 架构和包流转流程,规则语法反而不难。核心记忆:

  1. 五链:PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING
  2. 三表:filter(过滤)、nat(地址转换)、mangle(修改 IP 头)
  3. 规则顺序:匹配即停止,注意顺序
  4. 连接追踪:state 模块是防御利器
  5. 持久化:别忘了保存规则

更多 iptables 规则示例和实践案例,可以参考 Linux iptables 命令详解。


相关工具:IP 子网计算器 | 端口检测器

在这里插入图片描述

http://www.zskr.cn/news/1453617.html

相关文章:

  • 2026年东莞松山湖新房除甲醛公司如何择优?实地调研对比,优选东莞佰家环保科技有限公司 - 专注室内空气检测治理
  • 2026年6月发电机厂家找哪家,1000Kw发电机/康明斯发电机/自装卸升降发电机组,发电机源头工厂怎么选择 - 品牌推荐师
  • 婚恋视频匹配App完整源码:含双端APP、Web后台与智能打招呼机器人
  • 实测才敢推 2026 最新降AI率软件测评与推荐 - 降AI小能手
  • 盘点靠谱的奖项代理机构,性价比如何,哪家值得推荐 - 博客万
  • 从‘手忙脚乱’到‘指哪打哪’:我的CST Studio 3D导航操作优化之路
  • 2026 年 6 月上饶市卫生间阳台屋顶漏水防水补漏避坑指南 - 吉修匠
  • NuExtract-1.5与Phi-3.5-mini-instruct对比分析:微调带来的惊人提升
  • 武汉威固贴膜的 隐藏天花板:为什么只有迈骏蒂能拿到 PDI 省级服务商资质? - 汽车音响改装
  • 2026重庆农村自建房口碑榜:严选5家靠谱公司,真实业主的选择 - kio888
  • Phi-3-Bangla-Instruct部署指南:本地服务器、云平台与移动设备的全场景方案
  • 完整ExifToolGUI照片元数据管理教程:面向摄影爱好者的高效解决方案
  • 别再只会用PS抠图了!聊聊Image Matting技术如何让边缘更自然(附Python代码示例)
  • 交通实时监控看板:Node+Vue全栈实现,含车流热力图、信号灯状态与多源数据接入能力
  • C# WinForms项目:用EPPlus 5.x不依赖Office操作Excel(增删行、读写单元格、设样式)
  • 很多人干网络越来越迷茫,而我却在第7年看到了机会
  • ThinkSystem SR650升级Windows Server 2019?先看这篇驱动兼容性与XClarity实战
  • 技术方案:解决HDR功能在DXVK中的兼容性挑战
  • 从电路设计到智能硬件:跨领域项目实践全流程指南
  • KMS_VL_ALL_AIO:Windows与Office智能批量授权管理方案
  • WD 1.4 ConvNextV2 Tagger V2与其他图像标签模型的对比分析
  • 三步实现抖音内容自动化下载:技术原理与实战指南
  • 5分钟掌握GitHub精准下载神器:DownGit完整使用指南
  • MinerU-Diffusion环境搭建全攻略:Python 3.12与CUDA依赖完全指南
  • SVGEdit:3步掌握浏览器端的专业SVG编辑器
  • 医院手术室洁净平板灯推荐排名|符合ISO14644标准的大品牌(2026年6月最新) - 商业新知
  • 三星S4拆解全攻略:从硬件结构到故障排查的实践指南
  • 如何轻松实现Windows和Office永久激活:KMS_VL_ALL_AIO完整指南
  • XDoc API参考手册:完整接口文档与使用示例指南
  • 2026年家用电梯怎么选?济南锦盛泰东公司成市场热门之选 - GrowthUME