我对以下场景的 IP 数据包流有疑问。
场景如下:
- 客户端有一个 tun0(10.0.0.2/8)接口和一个物理无线网卡 wlan0(ip 地址不固定),wlan0 可以连接到互联网,
- 服务器端(Ubuntu 12.04 amd64)上的另一个 tun0(10.0.0.1/8)接口和物理以太网卡 eth0(192.168.1.38/24),eth0 位于 NAT 防火墙后面的私有网络上,可以通过防火墙连接到互联网(防火墙作为网关),
- 在服务器端运行“echo 1 > /proc/sys/net/ipv4/ip_forward”,
- 在服务器端运行“iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE”,
以下是该场景的图表:
--------------- ----------------
| | | |
| client tun0 |----------| client wlan0 |
| 10.0.0.2 | | ip not fix |
| | | |
--------------- ----------------
|
|
internet
|
|
----------------
| |
| firewall |
| (gateway) |
| 192.168.1.1 |
| |
----------------
|
| private network
| 192.168.1.0/24
|
--------------- ----------------
| | | |
| server tun0 |----------| server eth0 |
| 10.0.0.2 | | 192.168.1.38 |
| | | |
--------------- ----------------
我使用了两个非常简单的类似 vpn 的客户端/服务器程序来读取/写入两个 tun0 接口的 ip 数据包并在 wlan0 和 eth0 之间创建隧道,以便来自 10.0.0.2 的 ip 数据包可以到达 10.0.0.1 反之亦然(例如可以从 10.0.0.1 运行 ftp 到 10.0.0.2)。
但是,如果我想使用客户端 tun0(10.0.0.2)浏览网页,http 请求将源自 10.0.0.2 并到达互联网 ip 地址(肯定不是 10.0.0.1)。http 请求(我认为)在到达服务器 tun0(10.0.0.1)后,将被转发到服务器 eth0(因为 ip_forward 已打开,我认为此转发的 http 请求仍将具有 10.0.0.2 的源 ip 地址,如果我错了请纠正我),然后 NAT 会将 http 请求重新打包为来自 eth0(即,当我运行 iptables 命令时,源 ip 地址更改为 192.168.1.38),然后重新打包的 http 请求通过防火墙(然后是互联网)到达目的地。
当 http 回复(来自网站)到达服务器 eth0 时,应该在那里进行反向 NAT。我的问题是:
- 反向 NAT 是否会将 http 回复的目标 IP 地址恢复为 10.0.0.2,
- 服务器 eth0 如何知道将反向 NAT 的 http 回复转发到哪里?
- 由于回复的目标 IP 地址被反向 NAT 为 10.0.0.2,eth0 是否会将 http 回复转发到服务器 tun0 (10.0.0.1)?
- 我是否需要在服务器端添加路由,以便正确路由/转发反向 NAT 的 http 回复?如果需要,该怎么做?
- 我是否需要在服务器端添加一些 iptables 规则,以便正确路由/转发反向 NAT 的 http 回复?如果需要,该怎么做?
有任何想法吗?感谢您的任何建议。