本文讨论的是远程访问家庭设备,而不是用于科学上网。客户端只需要在访问局域网 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 必须设置。想不通的。
坑三:只能访问路由器,不能访问局域网内的其他设备
连接之后,发现只能访问 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 里面查询得到。
具体步骤是:
- 安装原版
- 修改代码
- 编译更新后的代码,获得新的二进制文件
- 替换原安装文件
- 运行。方法和原版一样
使用公网 IPv6
服务器地址也可以使用公网 IPv6。遗憾的是,macOS 和 iOS 的客户端均不支持域名双栈解析 3,例如 vpn.example.com 如果同时存在 IPv4 和 IPv6 的 IP,客户端总是优先使用 IPv4 地址。目前唯一的办法只能是在客户端准备两个 vpn 配置文件,遇到 IPv6 的网络环境时就用 v6 那个。
参考资料
- OpenWrt 搭建 WireGuard 服务端使用指南 | 爱一枝梅 ↩︎
- WireGuard 配置备忘录|Skyone Blog ↩︎
- Bug report: WireGuard iOS prioritizes IPv4 over IPv6 | lore.kernel.org ↩︎
我是用的支持端口转发的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
你这样子就等于通过第三方连接了,速度不会下降嘛
会的,不过我测试下来影响不大
原本下行500m,连vpn后可能是430m,只能说对我来说是够用了 😎