来单位也快一个月的时间了,办公用的电脑也已经走相应的采购流程走完了,于是就把笔记本电脑扔宿舍里了。但是在,在新的办公电脑逐步启用的时候,需要在笔记本里取一些文件。由于单位网络ipv4是NAT,办公室的网络与宿舍网络的网段是不同的,内网的不同设备间也是隔离的,所以只能通过在杭州的frps进行端口映射来中转。传输一些小文件固然可以,但对大文件1M的带宽太慢,而且服务器上的其他服务也别搞了……

既然ipv4这条道路走不通,那就试一下ipv6,单位的宿舍楼网与办公楼网都是给分ipv6地址的。于是先在办公室ping了一下宿舍里的树莓派上的ipv6地址,可以ping通,延迟1-2ms左右,于是试图ssh连接,发现并不能连得上。于是更换端口,也没能成功。
为排查,于是在树莓派上nc -l 21921,然后在办公室用ssh连接21921端口,在树莓派上收到了openssh的第一行,然后就没有下文了,看来是封锁了ssh协议,换到什么端口也没有用……

接下来尝试了https协议,果然也不同,尝试http的时候竟然发现倒是可以通,但并没什么卵用,http这种东西还是少用或者不用为好。既然发现有的协议是可以通过的,那就想到了wireguard

WireGuard被视为下一代VPN协议,用来替代OpenVPN,IPSec等VPN协议。 目前支持Linux,Windows,mac OS,Android,iOS等主流平台。WireGuard协议作为Linux内核模块运行,所以效率极高。使用了最先进的加密技术(利用Curve25519进行密钥交换,ChaCha20和Poly1305用于数据认证,BLAKE2用于散列),安全性毋庸置疑。WireGuard支持IP地址漫游,也就是网络断开再连,对它不会有影响。

Wireguard在linux 5.6+之后就被吸收进了内核里,成为内核的一部分,所以性能好,延迟低。

安装与使用

虽然wireguard已经进了linux内核,但并不代表不需要安装了。

sudo apt install wireguard

在办公室的ubuntu 20.04很容易就安排上了,但树莓派上稍微麻烦了一点。因为树莓派3b的系统是大概四年前安装的,并没有及时升级内核,内核版本还是4.8.x,所以要先升级linux内核,然后再直接安装就好了。

两端安排完毕之后接下来就应该配置了。wireguard的身份认证是基于公钥与私钥的,应该首先为每个设备生成一对密钥。

wg genkey > example.key
wg pubkey < example.key > example.key.pub

然后到/etc/wireguard/目录下编辑配置文件,配置文件一般为wg0.confwg0既是这一套配置文件的名称,同时也是在虚拟内网建立之后的虚拟网卡的名称。

在wireguard的顶层设计之中,所有的节点是对等的,但在实际的网络使用之中,有一些设备有公网IP,另一些则被安排在NAT后面,如果要顺利使用wireguard,则需要一个有公网IP的服务端。由于之前在树莓派上配置过ipv6的DDNS,同时树莓派也在宿舍里作为无线路由器使用,有着完整的ipv4与ipv6 NAT配置,这里我选取树莓派作为服务端。

树莓派端的配置文件:

[Interface]
Address = 10.6.0.1/24 # 虚拟内网的IP(一般应该不与本地的其他IP段相同)
ListenPort = 1921 # 监听 UDP 端口
PrivateKey = AOPUhpetQKmRgfDSNHA35mhjUj2Qfd9slffk2EWOskI= # 之前生成的私钥

[Peer]
PublicKey = 42d8CjU/XjNENzbUBYXY8OaUkaEruaJHhOFVSWHOkjM= # 对端设备的公钥
AllowedIPs = 10.6.0.2/32 # 允许通过wireguard的IP地址(段),这个会自动添加到内核路由表里

然后是办公室的配置

[Interface]
Address = 10.6.0.2/32
PrivateKey = gNUgYmSjsvM/0fPqgSE7wI2rXyPX6iuG8a5d04RJg1o=

# Client
[Peer]
Endpoint = 6.neko.red:1921 #树莓派的ipv6地址以及端口
PublicKey = bivAcP655umaf56bx/HJ7sFq48rf5s8/rcNz8aoS928=
AllowedIPs = 10.6.0.1/32,192.168.12.0/24 #192.168.12.0/24这个是树莓派做无线路由器内网网段
PersistentKeepalive = 25 # 心跳包,似乎是用来防中断的

在两端配置完成之后,可以分别启动了,以root身份运行

wg-quick up wg0

如果需要关停

wg-quick down wg0

在正常工作之后,运行wg即可看到当前wireguard的工作状态

wireguard工作良好
wireguard工作良好

一旦开始正常工作,在办公室即可顺利联通宿舍里的内网,通过WiFi联网的笔记本电脑(192.168.12.239)可以直接ping通,也可是直接ssh连上去,在树莓派上的网页也可以在修改hosts之后直接打开,接在笔记本电脑上的喷墨打印机也可以在办公室的电脑上被添加,进而进行远程打印。虽然wireguard使用的是udp协议,udp并不能保证数据包完整按照顺序抵达,但wireguard上面荷载的其他协议却可以准确无误地正常工作,实在是很神奇。