Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 虚拟化

  • Git

  • 可视化

  • Linux

  • 远程串流等

  • SWF

  • 网络

    • ​​内网穿透(NAT穿透)

    • 代理(Proxy)

    • VPN(Virtual Private Network)

    • 代理和vpn的区别
    • 内网穿透和代理什么区别
    • iperf3网络性能测试
    • iptables

      • 可以在A主机上修改路由表实现吗
      • 以具体的ip数据包说明
        • 📦 场景设定:
        • ✅ 配置回顾(iptables 转发规则):
        • 🔄 数据包流动过程详解(按顺序):
        • ✅ 结果
        • 📌 关键点解释:
        • 💡 举例封包(TCP 层)
      • nginx可以实现吗
      • 透明 TCP 代理-重定向
  • 网站收藏
  • 技术
  • 网络
  • iptables
plantre
2025-05-24
目录

以具体的ip数据包说明

# 启用路由转发

echo 1 > /proc/sys/net/ipv4/ip_forward

# DNAT 把目标为 B 的请求转发给 C

iptables -t nat -A PREROUTING -d 1.2.3.4 -j DNAT --to-destination 5.6.7.8

# SNAT 修改源地址为 A 自己,避免 C 无法返回

iptables -t nat -A POSTROUTING -j MASQUERADE, 以具体的ip数据包说明

好的,我们通过一个具体的 IP 数据包流程示例,详细说明你配置的 iptables 规则如何让客户端 A 将原本发给服务器 B 的数据,透明地转发到服务器 C 并收到响应。


# 📦 场景设定:

  • 你现在配置在主机 A 上作为网关或跳板机。
  • 某台客户端(例如 A 本人或 A 后面的机器)原本要访问:
目的 IP(B):1.2.3.4 (已宕机)
1
  • 你希望它实际上访问:
真实处理服务器 C 的 IP:5.6.7.8
1

# ✅ 配置回顾(iptables 转发规则):

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 把发往 1.2.3.4 的数据包转发给 5.6.7.8
iptables -t nat -A PREROUTING -d 1.2.3.4 -j DNAT --to-destination 5.6.7.8

# 把原始源 IP 伪装成 A 的 IP,保证返回能成功
iptables -t nat -A POSTROUTING -j MASQUERADE
1
2
3
4
5
6
7
8

# 🔄 数据包流动过程详解(按顺序):

步骤 原始数据包内容 描述
1️⃣ 客户端发出请求 源 IP:192.168.0.100
目标 IP:1.2.3.4
客户端认为它在访问服务器 B
2️⃣ A 机器拦截到数据包(PREROUTING) - 检测目标 IP 为 1.2.3.4
- 触发 DNAT 规则
- 修改目标 IP 为 5.6.7.8
数据包现在变为:
源 IP:192.168.0.100
目标 IP:5.6.7.8
3️⃣ 数据包被转发到服务器 C 源 IP:192.168.0.100
目标 IP:5.6.7.8
C 收到请求,以为是客户端直接访问
4️⃣ C 回复响应包 源 IP:5.6.7.8
目标 IP:192.168.0.100
C 发回响应,回到主机 A
5️⃣ A 机器匹配 conntrack 连接跟踪(POSTROUTING)
触发 MASQUERADE
- A 修改响应数据包源地址
- 把源 IP 变成 1.2.3.4
(或 A 的 IP)
客户端收到响应时,看不出是 C 回复的
6️⃣ 客户端收到响应 源 IP:1.2.3.4
目标 IP:192.168.0.100
客户端以为自己与服务器 B 正常通信了

# ✅ 结果

客户端以为它与 1.2.3.4(B)建立了通信,但其实:

  • 所有请求都被 A 主机偷偷转发到了 C(5.6.7.8)
  • 所有响应也由 A 修改返回路径,伪装成 B

# 📌 关键点解释:

  • DNAT(目的地址转换):修改目标地址,把包发给新的服务。
  • SNAT/MASQUERADE(源地址转换):让返回路径正确,C 不直接返回给客户端,而是通过 A。
  • ip_forward=1:Linux 允许转发数据包,A 相当于一个透明路由器。

# 💡 举例封包(TCP 层)

请求包:

Client -> A(PREROUTING): SYN packet
Src: 192.168.0.100
Dst: 1.2.3.4 → DNAT → 5.6.7.8
1
2
3

C 收到包后返回:

C → A(POSTROUTING)→ Client
Src: 5.6.7.8 → MASQUERADE → 1.2.3.4
Dst: 192.168.0.100
1
2
3

如你希望我提供一个 完整可执行的 Shell 脚本示例(含防火墙清除、规则设置等),我也可以补充。需要吗?

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
可以在A主机上修改路由表实现吗
nginx可以实现吗

← 可以在A主机上修改路由表实现吗 nginx可以实现吗→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式