Luotianyi

「开始使用WireGuard」

| 技巧向 | 796字

简介

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]

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

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

  • 安装依赖
sudo apt-get install libmnl-dev libelf-dev linux-headers-$(uname -r) build-essential pkg-config
  • 拉取代码

WireGuard托管在ZX2C4 Git存储库中

下载最新的代码并解压

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接口的配置,由于代码非常的简洁,你会在一分钟内完成。

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)实用程序生成:

私钥生成

cd /etc/wireguard
umask 077
wg genkey > privatekey

公钥生成

wg pubkey < privatekey > publickey

或者一步到位生成

wg genkey | tee privatekey | wg pubkey > publickey

为用户生成秘钥

wg genkey | tee c1_privatekey | wg pubkey > c1_publickey
  • 命令行配置接口
#删除网络接口
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

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虚拟网卡信息。

  • 配置文件配置接口
[[ $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)
Endpoint = 2333.lvmoo.com:2333
AllowedIPs = 192.168.7.2/32
_EOF

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

root@ubuntu:/# wg-quick up wg0

[#] 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

[#] 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

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 =字段

[[ $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)
Endpoint = 2333.lvmoo.com:2333
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25
_EOF

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

  • 其他

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

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

开机启动

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

-EOF-

上一篇: [模块化]本站Nginx配置

下一篇: 死肥宅也要谈恋爱之早安晚安自动化

Kay

@2018-11-27 13:59:04

WireGuard
只有一个人评论呢QAQ
  1. 淡漠忆丶

    不错不错学习了。

    淡漠忆丶 回复
评论的人最可爱~