以具体的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
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
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
2
3
如你希望我提供一个 完整可执行的 Shell 脚本示例(含防火墙清除、规则设置等),我也可以补充。需要吗?
编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05