开始使用WireGuard

简介

WireGuard是一个非常年轻的项目,官方描述为

fast, modern, secure VPN tunnel

  • 简单易用:WireGuard旨在像SSH一样易于配置和部署。就像交换SSH密钥一样。简单地通过交换公钥来实现连接,其余所有内容都由WireGuard透明地处理。
  • 先进而安全的加密: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF
  • 高性能

wireguard.png (以上内容均从官网搬运)

总之,相比酸酸乳,它的部署将非常的简单并且加密性完全不输且易用。

安装

项目正处于快速开发阶段,这篇记录可能在你看的时间点并不适用,如果你尝试不成功,我也不负什么责任(滑稽

安装可以通过包管理器安装以及源码编译安装,这里还是以Ubuntu 18.04.1 LTS为例(官方的支持页面支持非常多的平台安装)。

Packages [module & tools – v0.0.20181119]

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

from Source gcc ≥4.7,内核Linux ≥3.10就可以了

  • 安装依赖
1
sudo apt-get install libmnl-dev libelf-dev linux-headers-$(uname -r) build-essential pkg-config
  • 拉取代码 WireGuard托管在ZX2C4 Git存储库中

下载最新的代码并解压

1
2
wget https://git.zx2c4.com/WireGuard/snapshot/WireGuard-0.0.20181119.tar.xz
tar Jxvf WireGuard-0.0.20181119.tar.xz
  • 编译模块以及wg(8)工具、安装 wg是一个设置和检索WireGuard接口的配置,由于代码非常的简洁,你会在一分钟内完成。
1
2
3
4
5
cd WireGuard-0.0.20181119/src 
make
#如果编译出现问题,你可以进行debug模式进行编译
#make debug
make insatll

文件路径

‘wg’ -> ‘/usr/bin/wg’ ‘man/wg.8’ -> ‘/usr/share/man/man8/wg.8’ ‘completion/wg.bash-completion’ -> ‘/usr/share/bash-completion/completions/wg’ ‘wg-quick/linux.bash’ -> ‘/usr/bin/wg-quick’ install: creating directory ‘/etc/wireguard’ ‘man/wg-quick.8’ -> ‘/usr/share/man/man8/wg-quick.8’ ‘completion/wg-quick.bash-completion’ -> ‘/usr/share/bash-completion/completions/wg-quick’ ‘systemd/wg-quick@.service’ -> ‘/lib/systemd/system/wg-quick@.service’

配置

  • 生成秘钥 WireGuard需要base64编码的公钥和私钥。这些可以使用wg(8)实用程序生成:

私钥生成

1
2
3
cd /etc/wireguard
umask 077
wg genkey > privatekey

公钥生成

1
wg pubkey < privatekey > publickey

或者一步到位生成

1
wg genkey | tee privatekey | wg pubkey > publickey

为用户生成秘钥

1
wg genkey | tee c1_privatekey | wg pubkey > c1_publickey

共享密钥生成(非必要操作)

1
wg genpsk > presharedkey
  • 命令行配置接口
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#删除网络接口
ip link del dev wg0
#添加一个网络接口
ip link add dev wg0 type wireguard
#设置IP地址
ip address add dev wg0 192.168.7.1/24
#设置监听端口以及服务器的私钥,并添加一个客户端的公钥,客户端固定ip连接
wg set wg0 listen-port 2333 private-key /etc/wireguard/privatekey peer $(cat /etc/wireguard/c1_publickey) allowed-ips 192.168.7.2/32 endpoint 2333.lvmoo.com:2333
#激活这个端口
ip link set up dev wg0

通过命令行设置的方式不会有任何输出结果。这时可以使用wg或者wg show看到状态信息:

root@ubuntu:/# wg show

1
2
3
4
5
6
7
8
interface: wg0
  public key: /EdVfTS1T+██████████SttclHN██████████1INfTVk=
  private key: (hidden)
  listening port: 2333

peer: Xun1IAI5lAswjTGh████████████N2Zy██████████3Fo=
  endpoint: 162.██9.1██.██3:2333
  allowed ips: 192.168.7.2/32

当然也可以使用ifconfigip add查看到wg0虚拟网卡信息。

  • 配置文件配置接口
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
wg_ip=$(curl -s https://api.lvmoo.com/ip/ | xargs echo -n)
wg_port=2333
[[ $UID -eq 0 ]] || sudo=sudo
$sudo sh -c 'umask 077; cat > /etc/wireguard/wg0.conf' <<_EOF
[Interface]
PrivateKey = $(cat /etc/wireguard/privatekey)
Address = 192.168.7.1/24 
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 2333
DNS = 8.8.8.8, 8.8.4.4, 1.1.1.1, 1.0.0.1
MTU = 1420
[Peer]
PublicKey = $(cat /etc/wireguard/c1_publickey)
PresharedKey = $(cat /etc/wireguard/presharedkey)
Endpoint = $wg_ip:$wg_port
AllowedIPs = 192.168.7.2/32
_EOF

通过wg-quick up wg0便可以激活配置文件

root@ubuntu:/# wg-quick up wg0

1
2
3
4
5
6
7
[#] ip link add wg1 type wireguard
[#] wg setconf wg1 /dev/fd/63
[#] ip address add 192.168.7.1/24 dev wg1
[#] ip link set mtu 1420 dev wg1
[#] ip link set wg1 up
[#] resolvconf -a tun.wg1 -m 0 -x
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

通过wg-quick down wg0可删除wg0 root@ubuntu:/# wg-quick down wg0

1
2
3
[#] ip link delete dev wg1
[#] resolvconf -d tun.wg1
[#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

当网络接口激活,客户端进行了连接时,状态信息如下:

root@ubuntu:/# wg show

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
interface: wg0
  public key: /EdVfTS1T+██████████SttclHN██████████1INfTVk=
  private key: (hidden)
  listening port: 2333

peer: Xun1IAI5lAswjTGh████████████N2Zy██████████3Fo=
  endpoint: 3█.1██.1.██:52172 #变成了客户端连接ip
  allowed ips: 192.168.7.2/32
  latest handshake: 1 second ago #新增了最后的握手时间
  transfer: 2.63 KiB received, 1.86 KiB sent #新增了网络收发信息
  • 客户端配置 客户端的配置文件其实可以理解成和服务器端的配置文件是一样的。 只需要把Interface的PrivateKey换成c1_privatekey,Peer的PublicKey换成服务器的publickey即可. 还有就是NAT和防火墙遍历持久性。 在大多数情况下,WireGuard仅在对等端希望发送数据包时才传输数据。当没有要求发送数据包时,它会停止发送数据包,直到再次询问。 如果客户端在NAT或防火墙之后,请加入PersistentKeepalive =字段
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
wg_ip=$(curl -s https://api.lvmoo.com/ip/ | xargs echo -n)
wg_port=2333
[[ $UID -eq 0 ]] || sudo=sudo
$sudo sh -c 'umask 077; cat > /etc/wireguard/client.conf' <<_EOF
[Interface]
PrivateKey = $(cat /etc/wireguard/c1_privatekey)
Address = 192.168.7.2/24 
DNS = 8.8.8.8, 8.8.4.4, 1.1.1.1, 1.0.0.1
MTU = 1420
[Peer]
PublicKey = $(cat /etc/wireguard/publickey)
PresharedKey = $(cat /etc/wireguard/presharedkey)
Endpoint = $wg_ip:$wg_port
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25
_EOF

将配置文件生产二维码 cat client.conf | qrencode -o - -t UTF8

  • 其他

转发 请记得打开防火墙转发功能 以下是临时打开以及永久打开的设置

1
2
3
echo 1 > /proc/sys/net/ipv4/ip_forward
sed -i '/net.ipv4.ip_forward.*/d;$a\net.ipv4.ip_forward = 1' /etc/sysctl.conf
sysctl -p

开机启动

1
2
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0

用户管理 多用户,为新用户添加秘钥 wg genkey | tee c2_privatekey | wg pubkey > c2_publickey 命令行直接添加 wg set wg0 peer $(cat /etc/wireguard/c2_publickey) allowed-ips 192.168.7.3/32 endpoint 2333.lvmoo.com:2333 然后通过上面的方法生成用户配置文件即可。 删除用户 wg set wg0 peer $(cat /etc/wireguard/c2_publickey) remove 无论添加或删除用户,请记得保存服务器的配置文件 wg-quick save wg0

参考文: WireGuard 服务端手动教程 WireGuard Quick Start

Licensed under CC BY-NC-SA 4.0
最后更新于 Jun 17, 2019 19:37 UTC
点击刷新🚌