OpenVPN 如何通过客户端路由互联网流量

Roc*_* W. 6 linux windows openvpn linux-networking docker

我的用例:我想通过 路由所有互联网machine B流量machine A。但是,我不能简单地将 OpenVPN 服务器安装在我无法控制的 NAT/防火墙层后面machine Amachine A我当前的解决方案是安装 OpenVPN 服务器machine C,并同时拥有两者machines A并作为客户端B连接C。我正在尝试设置正确的路线,以便所有来自 的流量都B可以通过A. 下面详细介绍了每台计算机上的设置和我尝试的步骤,我剩下的问题在倒数第二段中。

现在,machine C在 Docker 容器中运行 Linux 和 OpenVPN 服务器 ( https://github.com/kylemanna/docker-openvpn )。使用redirect-gateway def1,两台客户端计算机都可以通过服务器连接和路由流量(https://ipleak.net确认服务器 IP)。但对于以下测试,redirect-gateway def1被删除,而topology subnetclient-to-client被添加。服务器有子网IP192.168.255.1和公网IP AAA.BBB.CCC.DDD

machine A运行 Windows 并已IPEnabledRouter=1在 中进行设置HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\,将服务Routing and Remote Access设置为Automatic并正在运行,并将具有 Internet 访问权限的网络适配器设置为允许从 OpenVPN TAP 适配器进行共享。它被分配了192.168.255.2

machine B运行 Windows 并位于具有 IP 的路由器后面192.168.1.100。它被分配了 OpenVPN 子网 IP 192.168.255.3。除了 OpenVPN 自动设置的路由之外,还添加了以下路由:

Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0        128.0.0.0    192.168.255.2    192.168.255.3    259
        128.0.0.0        128.0.0.0    192.168.255.2    192.168.255.3    259
  AAA.BBB.CCC.DDD  255.255.255.255      192.168.1.1    192.168.1.100    291
Run Code Online (Sandbox Code Playgroud)

machine B,我可以 pingmachine A192.168.255.2,但互联网流量仍然通过 OpenVPN 服务器路由(ipleak 显示AAA.BBB.CCC.DDD)。我尝试添加一条路由:route add default gw 192.168.255.2 tun0,但这使得客户端无法访问互联网。服务器路由表通常如下所示:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.19.0.1      0.0.0.0         UG    0      0        0 eth0
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
192.168.254.0   192.168.255.2   255.255.255.0   UG    0      0        0 tun0
192.168.255.0   0.0.0.0         255.255.255.0   U     0      0        0 tun0
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

[编辑]有关用例的更多上下文:我需要为一个部门设置 VPN,以便其用户的家庭计算机machine B可以访问基于 IP 地址限制访问的第三方资源。访问machine A并未被阻止,但组织中至少有两层 NAT/防火墙,其管理员不想更改其设置来帮助处理传入连接。因此,我们希望设计一个可行的解决方案,使用machine CVPS 作为 VPN 服务器。有一个官方的 VPN 服务,但由于它对某些外部成员开放,因此第三方供应商不希望允许其 IP 访问。

网络图

Roc*_* W. 3

原则上,设置应该与RoutedLans类似,只是我们不能简单地设置machine A为 handle 0.0.0.0。这个 SF答案解释了为什么数据包无法通过使用 TUN 接口作为网关的另一个客户端发送。但是,根据此答案的第一条评论,有一个解决方法。

machine C

  1. 将以下内容添加到服务器配置中:
topology subnet
client-to-client

route 1.0.0.0 255.0.0.0
route 2.0.0.0 254.0.0.0
route 4.0.0.0 252.0.0.0
route 8.0.0.0 248.0.0.0
route 16.0.0.0 240.0.0.0
route 32.0.0.0 224.0.0.0
route 64.0.0.0 192.0.0.0
route 128.0.0.0 128.0.0.0

push "route 1.0.0.0 255.0.0.0"
push "route 2.0.0.0 254.0.0.0"
push "route 4.0.0.0 252.0.0.0"
push "route 8.0.0.0 248.0.0.0"
push "route 16.0.0.0 240.0.0.0"
push "route 32.0.0.0 224.0.0.0"
push "route 64.0.0.0 192.0.0.0"
push "route 128.0.0.0 128.0.0.0"
Run Code Online (Sandbox Code Playgroud)
  1. machine A设置 iroutes 和in的静态 IP client-config-dir
ifconfig-push 192.168.255.2 255.255.255.0
push "route 192.168.255.0 255.255.255.0 192.168.255.1"

iroute 1.0.0.0 255.0.0.0
iroute 2.0.0.0 254.0.0.0
iroute 4.0.0.0 252.0.0.0
iroute 8.0.0.0 248.0.0.0
iroute 16.0.0.0 240.0.0.0
iroute 32.0.0.0 224.0.0.0
iroute 64.0.0.0 192.0.0.0
iroute 128.0.0.0 128.0.0.0
Run Code Online (Sandbox Code Playgroud)

machine A

  1. HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\,设定IPEnableRouter=1

  2. 将服务设置Routing and Remote AccessAutomatic并确保其正在运行。

  3. 设置具有 Internet 访问权限的网络适配器,以允许从 OpenVPN TAP 适配器进行共享。似乎每次重新启动计算机时都必须禁用并重新启用共享。

On machine B:确保redirect-gateway def1在客户端配置中。