Posted in: IT, Life, Mobile/iOS, PC/macOS

利用 WireGuard 搭建 VPN 用于远程访问家庭局域网

本文讨论的是远程访问家庭设备,而不是用于科学上网。客户端只需要在访问局域网 IP 时使用 VPN,其他情况下都直连网络。

相关文章

如果家里有一个 24 小时不间断运行的设备,并且这个设备可以安装一些软件的话,在上面搭建一个 VPN 服务器从而用于远程访问家庭局域网的其他设备,这是一个好主意。这个设备可以是一台台式机、主机、NAS、废弃的笔记本电脑等,但对于大多数家庭来说,路由器也许是一个唯一的选项。下面以我家的红米 AX5 路由器为例,它已经刷机安装了 OpenWrt 系统,丧失了 Wi-Fi 功能,当成了一个微型主机来使用。

选择什么样的 VPN 服务器?

开始我选择的是 Shadowsocks,很快发现不对劲:客户端连接并访问了一段时间(大约几分钟)之后,很快家庭的网络会丢失 IPv4 网络访问能力,只剩下 IPv6。这时只能重启主路由器,这就很不方便了。原因不明。

后来查阅一番资料后,选择了 WireGuard 1 2。虽然本质上它不是客户端 – 服务端的传统 VPN 模式,而是对等的 Peer 模式,但是因为在现实操作中,具有公网 IP 且固定不动的设备一般只有 1 个,可以视为服务器,而其他 Peer 就是客户端,所以完全可以当成 VPN 来使用,而且非常方便。

设置方法

以 OpenWrt 为例,可以参考网上很多教程。本文只记录一些坑。

最大的坑:如何设置 Allowed IPs?

有两处 Allowed IPs,这是最难理解的地方。

坑二:macOS 访问速度很慢

这真是醉了😵‍💫!

macOS 和 iOS 位于相同的远程外部 Wi-Fi 下,相同的配置(当然各自的 IP 地址和密钥不同,其他确定完全相同),iOS 能很顺利地访问,而 macOS 虽然能够连接,但访问速度非常慢,基本上就是卡死的状态。慢到什么程度?大约 30 秒传输 20 KB。试了不同浏览器、不同 Wi-Fi 、甚至是利用 iOS 的移动数据热点,都不行。

最后是瞎猫碰上死耗子在 reddit 上发现有人设置了 MTU = 1300。我也试着设置了一下,可以了。iOS 不用设置,而 macOS 必须设置。想不通的。

Comment
byu/Pigna099 from discussion
inWireGuard

坑三:只能访问路由器,不能访问局域网内的其他设备

连接之后,发现只能访问 VPN 网段(例如 OpenWrt 路由器的管理页面),却不能访问局域网本身的网段,这是因为还没有增加转发规则。方法是在 OpenWrt 的网络→防火墙→NAT规则下面新增一条:

坑四:只能访问远程局域网设备,不能上别的网

客户端的配置里面,DNS Server 留空不要填写。

坑五:外网无法连接 SSH

不用 VPN 时可以连接 SSH,用了 VPN 后无法连接,显示 connection refused。目前没有找到方法,我干脆一刀切:先安装 luci-app-ttyd 这个软件包以在 web 页面上操作命令行。然后关闭了 SSH 服务。以后要什么命令就直接在网页版操作得了,还便于在手机上使用呢!对于 luci-app-ttyd 来说,把登陆命令设置为 /bin/login -f root 可以免密码登陆。

如何让客户端自动开关 VPN?

如果连上家里的 Wi-Fi 就自动断开 VPN,断开家里的 Wi-Fi 就自动连上 VPN,那该多好啊。因为我只有 iOS 和 macOS 设备,所以就仅限于这两者来说:

iOS

比较简单,Shortcuts 里的自动化就可以。设置连接家庭 Wi-Fi 时断开 VPN,断开家庭 Wi-Fi 时连接 VPN 即可。

macOS

难度较大,因为 macOS 的 Shortcuts 里没有自动化的功能。经过多方查阅,得知方法是使用 auto-toggle-vpn。但是需要修改一下,修改的位置在此处

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk -F': ' '/^ *SSID:/ {print $2}'

改成

ipconfig getsummary en0 | grep 'SSID' | grep -v 'BSSID' | awk -F ' : ' '{print $2}'

其中 en0 是自己的 macOS 的网口,可以在 ifconfig 里面查询得到。

具体步骤是:

  1. 安装原版
  2. 修改代码
  3. 编译更新后的代码,获得新的二进制文件
  4. 替换原安装文件
  5. 运行。方法和原版一样

使用公网 IPv6

服务器地址也可以使用公网 IPv6。遗憾的是,macOS 和 iOS 的客户端均不支持域名双栈解析 3,例如 vpn.example.com 如果同时存在 IPv4 和 IPv6 的 IP,客户端总是优先使用 IPv4 地址。目前唯一的办法只能是在客户端准备两个 vpn 配置文件,遇到 IPv6 的网络环境时就用 v6 那个。

参考资料

  1. OpenWrt 搭建 WireGuard 服务端使用指南 | 爱一枝梅 ↩︎
  2. WireGuard 配置备忘录|Skyone Blog ↩︎
  3. Bug report: WireGuard iOS prioritizes IPv4 over IPv6 | lore.kernel.org ↩︎

Comments (3) on "利用 WireGuard 搭建 VPN 用于远程访问家庭局域网"

  1. Firefox 109.0 Windows 7

    我是用的支持端口转发的airvpn,家里nas连上vpn,vpn商家面板上设置好端口转发,就能通过vpn ip:8964访问家里的nas了 😆 ,另外也不怕下盗版被阿sir警告了

    ssh访问试试下面,vps跑过是可以的
    PostUp = ip -4 rule add from $(hostname -I | awk ‘{print $1}’) lookup main
    PostDown = ip -4 rule delete from $(hostname -I | awk ‘{print $1}’) lookup main

      1. Firefox 109.0 Windows 7

        会的,不过我测试下来影响不大
        原本下行500m,连vpn后可能是430m,只能说对我来说是够用了 😎

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注