我对以下场景的 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请求仍然会有一个源ip地址10.0.0.2,如果我错了,请纠正我),然后进行 NAT 将来自 eth0 的 http 请求重新打包(即源 IP 地址更改为 192.168.1.38,因为我运行了 iptables 命令),然后重新打包的 http 请求穿过防火墙(然后是互联网)到达目的地。
当 http 回复(来自网站)到达服务器 eth0 时,应该在那里进行反向 NAT。我的问题是:
- 反向 NAT 会将 http 回复的目标 IP 地址恢复为 10.0.0.2,
- 服务器 eth0 如何知道将反向 NAT 的 http 回复转发到哪里?
- eth0 会将 http 回复转发到服务器 tun0 (10.0.0.1),因为回复的目标 IP 地址被反向 NAT 为 10.0.0.2 吗?
- 我是否需要在服务器端添加一条路由,以便正确路由/转发反向 NAT 的 http 回复?如果是,怎么办?
- 我是否需要在服务器端添加一些 iptables 规则才能正确路由/转发反向 NAT 的 http 回复?如果是,怎么办?
答案1
假设您的客户端通过 tun0 发送所有流量,您需要在服务器端添加以下内容(启用 /proc/sys/net/ipv4/ip_forward 后):
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
完成此步骤后,当您从客户端浏览网页时,数据包流程如下:
- 客户端将数据包发送到 10.0.0.1。
- 在服务器端,tun0 上收到的数据包将从 10.0.0.2 转换为 192.168.1.38。
- 将在 NAT 表中创建映射条目。
- 数据包将通过 192.168.1.1(网关)发送到互联网。
- 响应将在 192.168.1.38 收到。
- 将根据步骤 3 中创建的映射条目进行反向 NAT。
- 响应数据包将被路由回 10.0.0.2。
完全希望我没有错过一些重要的步骤:)