使用 OpenVPN 访问家庭内网

本文记录了如何使用 OpenVPN 访问家庭内网。

网络概况

  • 宽带是电信宽带,分配了动态的公网 IP
  • 光猫使用桥接模式,通过路由器拨号上网(PPPoE),路由器局域网为 192.168.3.0/24
  • 一台 Windows 10 主机,在路由器局域网上的 IP 192.168.3.120
  • Windows 10 主机上运行 Vmware 虚拟机,网络采用 NAT 模式。子网为 192.168.46.0/24。运行了 Linux 主机,IP 192.168.46.128Windows 10 主机在子网中的 IP192.168.3.1
子网 Windows 10 主机 Linux 主机 客户端
路由器 192.168.3.0/24 192.168.3.120 - -
Vmware NAT 192.168.46.0/24 192.168.46.1 192.168.46.128 -
VPN 10.8.0.0/24 10.8.0.1 - 10.8.0.6

目标和考虑因素

  1. 能从公网访问家庭内网,包括 Windows 10 主机和虚拟机上的 Linux 主机。
  2. 不想通过路由器的 NAT 功能直接将局域网上的设备映射到公网。一是为了安全,二是为了避免运营商审查。
  3. 已经使用 ZeroTier 将所需设备组建在一个局域网当中作为备选方案。
  4. 想利用公网 IP 以及上行带宽尝尝鲜。
  5. 想要能直连虚拟机上的 Linux 主机,而不是通过 VmwareNAT 映射。否则每次新增服务都要设置 NAT,修改 Windows Defender 的端口暴露规则。

实现过程

在 Windows 10 上安装 OpenVPN 服务器

在 Windows 10 上安装 OpenVPN 服务器

在 iOS 和 macOS 上安装 OpenVPN 客户端

在 iOS 和 macOS 上安装 OpenVPN 客户端

客户端访问服务端其他的私有子网

如果在所需的每一个设备上都安装 OpenVPN,将它们连接在 VPN 的子网 10.8.0.0/24 中,也是可以满足需求的,但是这样略有些麻烦。

server.ovpn 新增配置

server.ovpn 配置文件中新增一行配置,这个配置的意思是将该路由配置统一推送给客户端,让它们可以访问服务端的其他私有子网。相当于将服务端的其他私有子网的情况告知客户端,这样客户端就知道发往 192.168.46.128Packet 是发向哪里的。

1
push "route 192.168.46.0 255.255.255.0"

打开 Windows 10 主机的路由转发功能

  1. Win + R 输入 regedit 打开注册表。
  2. 找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,修改 IPEnableRouter1
  3. 重启主机

为虚拟机上的 Linux 主机新增路由

在终端中输入命令,这是为了让 OpenVPN 服务端的其他私有子网上的设备知道来自 10.8.0.0/24Packet 应该路由回 OpenVPN 服务端。

1
route add -net 10.8.0.0/24 gw 192.168.46.1

参考链接

透过openvpn来访问内网资源
OpenVPN 路由详解
OpenVPN中的另一个路由问题 - 在VPN上无法访问本地计算机
openvpn添加本地路由表
windows开启路由转发
linux route命令的使用详解
Windows命令行route命令使用图解