简介

WireGuard 是一个易于配置、快速且安全的开源 VPN,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用 VPN。它旨在比 OpenVPN 性能更高。WireGuard 被设计为通用 VPN,可在嵌入式接口和超级计算机上运行,​​适用于许多不同情况。它最初是为 Linux 内核发布的,现在已跨平台(Windows、macOS、BSD、iOS、Android)并可广泛部署。它目前正在大力开发中,但它可能已经被视为业内最安全、最易于使用和最简单的 VPN 解决方案。

配置

安装wireguard软件

1
apt install wireguard resolvconf -y

开启IP转发,使本节点成为转发服务器

1
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

输入sysctl -p,确认net.ipv4.ip_forward = 1

如果安装失败,考虑是否为 DNS 问题
输入sudo vim /etc/resolv.conf
写入
#nameserver 127.0.0.53 (原来的屏蔽)
nameserver 223.5.5.5
nameserver 223.6.6.6
nameserver 127.0.0.1
保存后sudo apt-get update

进入配置存储路径,调整目录权限

1
2
3
cd /etc/wireguard/
sudo chmod 700 /etc/wireguard
umask 077

生成服务器秘钥

1
2
3
4
5
#生成私钥
wg genkey > server.key

#通过私钥生成公钥
wg pubkey < server.key > server.key.pub

生成客户端(client1)秘钥

1
2
3
4
5
#生成私钥
wg genkey > client_wzx_pc.key

#通过私钥生成公钥
wg pubkey < client_wzx_pc.key > client_wzx_pc.key.pub

要几个客户端就再生成几个

显示所有生成的秘钥

1
cat server.key && cat server.key.pub && cat client_wzx_pc.key && cat client_wzx_pc.key.pub

自动创建服务器配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
echo "
[Interface]
PrivateKey = $(cat server.key) # 自动填写本机的privatekey 内容
Address = 10.0.8.1 #本机虚拟局域网IP

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 = 50814 # 监听端口
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = $(cat client_wzx_pc.key.pub) #自动client1的公钥
AllowedIPs = 10.0.8.10/32 #客户端所使用的IP" > wg0.conf

设置服务器开机自启动

1
systemctl enable wg-quick@wg0

启动wireguard

1
2
3
4
#启动wg0
wg-quick up wg0
#关闭wg0
wg-quick down wg0

启动后输入ifconfig,可以发现多了一个虚拟网络设备wg0

wireguard客户端下载地址

https://download.wireguard.com/windows-client/

客户端配置(以client1为例)

1
2
3
4
5
6
7
8
9
10
11
[Interface]
PrivateKey = 6M8HEZioew+vR3i53sPc64Vg40YsuMzh4vI1Lkc88Xo= #记得替换,此处为client1的私钥
Address = 10.0.8.10 #此处为peer规定的客户端IP
MTU = 1420

[Peer]
PublicKey = Tt5WEa0Vycf4F+TTjR2TAHDfa2onhh+tY8YOIT3cKjI= #记得替换,此处为server的公钥
AllowedIPs = 10.0.8.0/24 #此处为允许的服务器IP,运行1-255的设备访问此用户端1
Endpoint = 114.514.1919.810:50814 #服务器对端IP+端口

PersistentKeepalive = 25

增加服务器客户端节点client2

1
2
3
4
5
6
7
8
9
10
11
#生成私钥
wg genkey > client_wzx_phone.key

#通过私钥生成公钥
wg pubkey < client_wzx_phone.key > client_wzx_phone.key.pub

#将peer公钥加入wg0.conf配置
echo "
[Peer]
PublicKey = $(cat client_wzx_phone.key.pub) #自动client1的公钥
AllowedIPs = 10.0.8.11/32 #客户端Client2所使用的IP,记得更换地址" >> wg0.conf

增加后记得重启一下设备

UDP over TCP (待定)

WireGuard 在国内网络环境下会遇到一个致命的问题:UDP 封锁/限速。虽然通过 WireGuard 可以在隧道内传输任何基于 IP 的协议(TCP、UDP、ICMP、SCTP、IPIP、GRE 等),但 WireGuard 隧道本身是通过 UDP 协议进行通信的,而国内运营商根本没有能力和精力根据 TCP 和 UDP 的不同去深度定制不同的 QoS 策略,几乎全部采取一刀切的手段:对 UDP 进行限速甚至封锁。虽然对 UDP 不友好,但却无力深度检测 TCP 连接的真实性。于是将 UDP 连接伪装成 TCP 连接就可以蒙混过关了,可以用 udp2raw 绕过UDP屏蔽或QoS.

虽然道理是这么个道理,但是现在似乎并没有太大影响,主要是改成 TCP 手机端就不好操作了,那就先不改了,等以后遇到问题再改。

tailscale + derp

用 tailscale 搭建内网穿透还是挺简单的。但是,延迟有点大。如果用云服务器和 derp 搭建中继节点,过程还是比较麻烦的,而且只有使用域名的方式才可以通过认证防止被白嫖,只要别人知道了你的 derp 服务器的地址和端口,就可以为他所用。