“IP-Passthrough”OpenVPNconfiguration

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

这里是现在的networking布局:

+---------------------------------------------------+ | 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 | | | | | | | | | | | | | +--------------+ +----------------+ | | +---------------------+ | | | | | +------------------------------------------+ +---------------------------+ 

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

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

我如何设置OpenVPN以使这种路由scheme成为可能?

你想实现的确切行为似乎是不可能的。 在TUN nel模式下使用VPN,您将始终获得内部VPN IP,并支持通向NAT的NAT。 尽pipe所有stream量似乎来自另一端的IP地址,但它仍然与其他VPN用户共享,并且不会将客户端计算机直接暴露给具有该IP的Internet。

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

注释掉dev tun并开始于server ,并将其replace为:

 dev tap0 server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254 

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

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

虽然这并不常见,并不是一个好主意,但应该可以桥接一个公共networking接口,类似于在示例中已经桥接了私有192.168.8.0/24子网,使客户端的IP地址在192.168.8.128192.168.8.254之间192.168.8.254

但是,它仍然会有目前没有满足的先决条件。 您将需要有一个公共IP地址子网桥(即用于您的VPN客户端地址池 ),而不是从这里和那里这些独立的IP地址。

虽然这可能不能回答你的问题,但我认为这是你能得到的最接近的。 它可以按照您的预期工作,但是有一件事:客户端不会拥有“外部”IP地址,因为它需要驻留在服务器上。

还要注意,这不是VPN应该如何工作。

无论如何,这是你需要做的。 我在这里假设你的VPN服务器有几个IP地址,其中一个是为VPN本身保留的。 剩下的要映射到客户端,所以连接的客户端将被视为这个外部IP地址。

  1. 确保所有的客户端都有一个静态分配的地址。
  2. 来自该IP地址的SNATstream量似乎源自“外部”接口。
  3. DNATstream量指向VPN隧道的外部接口

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

为此,将以下行添加到您的服务器端openvpnconfiguration文件中:

 client-config-dir clientConfig ccd-exclusive 

创buildclientConfig目录到/etc/openvpn/目录。 这将保存每个客户端的configuration文件。 如果ccd-exclusive选项在client-config-dir指定的目录中没有相应的客户端configuration,则会导致客户端失败。 由于您的设置取决于具有外部和VPN IP地址的精确映射,所以每个客户端都应该有自己的configuration。

i在客户端configuration目录中,根据您使用的身份validation方法,创build一个名为客户端公用名称的文件,即证书的CN字段或用户名。 该文件应该包含一个简单的IP地址推送,如下所示:

 ifconfig-push 192.168.0.5 192.168.0.6 

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

redirect-gateway指令添加到客户端configuration文件以replace默认网关,如下所示:

 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>参数与上面相同。

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

剩下的是什么

这样,连接就可以在两个方向上工作:从互联网上,外部IP地址是可访问的,并且每个stream量(TCP和UDP)都将被盲目地转发到客户端。 如果客户端启动一个连接,它将被视为源自VPN服务器指定的IP地址。

这几乎是你想要的。

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

另外请注意,您必须为VPN服务器分配一个IP地址。 由于显而易见的原因,该地址不能用于将每个stream量转发给任何客户端。