“IP-Passthrough” OpenVPN 配置

“IP-Passthrough” OpenVPN 配置

我想创建一个 VPN 配置,允许 OpenVPN 服务器的客户端使用服务器的公共 IP,就好像它是自己的 IP 一样,连接到该 IP。

目前的网络布局如下:

                                     +---------------------------------------------------+
                                     |  Server machine (Linux)                           |
                                     |                                                   |
                                     |                                                   |
                                     |                                                   |
                    Data center----->O<--eth0-----------+                                |
                                     |  |79.102.91.184  |                                |
                                     |  |67.248.62.166  |                                |
                                     |  |94.187.137.76  |                                |
                                     |  |189.180.86.216 |                                |
                                     |  |219.167.189.118|                                |
                                     |  +---------------+                                |
                                     |                                                   |
                                     +---------------------------------------------------+

          +------------------------------------------+       +---------------------------+
          |  Router with NAT                         |       |  Client machine (Linux)   |
          |                  NAT                     |       |                           |
          |               +--------+                 |       |                           |
DSL to    |               |        |                 |  LAN  |                           |
Internet->O<---eth0-------+-+    +-+---------eth1-+->O<----->O<---eth0----------------+  |
          |  |24.174.216.166|    |192.168.2.1/24  |  |       |  |192.168.2.10/24      |  |
          |  |              |    |                |  |       |  |Router 192.168.2.1   |  |
          |  |              |    |                |  |       |  |                     |  |
          |  +--------------+    +----------------+  |       |  +---------------------+  |
          |                                          |       |                           |
          +------------------------------------------+       +---------------------------+

我想在服务器机器上设置一个 OpenVPN 服务器。然后,客户端应该能够通过互联网连接到此 VPN,例如通过连接到79.102.91.184(服务器的第一个 IP)。

在客户端计算机上,应创建一个 tap 或 tun 适配器,该适配器已分配并正确路由了服务器的其他可公开路由 IP 之一。例如,客户端现在可以使用该 IP 与互联网通信67.248.62.166(并且无法再通过该 IP 访问服务器)。

我该如何设置 OpenVPN 来实现这种路由场景?

答案1

您想要实现的确切行为似乎是不可能的。使用 VPNTUN内尔模式中,您将始终获得内部 VPN IP,并处于通往 Internet 的 NAT 之后。虽然您的所有流量似乎都来自另一端的 IP 地址,但它仍与其他 VPN 用户共享,并且不会通过该 IP 将客户端计算机直接暴露给 Internet。

OpenVPN桥接TAP模式)的行为更接近您想要的状态。您应该了解桥接和路由,但基本上它模拟链路层设备,为您提供来自另一端的 IP 地址。您还应该了解 OpenVPN以太网桥接因为在这里复制整个手册是没有用的,但这里有一个相关的引用(安装brigde-utils和编辑/运行bridge-start脚本后的配置)以供进一步讨论:

注释掉dev tun以下列内容开头的行server并将其替换为:

dev tap0 
server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254

现在设置 Linux 防火墙以允许数据包在新创建的tap0br0接口上自由流动:

iptables -A INPUT -i tap0 -j ACCEPT 
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT

虽然这并不常见并且可能不是一个好主意,但应该可以桥接公共网络接口,就像192.168.8.0/24示例中桥接的私有子网一样,为客户端提供和之间的 IP192.168.8.128地址192.168.8.254

然而,它仍然有一些目前尚未满足的先决条件。您需要有一个要桥接的公共 IP 地址子网(即用于您的VPN 客户端地址池) 来代替这些来自各处的独立 IP 地址。

答案2

虽然这可能无法回答您的问题,但我认为这是最接近答案的了。它的工作方式与您预期的一样,但有一点:客户端不会有“外部”IP 地址,因为它需要驻留在服务器上。

另请注意,这不是 VPN 的工作方式。

无论如何,您需要做的是:我假设您的 VPN 服务器有多个 IP 地址,其中一个是为 VPN 本身保留的。其余的 IP 地址将映射到客户端,因此连接的客户端将被视为此外部 IP 地址。

  1. 确保所有客户端都有静态分配的地址。
  2. 来自该 IP 地址的 SNAT 流量看起来好像源自“外部”接口。
  3. 指向 VPN 隧道外部接口的 DNAT 流量

确保所有客户端都有静态地址

为此,请将以下行添加到服务器端 openvpn 配置文件中:

client-config-dir clientConfig
ccd-exclusive

创建clientConfig目录/etc/openvpn/。这将保存每个客户端的配置文件。ccd-exclusive如果客户端在指定的目录中没有相应的客户端配置,则该选项将导致客户端失败。client-config-dir由于您的设置依赖于外部和 VPN IP 地址的精确映射,因此每个客户端都应该有自己的配置。

在客户端配置目录中,创建一个名为客户端通用名称的文件,即证书的 CN 字段或用户名,具体取决于您使用的身份验证方法。该文件应包含一个简单的 IP 地址推送,如下所示:

ifconfig-push 192.168.0.5 192.168.0.6

请注意,每个客户端都应拥有自己的 /30 网络,并从中分配两个 IP 地址,并且网络不应重叠。

将指令添加redirect-gateway到客户端配置文件以替换默认网关,如下所示:

redirect-gateway def1

此后,客户端无论何时连接都应具有相同的 IP 地址,并且连接后将重写其默认网关。

设置 SNAT

对于每个客户端,必须像这样设置 SNAT 规则:

iptables -t nat -I POSTROUTING -o <device> \
    -s <client_ip> -j SNAT --to <out_ip>

在哪里:

  • <device>是出站设备(就您而言,是eth0
  • <client_ip>是您在上一步中为客户端设置的 IP(在上面的例子中192.168.0.5
  • <out_ip>是客户端连接到的服务器所看到的 IP 地址(例如,67.248.62.166在您的示例中就是这样一个 IP)

另外,请确保将 IP 转发设置为 true ( echo 1 >/proc/sys/net/ipv4/ip_forward)。

设置DNAT

对于每个客户端,您都应该发出如下命令:

iptables -t nat -A PREROUTING \
    -i <device> -d <out_ip> -j DNAT --to <client_ip>

<device><out_ip>参数<client_ip>与上面相同。

iptables如果连接未处于活动状态(实际上,openvpn 服务器不需要运行),则可以发出上述命令。

遗漏的内容

这样,连接就可以双向进行:从互联网,可以访问外部 IP 地址,并且每个流量(TCP 和 UDP)都将被盲目转发到客户端。如果客户端发起连接,它将被视为源自 VPN 服务器指定的 IP 地址。

这几乎就是您想要的。

有一件事是行不通的:客户端将无法获取外部接口。事实上,客户端甚至不知道外部 IP 地址。也就是说,您将无法绑定到(例如)189.180.86.216。但是,您将能够使用0.0.0.0,这样客户端就可以通过“外部”IP 地址访问。

还要注意,你必须为 VPN 服务器分配一个 IP 地址。出于显而易见的原因,该地址不能用于将所有流量转发到任何客户端。

相关内容