跳到主要内容

WireGuard部署

在对安全有更高要求的网络中,一般不会将服务器中各个服务的端口直接暴露在公网上,而是通过VPN的方式来访问内网中的服务。

只需要暴露VPN服务的端口,然后通过VPN连接到内网环境,就可以访问内网中的所有服务。

WireGuard是一款非常轻量级的VPN软件,它使用非对称加密算法,安全性非常高,而且非常容易部署。

本文将介绍如何在Debian服务器上部署WireGuard服务,并在Windows设备上连接WireGuard服务。

安装WireGuard

首先要在Linux服务器上安装WireGuard软件,WireGuard并不区分服务端和客户端,区别只在谁主动连接谁,只要有一方能主动连接上另一方就能组建起这个网络。

注意:由于VPN软件的特殊性,笔主不建议在Docker容器中部署VPN服务,以防止Docker挂掉导致VPN服务不可用。

apt install wireguard

检查是否已加载内核模块,如果出现了wireguard字样,说明内核模块已经加载。

lsmod | grep --color=auto wireguard

如果没有加载,可以手动加载内核模块。

modprobe wireguard

配置内核参数,开启IP转发功能。

sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1

配置WireGuard

生成私钥和公钥

wg genkey | tee privatekey | wg pubkey > publickey

生成的privatekeypublickey分别是私钥和公钥,其中privatekey是服务器的私钥,publickey是服务器的公钥。

注意

请妥善保管privatekey不要将其泄露给其他人。

编写配置文件

WireGuard支持同时开启多个VPN服务,每个服务都需要一个配置文件。 WireGuard的配置文件通常存放在/etc/wireguard目录下。

通常将第一个配置文件命名为wg0.conf,后续的配置文件可以命名为wg1.confwg2.conf等。

以下将展示一个最简单的配置文件内容。

wg0.conf
[Interface]
Address = 192.168.4.1/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = 服务器的私钥

[Peer]
PublicKey = 客户端的公钥
AllowedIPs = 192.168.4.2/32

这样就把服务器的WireGuard服务配置好了,但是你会发现,客户端的公钥在哪来?

接下来要为客户端也写一份配置文件,这里以Windows为例。 Windows端的WireGuard客户端可以在官网下载。

安装完毕后,可在命令行使用相同命令生成私钥和公钥。

client.conf
[Interface]
Address = 192.168.4.2/24
DNS = 223.5.5.5
PrivateKey = 客户端的私钥

[Peer]
PublicKey = 服务器的公钥
AllowedIPs = 192.168.4.1/32
Endpoint = 服务器的公网IP:51820
备注

如果你希望理解这两份配置文件,可以阅读以下部分,否则可以直接跳过。

  • [Interface]:「使用该配置文件的设备」的网络接口信息。
  • Address:指定了「使用该配置文件的设备」的IP地址,也就是说,服务器在VPN网络中的IP地址是192.168.4.1,而客户端的IP地址是192.168.4.2,他们处于192.168.4.0/24的网段中。
  • PostUp:在启动VPN后执行的命令,这里是设置了iptables规则,接受所有VPN接口的数据包,并且将从VPN接口出去的数据包进行NAT转发。
  • PostDown:在关闭VPN后执行的命令,这里是删除了上面设置的iptables规则。
  • ListenPort:指定了服务器监听的端口,默认为51820,其他WireGuard节点可通过这个端口连接到该节点。
  • PrivateKey:指定了该节点的私钥,用于身份验证。
  • [Peer]:其他一个节点的信息,可以有多个[Peer]
  • PublicKey:指定了其他节点的公钥,用于身份验证。
  • AllowedIPs:将「使用该配置文件的设备」产生的到这些IP地址的数据包通过该Peer转发出去。
  • Endpoint:指定了该Peer的公网IP(或域名)和端口,用于连接到该Peer
  • DNS:用于解析Endpoint的域名。

打开WireGuard客户端,导入client.conf文件。

配置服务

WireGuard可以很方便地被添加到systemd中,这样就可以通过systemctl命令来管理WireGuard服务了。

开机启动还是有必要的,防止什么时候服务器重启了,VPN服务就不可用了。

您好!您的云服务器在北京时间 2024-02-22T06:11:54 因底层宿主机出现非预期的软硬件故障而宕机,阿里云正在对该实例进行重启恢复操作。实例重启通常会在2~5分钟内完成,重启完成后阿里云会第一时间通知您。您也可以访问ECS控制台查看该事件的详情,感谢您的支持与配合。

配置WireGuard服务
systemctl enable wg-quick@wg0
systemctl daemon-reload
删除WireGuard服务

如果确定不再使用WireGuard服务,可以停止并禁用WireGuard服务。

systemctl stop wg-quick@wg0
systemctl disable wg-quick@wg0
systemctl daemon-reload

连接WireGuard

在服务器上启动WireGuard服务。

systemctl start wg-quick@wg0

查看WireGuard服务状态。

systemctl status wg-quick@wg0

在Windows上打开WireGuard客户端,选择client配置文件,点击连接按钮,即可连接到服务器的WireGuard服务。

如果连接成功,WireGuard的Windows客户端会显示节点的上次握手时间,同时在服务器上执行wg命令,可以看到客户端的latest handshake时间。

这时候在两台设备上可以使用192.168.4.1192.168.4.2连接对方。