导读:手里几台VPS散在不同机房,想互相访问数据库、只想对内网暴露管理面板、出差时想安全连回家里的机器——这些需求的传统答案要么是公网裸奔加密码,要么是OpenVPN这种配置能写满三页纸的重量级方案。WireGuard用四千行代码给出了新答案:性能好过OpenVPN、配置短到能背下来、内核级运行。这篇从密钥对讲到组网拓扑:两台机器点对点怎么连、多机组网怎么设计IP段、手机和笔记本怎么接入、以及把服务器当中转的hub-spoke模式。配完之后,你会在所有设备上看到同一张虚拟网卡,全球的机器像插在同一个交换机上。
一、为什么是WireGuard:三行代码的哲学
WireGuard作者Jason Donenfeld的设计哲学是"代码越少,漏洞越少":整个实现约四千行,OpenVPN超过十万行;内核态运行,性能打满不占CPU;密码学组件写死不开放协商——没有历史包袱的算法套件(ChaCha20加密、Curve25519密钥交换、BLAKE2s哈希),杜绝了配置错误导致的降级攻击。对用户而言最直观的差别是配置的长度:OpenVPN的证书体系要生成CA、签发证书、交换配置,WireGuard只需要双方交换一对公钥和端口。它的握手还非常安静:没有流量时不发包,闲置连接在扫描器眼里隐形——SSH篇讲的"减少暴露面"哲学,在网络层的最完整实现。
二、两台机器点对点:最小可用配置
安装(新内核已内置模块,只需工具):
apt install wireguard-tools
生成密钥对,两台机器各做一次:
wg genkey | tee privatekey | wg pubkey > publickey
机器A(内网IP定为10.0.0.1)的/etc/wireguard/wg0.conf:
[Interface] PrivateKey = A的私钥 Address = 10.0.0.1/24 ListenPort = 51820 [Peer] PublicKey = B的公钥 AllowedIPs = 10.0.0.2/32
机器B(10.0.0.2)镜像对称:
[Interface] PrivateKey = B的私钥 Address = 10.0.0.2/24 ListenPort = 51820 [Peer] PublicKey = A的公钥 AllowedIPs = 10.0.0.1/32 Endpoint = A的公网IP:51820
两边各自启动:
systemctl enable --now wg-quick@wg0
然后ping 10.0.0.2测试。通了,恭喜你拥有了人生第一个加密隧道。注意两边UDP的51820端口要在防火墙和安全组放行——本站防火墙篇刚讲过的排查顺序在这用得上。
三、读懂AllowedIPs:它是路由表也是访问控制
WireGuard没有传统VPN的"路由推送"概念,一切路由由AllowedIPs这一个字段承担,它决定两件事:发往哪些目标IP的流量走这条隧道(路由),以及对端声称自己是谁时只信任哪些来源(准入)。点对点场景写/32最严谨——A的配置里AllowedIPs = 10.0.0.2/32的意思是"只有目的地是10.0.0.2的包走隧道,且B只能以10.0.0.2的身份发来数据"。想把自己当作B的出口网关(B的所有流量都从A出公网),B的配置改成AllowedIPs = 0.0.0.0/0,同时A那边要做NAT转发——这是"自建翻墙式"用法,个人组网场景用得少,知道原理即可。多机组网时AllowedIPs的网段设计直接决定拓扑,下一节展开。
四、多机组网:hub-spoke星型拓扑最省心
三台以上机器,推荐星型:选一台网络条件好的VPS当hub(比如10.0.0.1),其余机器当spoke(10.0.0.2、10.0.0.3……)。hub的配置里把每个spoke列成Peer,AllowedIPs写各自/32;每个spoke的配置里只有hub一个Peer,AllowedIPs写10.0.0.0/24——注意这里不再是/32,因为spoke发往整个虚拟网段的流量都要交给hub中转。这个拓扑的优点:配置量线性增长而不是平方(每台新机器只在hub加一段Peer,不用全网两两互配);spoke之间不通时才走hub中转,路径略有绕行但换来管理成本大降。hub机器顺便获得一个隐藏福利:本站哪吒探针的agent上报、MySQL主从的复制流量、rsync备份,全都可以走这张内网——公网IP彻底从这些服务的配置里消失。
五、手机和笔记本接入:扫码即连
手机端装官方WireGuard App,新建tunnel选"从二维码创建",服务端生成配置并渲染成二维码给手机扫。手机作为spoke接入的配置和第四节完全一样,唯一区别是Endpoint填hub的公网地址。笔记本同理,桌面客户端直接导入conf文件。移动端有个实用细节:On-Demand(按需激活)可以设置"连上公司WiFi时自动断开、离开时自动连上",流量策略化切换。手机接入后的典型玩法:在外面用手机浏览器访问家里VPS上跑的哪个管理面板——面板只监听WireGuard内网地址(本站Docker篇讲的-p 127.0.0.1式绑定思想,这里改成绑10.0.0.1),公网上根本扫不到它的存在。
六、PersistentKeepalive:NAT后的保活心跳
spoke在NAT后面(家庭宽带、手机热点)时,会话的NAT映射几分钟后超时,隧道就"单通"了——spoke能主动连hub,hub却发不进去。解法是在spoke的Peer段加一行:
PersistentKeepalive = 25
每25秒发一个空包维持NAT映射,成本约等于零,换来的是hub随时可以主动发起连接。VPS对VPS都是公网直连的场景不需要这行,但手机、家用设备接入时必须加,这是WireGuard新手第二高频翻车点(第一是忘了放行UDP端口)。
七、性能与运维:为什么它比OpenVPN快
快的原因有三个:内核态处理(数据包不过用户态,少了两次上下文切换);UDP传输(没有TCP-over-TCP的拥塞叠加问题——隧道本身跑在UDP上,内层哪怕是TCP也不会和隧道互相挤兑);加密算法选型现代高效。运维侧的日常命令就三条:wg看当前握手和流量统计、wg show wg0 latest-handshakes判断哪条隧道断了(两分钟内有握手算健康)、systemctl restart wg-quick@wg0重启。握手时间戳是个被低估的排障利器:ping不通时先看latest-handshakes,时间戳停在几小时前说明握手层就断了(查端口、密钥),时间戳新鲜但ping不通则是路由或AllowedIPs写错——一个字段直接把故障域切成两半。
八、安全边界:组网之后反而更要小心
WireGuard的加密强度让人安心,但有两件事它不管:第一,接入进来的设备本身安全——手机丢了等于内网钥匙丢了,重要面板还是要TLS加认证,本站HTTPS篇的证书体系在这张内网里照样适用;第二,hub沦陷等于全网沦陷——hub那台机器的SSH防护要按最高标准来(密钥登录加fail2ban,SSH篇全套伺候)。另外提醒一句:虚拟内网里的服务容易滋生"反正内网不用管安全"的惰性,Redis不设密码、数据库监听全开放——内网只是缩小了暴露面,不是安全豁免权,这个边界感要有。
结语
WireGuard把异地组网从"周末工程"压缩成了"十分钟日常":一份conf文件、一条systemctl命令、一张所有设备共享的虚拟网卡。它的意义不只是加密,而是给了个人玩家企业级的网络拓扑能力:数据库跨机房私连、管理面板公网隐身、移动设备安全回家。配合本站监控篇把hub的健康盯起来,这张网搭完就能忘了它的存在——最好的基础设施,就是让你感觉不到它存在的那种。


