Linux tun 接口数据包路由

Linux tun 接口数据包路由

我对以下场景的 IP 数据包流有疑问。

场景如下:

  1. 客户端有一个 tun0(10.0.0.2/8)接口和一个物理无线网卡 wlan0(ip 地址不固定),wlan0 可以连接到互联网,
  2. 服务器端(Ubuntu 12.04 amd64)上的另一个 tun0(10.0.0.1/8)接口和物理以太网卡 eth0(192.168.1.38/24),eth0 位于 NAT 防火墙后面的私有网络上,可以通过防火墙连接到互联网(防火墙作为网关),
  3. 在服务器端运行“echo 1 > /proc/sys/net/ipv4/ip_forward”,
  4. 在服务器端运行“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。我的问题是:

  1. 反向 NAT 是否会将 http 回复的目标 IP 地址恢复为 10.0.0.2,
  2. 服务器 eth0 如何知道将反向 NAT 的 http 回复转发到哪里?
  3. 由于回复的目标 IP 地址被反向 NAT 为 10.0.0.2,eth0 是否会将 http 回复转发到服务器 tun0 (10.0.0.1)?
  4. 我是否需要在服务器端添加路由,以便正确路由/转发反向 NAT 的 http 回复?如果需要,该怎么做?
  5. 我是否需要在服务器端添加一些 iptables 规则,以便正确路由/转发反向 NAT 的 http 回复?如果需要,该怎么做?

有任何想法吗?感谢您的任何建议。

相关内容