自建 VPN 服务器前,需要先定下什么?
装服务器程序是最简单的一步。先把出口端点、客户端身份、地址段和回去的路定下来,再动手安装。
装服务器程序只是自建 VPN 里最短的一段,却往往是人们最先动手的一步。部署能不能用,取决于客户端能否到达端点、到达之后能访问什么,以及隧道恰好是坏掉的那一环时你怎么进去。这三件事都要在包管理器运行之前定下来。
其中两件是设计决策,第三件是运维习惯。三件事在纸面上修,都比在故障里修便宜。
先定客户端该访问什么
远程接入型服务器需要一条通往它所宣告的私有网络的路由,以及一条让回包走回去的路径,因此它是那张网的路由器,而不只是一个监听者。互联网出口型服务器需要转发,还需要一套地址分配或地址转换的安排,握手完成本身并不提供这两样。先定用途再定拓扑,因为两种设计在路由、防火墙规则以及客户端往隧道里送什么上都不一样。要求两头都做的服务器,需要两套规则,还需要把客户端的默认路由相应地切开。
隧道段和局域网段要选得不可能和你客户端已在用的网段撞上,因为一台已经持有 192.168.1.0/24 的笔记本会继续走那条路由,而不会接受一条发同样前缀的隧道。IPv4 和 IPv6 要分开检查,很多人第一样做对了,就再也没发现第二样。若服务器位于另一台路由器之后,要从外部确认入站可达,而不是相信一条端口转发就能描述每一层。
身份、密钥与回去的路
软件支持的话,每台设备发一份独立身份,这样笔记本丢了只需要吊销一个对端,而不必重建服务器。私钥应放在受保护的存储里,绝不能放进被粘到聊天消息里的配置。恢复路径是人们最常跳过的一段:控制台访问、串口控制台,或者不依赖隧道的带外管理接口。没有它,一条写错的防火墙规则就会把一次小改动变成一趟现场跑腿。
注销流程要和注册流程同时写。吊销设备是迟早要用到的操作,而且在配置还新鲜的时候更容易描述清楚。
端点放家里还是租一台?
三个条件决定是在家里托管还是租一台小实例。第一是入站连接到底能不能到达你的网络,因为运营商级的地址转换链路或者限制严格的楼宇网络会直接去掉这个选项。第二是出口是否必须出现在你自己城市以外的地方,因为只有租来的端点能改变这一点。第三是你是否愿意再引入一层信任关系,因为托管商进入了模型,即使读不到流量,也能观察到端点。
如果第一个条件成立、第二个条件无所谓,放家里是更短的路。租来的端点买到的是位置和可用性,本身并不带来隐私。
用一个客户端加一次重启来验证
先把一个客户端拉起来,确认它能访问该访问的资源,再确认它访问不到不该访问的东西。下面的命令显示对端状态、服务器装上的路由,以及转发是否开启。在给第二个人注册之前先跑一遍。
wg show
sysctl net.ipv4.ip_forward
ip route get 10.8.0.2
ss -lunp | grep -E ':(51820|1194)'
有近期握手记录的对端是通的,没有握手记录的对端则从未协商过,这是两种不同的故障。转发关掉,正好解释了一条能起来却什么都带不过去的隧道,所以在怪客户端之前先查服务器。没有监听者,说明服务并没有按你以为的配置启动。然后故意重启一次服务器,把整套命令重跑一遍,因为只在重启前能用的隧道,是只测顺利路径的常见结果。
把端点、对端、地址段和恢复办法记在一页纸上。那一页就是你在最不方便的时刻要翻的运维手册。