我的家庭网络上有一台运行着 OpenVPN 服务器的 RasberryPi。它非常适合我的日常使用。当我在旅行时,我可以通过连接手机/笔记本电脑到上述 VPN,使用 RDP 和 ssh 连接到家里的 PC。据我所知,这是使用 VPN 的“正常”方式。
现在的问题来了。我家有一位长期客人,他希望在住在这里时能够使用他们的家用桌面。我给了他们一个 ovpn 配置文件,他们导入了它,并且可以从他们的家用机器连接到我的 VPN。
到目前为止,我只能从通过 VPN 连接的设备(即我的手机、他的手机)远程访问我客人的家用机器。我猜这是因为这些设备都在同一个 10.8.0.* 地址空间中,而我的网络是 192.168.1.*。为什么我可以从 10.8.0.* 连接到 192.168.1.*,从 10.8.0.* 连接到 10.8.0.*,但反过来却不行(192.168.1.* 连接到 10.8.0.*)?
主机和客户端机器都是Windows 10。
我尝试按照此指示在主机上添加路由回答,但出现此错误:
PS C:\Windows\system32> route ADD 10.8.0.10 MASK 255.255.255.0 10.8.0.1
The route addition failed: The parameter is incorrect.
我还尝试使用 VPN 服务器的本地 IP(wlan0 和 eth0)作为最后一个参数(代替 10.8.0.1,得到了相同的结果。我也在客户端机器上尝试了各种组合,但都出现了同样的错误。
那个问题早已过时了,答案也没有帮助我,所以我希望这个没问题。不幸的是,这是我经过几个小时的研究后发现的唯一答案。我发现的其他一切都与分割隧道有关,我不认为这是我想要的。
是否可以以这种方式“反向”使用 VPN?
答案1
为什么我能够从 10.8.0.* 连接到 192.168.0.*,以及从 10.8.0.* 连接到 10.8.0。,但不是相反 (192.168.0.升级至 10.8.0.*?
您能够从 10.8.0.* 连接到 192.168.0.*,因为
OpenVPN 服务器直接连接到两个网络,因此自动具有到两个网络的“直接”或“本地子网”路由;
OpenVPN 服务器很可能设置为对 VPN→LAN 方向的数据包执行 NAT,本质上隐藏10.8.0.* 网络。
当你从 VPN 连接到 LAN 时,你的 LAN 主机认为它们正在与 VPN 服务器通信本身– 具体来说是 192.168.0.x 地址,它们已经知道如何到达该地址,因此仍然能够回复。
(就像互联网主机能够回复您的电脑一样 - 他们认为他们正在与您的路由器的公共 IP 对话。)
简而言之,NAT“掩盖”了端到端可路由性的缺乏,这就是为什么大多数“Pi 家庭 VPN”教程倾向于包含它的原因。(而且许多家用路由器的路由表都被锁定,无法进行手动配置……)
我尝试按照此答案的指示在主机上添加路由,但出现以下错误:
PS C:\Windows\system32> route ADD 10.8.0.10 MASK 255.255.255.0 10.8.0.1 The route addition failed: The parameter is incorrect.
第一个问题是,您无法添加“通过 10.8.0.1”的路由,因为……您没有路由到尚未达到 10.8.0.1 的水平。
(即使您拥有的“默认”路由与所有地址匹配,也是不够的 - 首先,它会引导错误的方向;这就是您首先添加自定义路由的原因 - 更重要的是,它不是“直接”路由,它本身已经是“网关”路由,并且您无法通过位于另一个网关后面的网关进行路由。)
一般规则是网关地址(“via”地址)必须可直接访问,这大致意味着它必须位于 PC 自己的子网内。如果您的计算机位于 192.168.0.x/24 子网中,则“网关”地址也必须是 OpenVPN 服务器的 192.168.0.x 地址。
或者换句话说,“网关”地址必须是 Pi 接口的地址面对电脑(通常是 eth0 或 wlan0),而不是背对它的那个。
(所有这些都有例外,但大多数常规情况下都是这样的。)
我还尝试使用 VPN 服务器的本地 IP(wlan0 和 eth0)作为最后一个参数(代替 10.8.0.1,得到了相同的结果
您的路由的第二个问题是“目标”(10.8.0.10) 与“掩码”(255.255.255.0) 相矛盾。也就是说,您指定的目标表示您要路由特定主机,而您指定的网络掩码表示您要路由整个 10.80.0.x 网络。
如果要路由整个 10.8.0.x 网络,请指定全零该网络的地址(通常称为“网络地址”)作为目的地。 在您的例子中,该地址是。
10.8.0.0
如果您要路由单个地址,则调整掩码以仅覆盖单个地址 - 使用
255.255.255.255
或10.8.0.10/32
。
因为这是一条“via”路线,所以它根本不关心实际的子网大小(只有最终的路由器需要知道),因此掩码不是直接从子网掩码复制而来的;它会根据需要进行调整。
我也在客户端机器上尝试了各种组合,但都出现了同样的错误。
从客户端计算机来看,情况可能如此192.168.0.0 mask 255.255.255.0 10.8.0.1
,但存在一些额外的复杂性,因为大多数 OpenVPN 设置使用“tun”模式,该模式实际上不支持“通过”任何特定网关进行路由 - 您只能“通过”整个隧道进行路由(使用参数iface
)。最重要的是,这种模式并不是 Windows 中的内置概念,并且可能会根据 OpenVPN 客户端当时正在使用的 3 种不同 Windows 隧道驱动程序(TAP、Wintun、DCO)中的哪一种而有所不同。
无论如何,听起来客户端机器已经收到了 192.168.0.x 的路由,因为 OpenVPN 服务器将其作为连接握手的一部分推送 - 您的服务器可能有一个push "route ..."
选项,客户端 .ovpn 配置文件有一个pull
选项(或暗示它的东西) - 因此可能不需要在那里进行手动调整。