搭建WireGuard

 

一、动机

  • 尝试一下这个号称next generation的VPN工具
  • 为现有方案做一个备选

二、参考

三、环境及版本

WireGuard发展很迅速,我的这次尝试基于以下版本:

  • 服务器端(ubuntu 18.04 LTS)
  • 客户端环境(MacOS 10.15.4 (Catalina))

安装成功后可以通过下面的命令查看wireguard的版本

$ sudo wg version

或运行之后

$ sudo wg show

得到如下信息:

wireguard-tools v1.0.20200319 - https://git.zx2c4.com/wireguard-tools/ 或 wireguard-go version 0.0.20200320

四、安装WireGuard服务器

添加WireGuard仓库到apt包管理器中

$ sudo add-apt-repository ppa:wireguard/wireguard 

安装wireguard

$ sudo apt-get update
$ sudo apt-get install wireguard

配置wireguard服务端 - 生成服务端私钥和密钥

$ cd /etc/wireguard
$ umask 077
$ wg genkey | tee privatekey | wg pubkey > publickey

配置wireguard服务端 - 服务端配置文件 (/etc/wireguard/wg0.conf)

# 定义服务器端的虚拟网卡
[Interface]
# 虚拟网卡的IP地址 (我曾经在这个地方犹豫了一会儿,不知道什么网段为好。这个其实要看你准备组的虚拟网要有多少设备)
Address = 10.0.0.1/24, fd86:ea04:1115::1/64
# 设为true表示配置文件在有新的peer接入时自动更新
SaveConfig = true
# 在虚拟网卡启动后的动作。这里将接受所有的客户端共享服务端的IP地址,并写入路由表中
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 在虚拟网卡断开后的动作。这里将客户端共享服务端IP地址的规则从路由表中删除
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 服务端的通讯端口,后面客户端配置的时候需要用到
ListenPort = 51820
# 上面产生的私钥
PrivateKey = <服务器私钥>

配置wireguard服务端 - 配置防火墙并确认

$ sudo ufw allow 22/tcp
$ sudo ufw allow 51820/udp
$ sudo ufw enable
$ sudo ufw status verbose

启动服务端wireguard

$ sudo wg-quick up wg0

服务端配置 - 允许IP转发

$ vi /etc/sysctl.conf

# 找到下面这一行,去掉注释来允许IP转发
net.ipv4.conf.default.rp_filter=1

# 退出编辑后,通过下面命令使其生效
$ sysctl -p
$ echo 1 > /proc/sys/net/ipv4/ip_forward

:warning: 这个如果不做的话,你会发现即便wireguard建立的虚拟网可以ping通,但是客户端无法通过服务端上网

五、安装客户端

在MacBookPro上安装wireguard

$ sudo brew install wireguard-tools

客户端配置 - 生成密钥

$ cd /usr/local/etc/
$ umask 077
$ mkdir wireguard
$ cd wireguard
$ wg genkey | tee privatekey | wg pubkey > publickey

客户端配置 - 配置文件 (/usr/local/etc/wireguard/wg0.conf)

[Interface]
PrivateKey = <客户端私钥>
# 这里的客户端IP需要跟服务器端的IP同一网段,服务器端的网卡地址是10.0.0.1
Address = 10.0.0.10/32
DNS = 10.0.0.1,8.8.8.8,1.1.1.1

[Peer]
PublicKey = <服务端公钥>
Endpoint = <服务端公网IP>:51820
# 0.0.0.0/0为允许所有IP地址通讯,如果是多个客户端的话,可以省去一个个配置之繁琐
AllowedIPs = 0.0.0.0/0
# 每21秒检查一下连接。如果IP有变化,也是通过这个进行自动更新
PersistentKeepalive = 21

启动客户端wireguard

$ sudo wg-quick up wg0

这时应该可以ping通服务端的虚拟IP,及其它网站了。如果不行尝试重启一下wireguard。还不行的话,检查一下防火墙和IP转发的配置。