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请求仍然会有一个源ip地址10.0.0.2,如果我错了,请纠正我),然后进行 NAT 将来自 eth0 的 http 请求重新打包(即源 IP 地址更改为 192.168.1.38,因为我运行了 iptables 命令),然后重新打包的 http 请求穿过防火墙(然后是互联网)到达目的地。

当 http 回复(来自网站)到达服务器 eth0 时,应该在那里进行反向 NAT。我的问题是:

  1. 反向 NAT 会将 http 回复的目标 IP 地址恢复为 10.0.0.2,
  2. 服务器 eth0 如何知道将反向 NAT 的 http 回复转发到哪里?
  3. eth0 会将 http 回复转发到服务器 tun0 (10.0.0.1),因为回复的目标 IP 地址被反向 NAT 为 10.0.0.2 吗?
  4. 我是否需要在服务器端添加一条路由,以便正确路由/转发反向 NAT 的 http 回复?如果是,怎么办?
  5. 我是否需要在服务器端添加一些 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

完成此步骤后,当您从客户端浏览网页时,数据包流程如下:

  1. 客户端将数据包发送到 10.0.0.1。
  2. 在服务器端,tun0 上收到的数据包将从 10.0.0.2 转换为 192.168.1.38。
  3. 将在 NAT 表中创建映射条目。
  4. 数据包将通过 192.168.1.1(网关)发送到互联网。
  5. 响应将在 192.168.1.38 收到。
  6. 将根据步骤 3 中创建的映射条目进行反向 NAT。
  7. 响应数据包将被路由回 10.0.0.2。

完全希望我没有错过一些重要的步骤:)

相关内容