0%

如何配置wireguard服务端及客户端

从19年开始,ss流量已经能被gfw识别并屏蔽,原本打算切换到v2ray,但配置混淆需要域名反而会暴露出更多信息,此外,网上一篇文章指出v2ray开发者失联的同时一项v2ray流量识别的专利被注册,因此决定放弃v2ray并转向另一个被linus盛赞的wireguard。

wireguard是非常简单、现代化、快速的vpn,使用最新的加密技术,udp传输,支持ip漫游等。wireguard没有服务端、客户端的区分,每一台设备都是一个peer

安装

添加wireguard的PPA源

1
2
3
sudo add-apt-repository ppa:wireguard/wireguard
sudo apt update
sudo apt install wireguard

wireguard作为linux内核模块方式加载,内核更新wireguard也会自动重新编译,重启系统或使用modprobe开启模块

1
sudo modprobe wireguard

检查wireguard模块是否成功加载,成功输出与下面类似

1
2
3
4
vagrant@bionic:~$ lsmod | grep wireguard
wireguard 221184 0
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 16384 1 wireguard

生成keys

wireguard提供了两个命令行工具wg以及wg-quick,使用wg生成公钥和私钥

1
2
umask 077
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

类似ssh,需要为每台设备生成一对publickey/privatekey

配置

我们需要生成一个虚拟网卡,名称可以按个人喜好选择,这里选择用wg0,IP网段使用10.10.0.1/24,确保该网段没有被你的家庭或公司网络使用,编辑文件/etc/wireguard/wg0.conf

1
2
3
4
5
6
7
8
[Interface]
PrivateKey = <your server private key here>
Address = 10.10.0.1/24
Address = fd86:ea04:1111::1/64
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp0s3 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o enp0s3 -j MASQUERADE
ListenPort = 51820

PrivateKey填上一步生成的私钥,填入你选择的Address,这里配置了两个IP4/6的地址,enp0s3是你服务器主要的网络设备,使用ifconfigip a查看你的主设备名,ListenPort默认为51820,建议修改

要注意的是SaveConfig设置,wireguard配置后不需要restartreload,使用wg命令添加peer即可立即生效。但是,这些操作都是直接写入到内存中而不是磁盘,因此如果你重启系统或服务,那么你就会失去添加的配置,所以这里设置为true,自动保存配置。但这个配置有时候也会让人非常困扰,你可能添加配置后重启服务,然后你发现添加的配置不见了,需要先停止服务再添加配置最后重启。

添加网络配置,使得内核可以正确路由我们的NAT流量

1
2
3
4
5
sudo bash -c 'cat << EOF >> /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
EOF'
sudo sysctl -p

运行命令,开启wg0设备

1
sudo wg-quick up wg0

如果一切顺利,那么运行下面命令你将看到类似的输出

1
2
3
4
5
vagrant@bionic:~$ sudo wg
interface: wg0
public key: Td4IBZg2s2bMSjewD0h4oBhlbaJteygxjT83xeM7uTY=
private key: (hidden)
listening port: 51820

客户端配置

客户端配置与服务端类似

1
2
3
4
5
6
7
8
9
10
11
[Interface]
Address = 10.10.0.2/32
Address = fd86:ea04:1111::2/128
SaveConfig = true
PrivateKey = <your client private key here>
DNS = 8.8.8.8

[Peer]
PublicKey = <your server public key here>
Endpoint = <your server public ip>:51820
AllowedIPs = 0.0.0.0/0, ::/0

填写服务器的publickey、ip、端口,配置0.0.0.0/0, ::/0将所有流量传输到服务端

在服务端添加客户端配置

1
sudo wg set wg0 peer <client-public-key> allowed-ips 10.10.0.2/32,fd86:ea04:1111::2/128

以上的操作针对的是linux系统,官方推出了可用的iOS/MacOS/Android/Windows图形界面软件,其中有一个选项要注意的是On-Demand,有EthernetWi-Fi选项,如果勾选,那么会在选中网络中会自动开启vpn

设置开机启动

如果你的系统使用systemd,如ubuntu,设置wireguard开机启动命令如下

1
systemctl enable wg-quick@wg0

开放防火墙

UFW

1
sudo ufw allow 51820/udp

参考文档

WireGuard: fast, modern, secure VPN tunnel
How to setup your own VPN server using WireGuard on Ubuntu
Setting Up PiHole, Wireguard VPN server and Client (Ubuntu Server)