简介
WireGuard是一个非常年轻的项目,官方描述为
fast, modern, secure VPN tunnel
- 简单易用:WireGuard旨在像SSH一样易于配置和部署。就像交换SSH密钥一样。简单地通过交换公钥来实现连接,其余所有内容都由WireGuard透明地处理。
- 先进而安全的加密: Noise protocol framework, Curve25519, ChaCha20, Poly1305,
BLAKE2, SipHash24, HKDF
- 高性能
(以上内容均从官网搬运)
总之,相比酸酸乳,它的部署将非常的简单并且加密性完全不输且易用。
安装
项目正处于快速开发阶段,这篇记录可能在你看的时间点并不适用,如果你尝试不成功,我也不负什么责任(滑稽
安装可以通过包管理器安装以及源码编译安装,这里还是以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
|
下载最新的代码并解压
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/[email protected]’ -> ‘/lib/systemd/system/[email protected]’
配置
- 生成秘钥
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
|
当然也可以使用ifconfig
或ip 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