OpenVPN 服务器将客户端连接到第二个网络

OpenVPN 服务器将客户端连接到第二个网络

我有两个独立的家庭网络。一个连接到互联网,另一个用于断开连接的物联网设备。

我使用独立网卡将 Ubuntu 服务器连接到这两个网络。

我验证了我可以从该服务器访问两个网络中的设备的数据(使用旧方法curl获取 http 请求)。我也可以从该服务器访问互联网。

然后我安装了 OpenVPN,并按照以下说明进行设置:服务器空间

下一步我配置了一个客户端并能够从互联网连接到这个 vpn 服务器。

当客户端连接时,它可以访问互联网和其中一个内部网络,但不能访问另一个。

从 vpn 服务器执行route -n我得到:

0.0.0.0         12.12.1.1       0.0.0.0         UG    100    0        0 eno1
0.0.0.0         13.13.0.1       0.0.0.0         UG    200    0        0 eno2
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
12.12.1.0       0.0.0.0         255.255.255.0   U     100    0        0 eno1
12.12.1.1       0.0.0.0         255.255.255.255 UH    100    0        0 eno1
13.13.0.0       0.0.0.0         255.255.255.0   U     200    0        0 eno2
13.13.0.1       0.0.0.0         255.255.255.255 UH    200    0        0 eno2

vpn客户端连接到网络10.8.0.0并被分配ip地址10.8.0.2

连接的vpn客户端:

  • 可以访问网络12.12.1.0
  • 可以访问互联网。
  • 13.13.0.0无法从...访问任何 IP 地址

我的配置缺少什么来允许 VPN 客户端访问第二个网络?

更新

我尝试从 eno2(13.x)的脚本中添加 NAT 命令,但仍然不起作用...我/etc/iptables/add-openvpn-rules.sh用以下内容修改了创建的文件(空格之前的部分由脚本自动创建):

#!/bin/sh
iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eno1 -j MASQUERADE
iptables -I INPUT 1 -i tun0 -j ACCEPT
iptables -I FORWARD 1 -i eno1 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o eno1 -j ACCEPT
iptables -I INPUT 1 -i eno1 -p udp --dport 1194 -j ACCEPT

iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eno2 -j MASQUERADE
iptables -I FORWARD 1 -i eno2 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o eno2 -j ACCEPT
iptables -I INPUT 1 -i eno2 -p udp --dport 1194 -j ACCEPT

运行iptables -S 重启后我得到以下信息:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i eno2 -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i eno1 -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A FORWARD -i tun0 -o eno2 -j ACCEPT
-A FORWARD -i eno2 -o tun0 -j ACCEPT
-A FORWARD -i tun0 -o eno1 -j ACCEPT
-A FORWARD -i eno1 -o tun0 -j ACCEPT

答案1

首先,VPN 服务器上的防火墙(即 iptables“FORWARD”链)必须允许发送和接收数据包。

其次,你所有的设备都需要有路由后退到VPN网络,否则它们只能接收来自VPN客户端的数据包,但无法响应它们。

例如,12.12.* 网络上的设备(或者更常见的是,不是设备本身而是该网络的网关)将需要一条路由“10.8.0.0/24 via 12.12.1.1”。

如果无法做到这一点,您的替代方案是让 VPN 服务器在两个网络之间执行 SNAT(即源地址“伪装”)。使用 SNAT,来自 VPN 客户端的所有数据包都将看起来像它们实际上来自 VPN 服务器本身(即来自 12.12.1.1)——在您的情况下,它与您的设备位于同一网络上,因此设备已经知道如何访问它。

看来你使用的 VPN 安装脚本(它确实很多的东西)实际上为一个接口添加了 iptables SNAT 规则;你可以在/etc/iptables/add-openvpn-rules.sh963-977 行在脚本中)。 相关规则如下所示 – 使用 iptablesMASQUERADE操作:

iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o $NIC -j MASQUERADE

当然,还有允许转发的数据包通过的规则:

iptables -I FORWARD 1 -i $NIC -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o $NIC -j ACCEPT

由于两个接口上有两个网络,因此您需要复制这些规则(或以不同的方式重写它们)。

相关内容