从零开始的VPS生活 Vol2-3:科学上网——新秀Wireguard

Wireguard是VPN业界的新秀,它只专注于一件事情,就是把两台机器链接起来,其他的都不是它去考虑的问题。同样,这里不建议使用这种数据包标识明显的协议进行科学上网,这里只是简单的介绍。

因为专注,所以用Wireguard连通两台电脑即为容易,搭建一个具有基础功能的VPN服务器仅需要几步。wg-quick更让效率有了进一步的提升。

安装Wireguard

curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
yum install epel-release
yum install wireguard-dkms wireguard-tools

因为Wireguard本体是一个内核模块(业界最牛的喷子——林纳斯·脱袜子甚至想把它内置进kernel,但是目前社区还没有得出结论),所以它是由一个dkms组件和一个cli工具包组成的。

生成密钥对

执行wg genkey就可以生成一个私钥了。一定要把这个私钥记录下来,收好,因为没了就彻底恢复不了了,只能再生成一个新的。这里假设生成的私钥是“CCbmO/1/p2kEovVcR7/T5ln4MrykGfkOp5k4r2yt608=”。

因为wg pubkey命令是读stdin的输入,所以在服务器上生成公钥一共有三种方法:

  • 执行echo CCbmO/1/p2kEovVcR7/T5ln4MrykGfkOp5k4r2yt608= | wg pubkey

  • 执行wg pubkey,输入私钥,Ctrl+D,返回值即为公钥

  • 将私钥保存进private.txt文件,执行wg pubkey < private.txt

公钥是可以随时生成的,所以丢了也没关系,私钥一定不要丢。

建立服务端

创建/etc/wireguard文件夹。

创建/etc/wireguard/wg0.conf文件,并编辑其内容。

[Interface]
# 在虚拟网中,服务器的IP
Address = 10.2.2.1/24
# 用于连接的端口
ListenPort = 23333
# 服务端的私钥
PrivateKey = CCbmO/1/p2kEovVcR7/T5ln4MrykGfkOp5k4r2yt608=

[Peer]
# 客户端A的公钥
PublicKey = s9rP0yd6lQTe/tWVg4bzrUX49KHeDjAOgfO5JBJNFCo=
# 客户端A在虚拟网中的IP,可以写网段,但是多个Peer之间不能重复
AllowedIPs = 10.2.2.2/32

这是一份wg-quick的配置,相比标准的Wireguard配置,多了一个Address项用于创建虚拟网卡。这个Address要写明一个网段(比如/16、/24,看自己心情决定),相当于配置了一个网关(其实并不是这样,但是用法接近)

一份标准的Wireguard配置包括两个部分,Interface和Peer(可以为多个)。

Interface部分一定要写出的是自己被对方链接时所用的配置,因此一定要显示声明端口。另外,写明私钥,也就是上面生成的那个,这样的话客户端拿着公钥,两边就能互相验证身份了。

Peer部分则是连接对方的信息,包括对方的公钥,还有可以访问本机网络的IP。这个IP限制可以写一个网段,但是多个Peer之间不能重复,相当于一个路由表。因为我们的连接双方都是终端设备,所以直接给一个限定死的/32 IP即可,这样各个终端之间分隔地比较清楚。

然后执行:

wg-quick up wg0
systemctl enable wg-quick@wg0

如果第一步没有报错的话,那么以后每次开机的时候,这个Wireguard虚拟网卡都会自动启动并对外提供服务了。

客户端配置

这里以标准Wireguard配置文件为例,Windows上的Tunsafe Client,Linux、Mac上的Wireguard均可以通过这份配置文件进行连接。安卓和iOS上的Wireguard客户端可以自行根据配置文件的含义,填入客户端的表单,或者直接将配置文件粘贴进入APP。

[Interface]
# 客户端的私钥
PrivateKey = SH7Mlxdz1SlN84WTvP1yIyc1FkorhBA53212xzP1Zk4=
# 客户端在虚拟网中的IP,要跟服务端配置相同/在配置的网段中
Address = 10.2.2.2/24

[Peer]
# 服务端的公钥
PublicKey = 2DatKQXzMjykcbgRR8L2P+b0QF4itJbeY3horiKY5BY=
# 允许所有IP链接,这样才能通过服务器访问外网
AllowedIPs = 0.0.0.0/0, ::/0
# 服务器的地址,这里也可以写服务器的IP
Endpoint = test.noobear.com:23333
# 用于防止NAT网络中连接中断,由于Wireguard是UDP协议,所以需要手动维持链接
PersistentKeepalive = 25

启用客户端,即可完成连接。这种清晰明了又畅快的配置真是非常愉快的体验。