Menu Close

一个高速、安全、可以复活被墙IP的VPN —— WireGuard 服务端手动教程

从几个月前就有人跟我说过 WireGuard 这个下一代VPN协议,不过当时网上也没什么中文教程,官方又全是英文,零零散散的看不懂就给无视了。

最近一段时间,貌似 WireGuard 开始流行了,好多人都推荐给我,让我写教程。我搜索了下,找到了几个中文教程,虽然也是零零散散的,不过要重点感谢一下这个脚本,让我清楚了完整配置过程。

昨天下午和今天上午简单研究了下,差不多可以写教程啦~


WireGuard简单介绍

注意:WireGuard 是通过 UDP 协议传输数据的,这意味着它可以搭建在被墙的服务器上使用,复活被墙IP

同时:因为是 UDP 传输的,所以也不怕被墙,锐速、BBR 这类TCP加速工具也不会对其起到加速作用。

另外:如果你当地运营商对海外 UDP 链接进行 QOS 限速,那么速度可能不如使用 TCP 链接的代理软件理想。

至于该 VPN 是否容易被GFW针对封锁,目前还不得而知,至少目前 WireGuard 连 1.0 正式版都不算。

更少的代码

相比于 OpenVPN 、 IPSec 的几十万行代码,WireGuard 只有短短的四千行。

更容易部署

对于初次接触的人来说,相比于其他VPN协议,WireGuard 更容易部署。

更安全的加密

  • Curve25519 目前最高水平的秘钥交换算法。
  • ChaCha20 对称加解密算法,比 AES 更快更高效。
  • Poly1305 是一种 MAC (Message Authentication Code) 标准,用于验证数据的完整性和消息的真实性。
  • BLAKE2 一种更安全的 HASH 算法(类似的有 SHA1, SHA256, MD5)
  • SipHash24 另一种 HASH 算法。
  • HKDF 一种秘钥衍生算法。

Linux之父的评价:

Linus Torvalds, on the Linux Kernel Mailing List:
Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn’t perfect, but I’ve skimmed it, and compared to the horrors that are OpenVPN and IPSec, it’s a work of art(它是一件艺术品).

官方网站:https://www.wireguard.com/


再多的我也编不出来了,大家凑活着看吧。

目前该地区对 VPN 的封锁日益加重,就连 Cisco AnyConnect VPN 思科VPN都在逐渐被干扰(前段时间开始不少人向我反馈频繁断开连接 和 干脆连不上),所以对 VPN 有需求的可以考虑一下 WireGuard ,而且WireGuard 还比 思科VPN配置简单,不需要导入证书什么的。

因为其链接特性,所以 WireGuard 有很好的稳定性,无论你怎么切换网络 或者 网络波动导致断开后,往往可以很快恢复链接,所以如果拿来加速游戏的话,可能效果不错(当然前提是你的代理服务器也要网络不错)。


前提要求

  • 系统要求:Debian 8 / 9、Ubuntu 14.04 / 16.04 / 18.04 / 18.10
  • 服务器要求:OpenVZ 虚拟化的服务器不支持安装该VPN,其他虚拟化均可。

如果担心出错,那么我推荐 Debian9、Ubuntu16.04 / 18.04 / 18.10 系统,这些较新的系统更不容易出错,相对来说 Ubuntu 系统安装更方便!

注意:如果你用的是 Vultr、DO,且你本地没有 IPv6 地址,那就不要勾选 Enable IPv6 ,否则可能客户端链接时可能会出错。

另外,请确保你的系统是纯净的,建议重装系统后直接开始本教程!

CentOS7 系统可以参考下官方给的安装代码,至于后面的配置步骤什么的全系统通用。因为时间有限,所以我目前只测试了各个 Debian Ubuntu 系统,有空的话我测试下 CentOS7,补充下手动教程。


Debian安装步骤

安装内核

首先,Debian 无论是哪个系统,默认往往都没有 linux-headers 内核,而安装使用 WireGuard 必须要这货,所以我们需要先安装:

  1. # 更新软件包源
  2. apt update
  3. # 安装和 linux-image 内核版本相对于的 linux-headers 内核
  4. apt install linuxheaders$(uname r) y
  1. # 以下为示例内容(仅供参考)
  2.  
  3. # Debian8 安装前内核列表(空)
  4. root@doubi:~# dpkg -l|grep linux-headers
  5. # 空,没有任何输出
  6.  
  7. # Debian8 安装后内核列表(注意这里的版本号 可能不一样)
  8. root@doubi:~# dpkg -l|grep linux-headers
  9. ii linuxheaders3.16.06amd64 3.16.572 amd64 Header files for Linux 3.16.06amd64
  10. ii linuxheaders3.16.06common 3.16.572
  11.  
  12.  
  13. # Debian9 安装前内核列表(空)
  14. root@doubi:~# dpkg -l|grep linux-headers
  15. # 空,没有任何输出
  16.  
  17. # Debian9 安装后内核列表(注意这里的版本号 可能不一样)
  18. root@doubi:~# dpkg -l|grep linux-headers
  19. ii linuxheaders4.9.07amd64 4.9.1103+deb9u2 amd64 Header files for Linux 4.9.07amd64
  20. ii linuxheaders4.9.07common 4.9.1103+deb9u2 all Common header files for Linux 4.9.07
  21.  
  22. # 以上为示例内容(仅供参考)

安装WireGuard

然后我们就可以开始安装 WireGuard 了。

  1. # 添加 unstable 软件包源,以确保安装版本是最新的
  2. echo “deb http://deb.debian.org/debian/ unstable main” > /etc/apt/sources.list.d/unstable.list
  3. echo e ‘Package: *\nPin: release a=unstable\nPin-Priority: 150’ > /etc/apt/preferences.d/limitunstable
  4.  
  5. # 更新一下软件包源
  6. apt update
  7.  
  8. # 开始安装 WireGuard ,resolvconf 是用来指定DNS的,旧一些的系统可能没装。
  9. apt install wireguard resolvconf y

 


Ubuntu安装步骤

配置PPA

首先如果你是 Ubuntu 14.04 系统,那么请先安装 PPA:

  1. # 以下步骤仅限 Ubuntu 14.04 系统执行
  2. apt update
  3. apt install softwarepropertiescommon y

安装完成后,我们还需要通过 PPA 工具添加 WireGuard 源:

  1. addaptrepository ppa:wireguard/wireguard
  2. # 执行后提示如下示例内容(仅供参考):
  3.  
  4. root@doubi:~# add-apt-repository ppa:wireguard/wireguard
  5. WireGuard is a novel VPN that runs inside the Linux Kernel. This is the Ubuntu packaging for WireGuard. More info may be found at its website, listed below.
  6.  
  7. More info: https://www.wireguard.com/
  8. Packages: wireguard wireguardtools wireguarddkms
  9.  
  10. Install with: $ apt install wireguard
  11.  
  12. For help, please contact
  13. More info: https://launchpad.net/~wireguard/+archive/ubuntu/wireguard
  14. Press [ENTER] to continue or ctrlc to cancel adding it
  15.  
  16. # 这里会提示你是否继续,点击 回车键 继续,点击 Ctrl+C 键退出。
  17. # 然后输出大概如下内容。
  18.  
  19. gpg: keyring ‘/tmp/tmp8bgitjjx/secring.gpg’ created
  20. gpg: keyring ‘/tmp/tmp8bgitjjx/pubring.gpg’ created
  21. gpg: requesting key 504A1A25 from hkp server keyserver.ubuntu.com
  22. gpg: /tmp/tmp8bgitjjx/trustdb.gpg: trustdb created
  23. gpg: key 504A1A25: public key “Launchpad PPA for wireguard-ppa” imported
  24. gpg: Total number processed: 1
  25. gpg: imported: 1 (RSA: 1)
  26. OK
  27.  
  28. # 以上为输出示例内容(仅供参考)

安装WireGuard

然后我们就可以开始安装 WireGuard 了。

  1. # 更新一下软件包源
  2. apt update
  3.  
  4. # 开始安装 WireGuard ,resolvconf 是用来指定DNS的,旧一些的系统可能没装。
  5. apt install wireguard resolvconf y

 


验证是否安装成功

当你通过上面的步骤安装完后,请用下面的代码验证一下是否安装成功。

  1. lsmod | grep wireguard
  2. # 执行该代码后,提示大概如下示例内容(仅供参考),第一行是必须要有的,至于下面的两行不同系统似乎还不一样,但是不影响使用。
  3.  
  4. root@doubi:~# modprobe wireguard && lsmod | grep wireguard
  5. wireguard 212992 0
  6. ip6_udp_tunnel 16384 1 wireguard
  7. udp_tunnel 16384 1 wireguard

 

配置步骤

生成密匙对

当你确定安装成功后,就要开始配置服务端和客户端的配置文件了。放心,这很简单。

  1. # 首先进入配置文件目录,如果该目录不存在请先手动创建:mkdir /etc/wireguard
  2. cd /etc/wireguard
  3.  
  4. # 然后开始生成 密匙对(公匙+私匙)。
  5. wg genkey | tee sprivatekey | wg pubkey > spublickey
  6. wg genkey | tee cprivatekey | wg pubkey > cpublickey

查看主网卡名称

先查看一下你的主网卡名是什么:

  1. ip addr
  2. # 执行命令后,示例如下(仅供参考),lo 是本地环回 忽略,eth0 就是主网卡名了。
  3. # 写着你的服务器外网IP的(下面 X.X.X.X 处),就是你的主网卡,NAT的服务器则是显示内网IP。
  4. # 如果你拿不准哪个网卡是主网卡,请留言询问。
  5.  
  6. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
  7. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  8. inet 127.0.0.1/8 scope host lo
  9. valid_lft forever preferred_lft forever
  10. inet6 ::1/128 scope host
  11. valid_lft forever preferred_lft forever
  12. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  13. link/ether 00:16:3c:cf:89:73 brd ff:ff:ff:ff:ff:ff
  14. inet X.X.X.X/25 brd 255.255.255.255 scope global eth0
  15. valid_lft forever preferred_lft forever

生成服务端配置文件

接下来就开始生成服务端配置文件:

  1. # 井号开头的是注释说明,用该命令执行后会自动过滤注释文字。
  2. # 下面加粗的这一大段都是一个代码!请把下面几行全部复制,然后粘贴到 SSH软件中执行,不要一行一行执行!
  3.  
  4. echo “[Interface]
  5. # 服务器的私匙,对应客户端配置中的公匙(自动读取上面刚刚生成的密匙内容)
  6. PrivateKey = $(cat sprivatekey)
  7. # 本机的内网IP地址,一般默认即可,除非和你服务器或客户端设备本地网段冲突
  8. Address = 10.0.0.1/24
  9. # 运行 WireGuard 时要执行的 iptables 防火墙规则,用于打开NAT转发之类的。
  10. # 如果你的服务器主网卡名称不是 eth0 ,那么请修改下面防火墙规则中最后的 eth0 为你的主网卡名称。
  11. PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  12. # 停止 WireGuard 时要执行的 iptables 防火墙规则,用于关闭NAT转发之类的。
  13. # 如果你的服务器主网卡名称不是 eth0 ,那么请修改下面防火墙规则中最后的 eth0 为你的主网卡名称。
  14. PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
  15. # 服务端监听端口,可以自行修改
  16. ListenPort = 443
  17. # 服务端请求域名解析 DNS
  18. DNS = 8.8.8.8
  19. # 保持默认
  20. MTU = 1420
  21. # [Peer] 代表客户端配置,每增加一段 [Peer] 就是增加一个客户端账号,具体我稍后会写多用户教程。
  22. [Peer]
  23. # 该客户端账号的公匙,对应客户端配置中的私匙(自动读取上面刚刚生成的密匙内容)
  24. PublicKey = $(cat cpublickey)
  25. # 该客户端账号的内网IP地址
  26. AllowedIPs = 10.0.0.2/32″|sed ‘/^#/d;/^\s*$/d’ > wg0.conf
  27.  
  28. # 上面加粗的这一大段都是一个代码!请把下面几行全部复制,然后粘贴到 SSH软件中执行,不要一行一行执行!

生成客户端配置文件

接下来就开始生成客户端配置文件:

  1. # 井号开头的是注释说明,用该命令执行后会自动过滤注释文字。
  2. # 下面加粗的这一大段都是一个代码!请把下面几行全部复制,然后粘贴到 SSH软件中执行,不要一行一行执行!
  3.  
  4. echo “[Interface]
  5. # 客户端的私匙,对应服务器配置中的客户端公匙(自动读取上面刚刚生成的密匙内容)
  6. PrivateKey = $(cat cprivatekey)
  7. # 客户端的内网IP地址
  8. Address = 10.0.0.2/24
  9. # 解析域名用的DNS
  10. DNS = 8.8.8.8
  11. # 保持默认
  12. MTU = 1420
  13. [Peer]
  14. # 服务器的公匙,对应服务器的私匙(自动读取上面刚刚生成的密匙内容)
  15. PublicKey = $(cat spublickey)
  16. # 服务器地址和端口,下面的 X.X.X.X 记得更换为你的服务器公网IP,端口请填写服务端配置时的监听端口
  17. Endpoint = X.X.X.X:443
  18. # 因为是客户端,所以这个设置为全部IP段即可
  19. AllowedIPs = 0.0.0.0/0, ::0/0
  20. # 保持连接,如果客户端或服务端是 NAT 网络(比如国内大多数家庭宽带没有公网IP,都是NAT),那么就需要添加这个参数定时链接服务端(单位:秒),如果你的服务器和你本地都不是 NAT 网络,那么建议不使用该参数(设置为0,或客户端配置文件中删除这行)
  21. PersistentKeepalive = 25″|sed ‘/^#/d;/^\s*$/d’ > client.conf
  22.  
  23. # 上面加粗的这一大段都是一个代码!请把下面几行全部复制,然后粘贴到 SSH软件中执行,不要一行一行执行!

接下来你就可以将这个客户端配置文件 [/etc/wireguard/client.conf] 通过SFTP、HTTP等方式下载到本地了。

不过我更推荐,SSH中打开显示配置文件内容并复制出来后,本地设备新建一个文本文件 [xxx.conf] (名称随意,后缀名需要是 .conf) 并写入其中,提供给 WireGuard 客户端读取使用。

  1. cat /etc/wireguard/client.conf

其他剩余其他操作:

  1. # 赋予配置文件夹权限
  2. chmod 777 R /etc/wireguard
  3.  
  4. # 打开防火墙转发功能
  5. echo 1 > /proc/sys/net/ipv4/ip_forward
  6. echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
  7. sysctl p

 

启动WireGuard

  1. wgquick up wg0
  2. # 执行命令后,输出示例如下(仅供参考)
  3.  
  4. [#] ip link add wg0 type wireguard
  5. [#] wg setconf wg0 /dev/fd/63
  6. [#] ip address add 10.0.0.1/24 dev wg0
  7. [#] ip link set mtu 1420 dev wg0
  8. [#] ip link set wg0 up
  9. [#] resolvconf -a tun.wg0 -m 0 -x
  10. [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  11.  
  12. # 如果此处没有报错:RTNETLINK answers: Operation not supported,且输入内容差不多,那么说明启动成功了!

停止WireGuard

  1. wgquick down wg0

查询WireGuard状态

  1. wg

开机启动

注意:Ubuntu 14.04 系统默认是没有 systemctl 的,所以无法配置开机启动。

  1. # 设置开机启动
  2. systemctl enable wgquick@wg0
  3. # 取消开机启动
  4. systemctl disable wgquick@wg0

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注