当前位置: 首页 > 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-AINPUT-s192.168.1.100-jDROP# 只允许 SSH 和 HTTPiptables-AINPUT-ptcp--dport22-jACCEPT iptables-AINPUT-ptcp--dport80-jACCEPT iptables-AINPUT-jDROP# 默认拒绝

nat 表

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

# SNAT:内网出口伪装(MASQUERADE 动态获取出口 IP)iptables-tnat-APOSTROUTING-s10.0.0.0/24-oeth0-jMASQUERADE# DNAT:端口转发(外部访问 8080 转发到内网 192.168.1.50:80)iptables-tnat-APREROUTING-ieth0-ptcp--dport8080-jDNAT --to-destination192.168.1.50:80

mangle 表

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

# 降低 P2P 流量优先级iptables-tmangle-AFORWARD-ptcp--dport6881:6889-jMARK --set-mark 0x1

规则匹配:从简单到复杂

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

基础匹配

# 协议匹配-ptcp,-pudp,-picmp,-pall# 地址匹配-s192.168.1.0/24# 源地址-d10.0.0.1# 目标地址# 端口匹配(需配合 -p tcp/udp)--sport1024:65535# 源端口范围--dport80# 目标端口# 网卡匹配-ieth0# 入口网卡(INPUT/PREROUTING/FORWARD)-oeth1# 出口网卡(OUTPUT/POSTROUTING/FORWARD)

扩展匹配:状态检测

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

# 只允许已建立连接和相关连接(被动模式 FTP)iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT# 拒绝无效包(可能被篡改)iptables-AINPUT-mstate--stateINVALID-jDROP

四种状态:

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

扩展匹配:限速防护

limit模块实现令牌桶算法:

# 限制 SSH 登录尝试:每分钟最多 3 次, burst 5iptables-AINPUT-ptcp--dport22-mstate--stateNEW\-mlimit--limit3/minute --limit-burst5-jACCEPT iptables-AINPUT-ptcp--dport22-mstate--stateNEW-jDROP

扩展匹配:字符串过滤

string模块匹配应用层数据:

# 阻止包含特定关键词的 HTTP 请求iptables-AFORWARD-ptcp--dport80-mstring--string"badword"--algobm-jDROP

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

NAT 原理:SNAT vs DNAT

SNAT(源地址转换)

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

# 网关服务器配置iptables-tnat-APOSTROUTING-s192.168.0.0/16-oeth0-jSNAT --to-source203.0.113.10# 或者用 MASQUERADE(动态 IP 场景,如拨号上网)iptables-tnat-APOSTROUTING-oppp0-jMASQUERADE

工作流程:

  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-tnat-APREROUTING-ieth0-ptcp--dport80-jDNAT --to-destination192.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-tnat-APREROUTING-ieth0-ptcp--dport2222-jDNAT --to-destination192.168.1.50:22# FORWARD 链放行iptables-AFORWARD-ptcp-d192.168.1.50--dport22-jACCEPT# 开启 IP 转发echo1>/proc/sys/net/ipv4/ip_forward

实战:防 SSH 暴力破解

#!/bin/bash# 防护脚本:限制 SSH 登录频率 + 封禁暴力破解 IP# 清空现有规则iptables-Fiptables-X# 默认策略iptables-PINPUT DROP iptables-PFORWARD DROP iptables-POUTPUT ACCEPT# 允许回环iptables-AINPUT-ilo-jACCEPT# 允许已建立连接iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT# SSH 限速:每分钟最多 4 次新连接iptables-AINPUT-ptcp--dport22-mstate--stateNEW\-mrecent--nameSSH--setiptables-AINPUT-ptcp--dport22-mstate--stateNEW\-mrecent--nameSSH--rcheck--seconds60--hitcount5-jDROP iptables-AINPUT-ptcp--dport22-jACCEPT# 允许 HTTP/HTTPSiptables-AINPUT-ptcp--dport80-jACCEPT iptables-AINPUT-ptcp--dport443-jACCEPT# 允许 ICMP(ping)iptables-AINPUT-picmp --icmp-type echo-request-jACCEPT

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

常见陷阱

1. 规则顺序

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

# 错误:先放行所有,后面的 DROP 永不执行iptables-AINPUT-jACCEPT iptables-AINPUT-s192.168.1.100-jDROP# 正确:先拒绝,再放行其他iptables-AINPUT-s192.168.1.100-jDROP iptables-AINPUT-jACCEPT

2. conntrack 表溢出

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

# 查看当前连接数cat/proc/sys/net/netfilter/nf_conntrack_count# 查看表大小上限cat/proc/sys/net/netfilter/nf_conntrack_max# 调大上限(临时)echo262144>/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 包aptinstalliptables-persistent

iptables vs nftables

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

特性iptablesnftables
规则语法分散(-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.cnnetsun.cn/news/2719544.html

相关文章:

  • 115网盘原生播放:如何通过Kodi插件实现云端流媒体直通车
  • 最大优势: 知道怎么活下去的底线成本,底线以上就是财富自由,富二代的人最大的劣势就是回不去吃苦的时候 ,而你体验过且能再回去
  • 2026年求职者必看:5 个 Word 简历模板网站实测,可直接编辑
  • 魔兽争霸3终极帧率优化指南:使用WarcraftHelper解锁流畅游戏体验
  • ZYNQ开发避坑指南:手把手教你解决PS与DDR通信的Cache一致性问题
  • 别再手动改代码了!用Gem5调试片上网络(NoC)的保姆级实战指南(附脚本)
  • 死锁与进程资源分配问题的解法
  • 12V输入双路输出电源板:5V用7805、3.3V用AMS1117,含可编辑Altium原理图与PCB
  • IDC + 魔力象限:低代码市场与技术双维度选型指南
  • STM32单片机Cache配置实战:手把手教你用CubeMX开启数据缓存提升性能
  • 7个实战技巧:快速掌握Happy Island Designer的进阶用法
  • 终极指南:如何为qBittorrent添加20+搜索引擎插件,打造全能下载体验
  • 深度学习框架NeuroScalar:革新微架构性能预测
  • 别再用 > 和 >> 了!Linux tee命令的5个实用场景,从日志记录到管道调试
  • Mac Mouse Fix终极指南:如何让你的普通鼠标在macOS上超越苹果触控板体验?
  • 30+程序员转行网安指南!行业红利还能吃几年?收藏起来慢慢看
  • 用Python从零实现混沌博弈算法(CGO):一个骰子如何帮你优化参数?
  • ESP8266+阿里云物联网平台:从设备创建到双向通信的保姆级配置指南
  • 一念赴奇迹,新途启布拉齐恩
  • 深入理解VLC for Android架构解析:从LibVLC核心引擎到跨平台媒体播放实现
  • Allegro高速设计避坑:为什么你的等长明明绿了,信号还是有问题?(附Z_AXIS_delay设置详解)
  • Docker 入门指南:从零开始掌握容器化技术
  • 阿里云物联网平台实操:5分钟创建产品与设备,搞定ESP8266的MQTT连接参数
  • LAMMPS、VMD、OVITO、MATLAB:分子动力学MSD计算工具实战对比与避坑指南
  • 实战演练:基于claude code skill在快马平台构建电商商品筛选组件
  • WinForm桌面程序里直接跑Unity3D场景,C#和Unity实时互传数据
  • 实测一站式 AI 聚合站点|全功能深度上手分享
  • 5分钟快速上手:DamaiHelper抢票助手终极指南
  • 婴幼儿辅食标签高标准管控,细微标注失误可能触发市场下架 ——IACheck+AI 报告文档审核守护婴配食品报告质量关口
  • 5分钟掌握微信好友检测:快速发现谁删除了你