下一代VPN之wireguard

安装

Debian

echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
apt update
apt install wireguard

Ubuntu

$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get update
$ sudo apt-get install wireguard

CentOS

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

其它

其它操作系统请参考:https://www.wireguard.com/install/#installation

配置

生成密钥

WireGuard需要base64编码的公钥和私钥,使用以下命令生成一个私钥:

wg genkey > privatekey

从私钥派生公钥:

wg pubkey <privatekey> publickey

命令一条龙:

 wg genkey | tee privatekey | wg pubkey> publickey

生成主配置文件,使用wg0 虚拟接口名称

export vpn_net_pre='10.66.66'
export vpn_ser_port=6443

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
Address = $vpn_net_pre.1/24
ListenPort = $vpn_ser_port
PrivateKey = CJUCBgPcbZ3zShxgfMpxZMhNfCCvOYRsdiJbFsopG2c=
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
AllowedIPs = $vpn_net_pre.22/24
PublicKey = glnmUF56rWRCJBGDpdejmf3d+vlQFz3icsLCbm8ubyE=
PersistentKeepalive = 25
EOF

注意Peer 端的PublicKey 是对端的公钥。

参数说明

  • Address:Server虚拟网卡的IP地址
  • MTU:一般不用改,1500没问题
  • ListenPort:6443是监听的端口
  • PrivateKey:使用上面生成的私钥
  • PostUp:脚本启动后执行的iptables规则,不用修改,直接拷贝即可,主要用来打通VPN的流量。
  • PostDown:停止的时候自动删除iptables规则。
  • PublicKey:Client端的公钥
  • AllowedIPs:可以写多个,用逗号隔开,默认写Client端的IP
  • PersistentKeepalive:用来保持连接检查的,每过25s会自动检查连通性,如果IP有变化,也是通过这个自动更新endpoint。

启动服务

初始化并启动服务

wg-quick up wg0

停止服务

wg-quick down wg0

推荐使用systemd 来控制服务

systemctl start  wg-quick@wg0
systemctl enable wg-quick@wg0
systemctl status wg-quick@wg0
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
   Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; disabled; vendor preset: disabled)
   Active: active (exited) since Sun 2019-01-24 00:22:16 CST; 9s ago
     Docs: man:wg-quick(8)
           man:wg(8)
           https://www.wireguard.com/
           https://www.wireguard.com/quickstart/
           https://git.zx2c4.com/WireGuard/about/src/tools/man/wg-quick.8
           https://git.zx2c4.com/WireGuard/about/src/tools/man/wg.8
  Process: 20514 ExecStart=/usr/bin/wg-quick up %i (code=exited, status=0/SUCCESS)
……
[1]: Started WireGuard via wg-quick(8) for wg0.
Hint: Some lines were ellipsized, use -l to show in full.

客户端

[Interface]
Address = 10.66.66.2/24
PrivateKey = cLZw6eZR2LRUJZmlGjsBFGJrSrznw/Ag5VZILLZBbmY=
DNS = 8.8.8.8

[Peer]
AllowedIPs = 10.66.66.1/32, 39.108.115.xx/32, 114.114.114.114, 8.8.8.8
Endpoint = 47.90.100.xx:6443
PublicKey = glnmUF56rWRCJBGDpdejmf3d+vlQFz3icsLCbm8ubyE=

在Peer项的 AllowedIPs 填写上需要走VPN的IP段,使用0.0.0.0/0表示全部的流量起VPN

启动后可以查看VPN状态

# wg
interface: wg0
  public key: 0jkKDBbKV5HbpGS50yCMuPS12EjZRYpFOt95ka0YllU=
  private key: (hidden)
  listening port: 40112

peer: glnmUF56rWRCJBGDpdejmf3d+vlQFz3icsLCbm8ubyE=
  endpoint: 47.90.100.xx:6443
  allowed ips: 39.108.115.xx/32, 10.66.66.1/32

其它

注意事项

  • 公钥和私钥一定要配置正确,否则不能正常通讯
  • AllowedIPs一定要配置正确,这个会自动更改本机的route配置,不要随意写0.0.0.0/0,如果在Server端写,会导致所有流量都走这个网卡,会有意想不到的事情发生,如果在Client端写,会所有流量都通过VPN。
  • Server端一定要写ListenPort,且能正常访问。
  • Client端不需要写ListenPort,这个让他自己生成一个就可以了。
  • PersistentKeepalive一定要配置,这个可以让他保持通讯,如果IP发生变化,也可以及时更新。
  • 该软件依赖DMKS,安装前最好将系统内核版本升级成最新。

文献参考