在Ubuntu上设置您自己的WireGuard VPN服务器

本教程将向您展示如何在Ubuntu上设置自己的WireGuard VPN服务器。 WireGuard专为Linux内核而设计。 它运行在Linux内核中,并允许您创建快速,现代且安全的VPN隧道。

WireGuard VPN的功能

  • 轻巧和超快的速度,将OpenVPN吹倒了。
  • 跨平台。 WireGuard可以在Linux,BSD,macOS,Windows,Android,iOS和OpenWRT上运行。
  • 用户身份验证通过交换类似于SSH密钥的公共密钥来完成。
  • 它将静态隧道IP地址分配给VPN客户端。 有些人可能不喜欢它,但是在某些情况下它可能很有用。
  • 移动设备可以在Wi-Fi和移动网络之间无缝切换,而不会断开任何连接。
  • 它旨在在大多数情况下替换OpenVPN和IPSec。

先决条件

本教程假定VPN服务器和VPN客户端都在运行 的Ubuntu 操作系统。

步骤1:在Ubuntu服务器和桌面上安装WireGuard

登录到Ubuntu服务器,然后运行以下命令来安装WireGuard。

Ubuntu 20.04

Ubuntu 20.04附带Linux内核5.4,该内核具有内置的wireguard模块。

sudo apt update
sudo apt install wireguard wireguard-tools

Ubuntu 18.04

Ubuntu 18.04附带Linux内核4.15,因此用户需要先安装硬件启用内核(HWE),这将在系统上安装内核5.4。

sudo apt update
sudo apt install linux-generic-hwe-18.04-edge

重新启动Ubuntu 18.04服务器并安装WireGuard。

sudo shutdown -r now
sudo apt install wireguard wireguard-tools wireguard-dkms

然后使用相同的命令在本地Ubuntu计算机(VPN客户端)上安装WireGuard。 请注意,您还需要安装 openresolv 客户端上的软件包以配置DNS服务器。

sudo apt install openresolv

第2步:生成公共/私人密钥对

服务器

在Ubuntu服务器上运行以下命令以创建一个公钥/私钥对,该对将保存在 /etc/wireguard/ 目录。

wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

客户

运行以下命令以在本地Ubuntu计算机(VPN客户端)上创建公钥/私钥对。

wg genkey | sudo tee /etc/wireguard/client_private.key | wg pubkey | sudo tee /etc/wireguard/client_public.key

步骤3:创建WireGuard配置文件

服务器

使用类似Nano的命令行文本编辑器在Ubuntu服务器上创建WireGuard配置文件。 wg0 将是网络接口名称。

sudo nano /etc/wireguard/wg0.conf

复制以下文本并将其粘贴到您的配置文件中。 您需要使用自己的服务器私钥和客户端公钥。

[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = cD+ZjXiVIX+0iSX1PNijl4a+88lCbDgw7kO78oXXLEc=

[Peer]
PublicKey = AYQJf6HbkQ0X0Xyt+cTMTuJe3RFwbuCMF46LKgTwzz4=
AllowedIPs = 10.10.10.2/32

ubuntu wireguard VPN服务器配置文件wg-conf

哪里:

  • 地址:指定VPN服务器的专用IP地址。 在这里,我使用的是10.10.10.0/24网络范围,因此它不会与您的家庭网络范围冲突。 (大多数家用路由器使用192.168.0.0/24或192.168.1.0/24)。 VPN服务器的专用IP地址为10.10.10.1。
  • 私钥:VPN服务器的私钥,可以在 /etc/wireguard/server_private.key 服务器上的文件。
  • 监听端口:WireGuard VPN服务器将在UDP端口51820上侦听,这是默认设置。
  • 公钥:VPN客户端的公钥,可以在 /etc/wireguard/client_public.key 客户端计算机上的文件。
  • 允许的IP:允许VPN客户端使用的IP地址。 在此示例中,客户端只能在VPN隧道内使用10.10.10.2 IP地址。

保存并关闭文件。 (要在Nano文本编辑器中保存文件,请按 Ctrl+O,然后按Enter确认。 按 Ctrl+X 退出。)

更改文件权限模式,以便只有root用户才能读取文件。

sudo chmod 600 /etc/wireguard/ -R

客户

使用命令行文本编辑器(如Nano)在本地Ubuntu计算机上创建WireGuard配置文件。 wg-client0 将是网络接口名称。

sudo nano /etc/wireguard/wg-client0.conf

复制以下文本并将其粘贴到您的配置文件中。 您需要使用自己的客户端私钥和服务器公钥。

[Interface]
Address = 10.10.10.2/24
DNS = 10.10.10.1
PrivateKey = cOFA+x5UvHF+a3xJ6enLatG+DoE3I5PhMgKrMKkUyXI=

[Peer]
PublicKey = RaoAdsIEIwgV9DHNSubxWVG+nZ1GP/c3OU6A/efBJ0I=
AllowedIPs = 0.0.0.0/0
Endpoint = 12.34.56.78:51820
PersistentKeepalive = 25

哪里:

  • 地址:指定VPN客户端的专用IP地址。
  • 域名解析:指定10.10.10.1(VPN服务器)作为DNS服务器。 它将通过 resolvconf 命令。
  • 私钥:客户端的私钥,可以在 /etc/wireguard/client_private.key 客户端计算机上的文件。
  • 公钥:服务器的公共密钥,可以在 /etc/wireguard/server_public.key 服务器上的文件。
  • 允许的IP:0.0.0.0/0代表整个Internet,这意味着到Internet的所有流量都应通过VPN路由。
  • 终点:VPN服务器的公共IP地址和端口号。 将12.34.56.78替换为服务器的真实公共IP地址。
  • 持久保持:每25秒将经过身份验证的空数据包发送到对等方,以保持连接有效。 如果未启用PersistentKeepalive,则VPN服务器可能无法ping通VPN客户端。

保存并关闭文件。

更改文件模式,以便只有root用户才能读取文件。

sudo chmod 600 /etc/wireguard/ -R

步骤4:在服务器上启用IP转发

为了使VPN服务器能够在VPN客户端和Internet之间路由数据包,我们需要启用IP转发。 编辑 sysctl.conf 文件。

sudo nano /etc/sysctl.conf

在此文件的末尾添加以下行。

net.ipv4.ip_forward = 1

保存并关闭文件。 然后使用以下命令应用更改。 的 -p 该选项将从以下位置加载sysctl设置 /etc/sysctl.conf 文件。 此命令将在系统重新引导后保留我们的更改。

sudo sysctl -p

步骤5:在服务器上配置IP伪装

我们需要在服务器防火墙中设置IP伪装,以便服务器成为VPN客户端的虚拟路由器。 我将使用UFW,它是iptables防火墙的前端。 在Ubuntu上通过以下方式安装UFW:

sudo apt install ufw

首先,您需要允许SSH流量。

sudo ufw allow 22/tcp

接下来,找到服务器主网络接口的名称。

ip addr

如您所见,它的名字是 ens3 在我的Ubuntu服务器上。

ubuntu Wireguard防火墙

要配置IP伪装,我们必须在UFW配置文件中添加iptables命令。

sudo nano /etc/ufw/before.rules

默认情况下,对于 filter 表。 在此文件的末尾添加以下行。 更换 ens3 使用您自己的网络接口名称。

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens3 -j MASQUERADE

# End each table with the 'COMMIT' line or these rules won't be processed
COMMIT

在Nano文本编辑器中,您可以通过按进入文件末尾 Ctrl+W,然后按 Ctrl+V

UFW NAT表POSTROUTING MASQUERADE

以上各行将追加(-一种)至 后伸t 表。 它将把您的虚拟专用网络链接到Internet。 并且还可以将您的网络与外界隔离。 因此,互联网只能看到您的VPN服务器的IP,而看不到您的VPN客户端的IP,就像您的家庭路由器隐藏了您的专用家庭网络一样。

缺省情况下,UFW禁止报文转发。 我们可以允许转发我们的专用网络。 找出 ufw-before-forward 链,并添加以下3行,如果源IP或目标IP在 10.10.10.0/24 范围。

# allow forwarding for trusted network
-A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT

ufw允许数据包转发

保存并关闭文件。 然后启用UFW。

sudo ufw enable

如果您以前启用过UFW,则可以使用systemctl重新启动UFW。

sudo systemctl restart ufw

现在,如果您使用以下命令在NAT表的POSTROUTING链中列出规则:

sudo iptables -t nat -L POSTROUTING

您可以看到化妆舞会规则。

Wireguard-IP-Masquerading-ufw-ubuntu

步骤6:在服务器上安装DNS解析器

由于我们将VPN服务器指定为客户端的DNS服务器,因此我们需要在VPN服务器上运行DNS解析器。 我们可以安装bind9 DNS服务器。

sudo apt install bind9

安装完成后,BIND将自动启动。 您可以通过以下方式查看其状态:

systemctl status bind9

样本输出:

● named.service - BIND Domain Name Server
     Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2020-05-17 08:11:26 UTC; 37s ago
       Docs: man:named(8)
   Main PID: 13820 (named)
      Tasks: 5 (limit: 1074)
     Memory: 14.3M
     CGroup: /system.slice/named.service
             └─13820 /usr/sbin/named -f -u bind

如果它没有运行,请使用以下命令启动它:

sudo systemctl start bind9

编辑BIND DNS服务器的配置文件。

sudo nano /etc/bind/named.conf.options

添加以下行以允许VPN客户端发送递归DNS查询。

allow-recursion { 127.0.0.1; 10.10.10.0/24; };

Wireguard BIND DNS解析器

保存并关闭文件。 重新启动BIND9,以使更改生效。

sudo systemctl restart bind9

然后,您需要运行以下命令以允许VPN客户端连接到端口53。

sudo ufw insert 1 allow in from 10.10.10.0/24

步骤7:在防火墙中打开WireGuard端口

运行以下命令以打开服务器上的UDP端口51820。

sudo ufw allow 51820/udp

步骤8:启动WireGuard

服务器

在服务器上运行以下命令以启动WireGuard。

sudo wg-quick up /etc/wireguard/wg0.conf

要停止它,请运行

sudo wg-quick down /etc/wireguard/wg0.conf

您也可以使用systemd服务启动WireGuard。

sudo systemctl start [email protected]

在系统启动时启用自动启动。

sudo systemctl enable [email protected]

使用以下命令检查其状态。 它的状态应该是 active (exited)

systemctl status [email protected]

现在,WireGuard服务器已准备就绪,可以接受客户端连接。

客户

启动WireGuard。

sudo systemctl start [email protected]

在系统启动时启用自动启动。

sudo systemctl enable [email protected]

检查其状态:

systemctl status [email protected]

现在转到此网站:https://icanhazip.com/检查您的公共IP地址。 如果一切顺利,它将显示您的VPN服务器的公用IP地址,而不是您的客户端计算机的公用IP地址。

您也可以运行以下命令来获取当前的公共IP地址。

curl https://icanhazip.com

WireGuard和OpenConnect之间的速度比较

在我的一台VPS服务器上,我同时安装了WireGuard和OpenConnect VPN服务器。 速度测试如下。 这对您来说可能看起来并不快,因为我的计算机与VPN服务器之间的连接非常差。 您获得的速度取决于VPN客户端和VPN服务器之间的延迟和丢包率。

  • WireGuard是赢家。 它比OpenConnect快3倍。
  • TCP上的OpenConnect比UDP上的OpenConnect更快。 惊讶吗

WireGuard能够达到 52296 Kbps(约51 Mbit / s) 播放YouTube视频时。

Wireguard VPN速度测试

OpenConnect(具有TCP BBR算法的TLS)能够达到 16504 Kbps(约16 Mbit / s) 播放YouTube视频时。

ocserv TCP bbr速度测试

OpenConnect(UDP上的TLS)能够访问 12997 Kbps(约12.7 Mbit / s) 播放YouTube视频时。

在UDP速度测试中使用TLS

策略路由

默认情况下,VPN客户端上的所有流量都将通过VPN服务器路由。 有时,您可能只想根据传输层协议和目标端口来路由特定类型的流量。 这称为策略路由。

策略路由是在客户端计算机上配置的,我们需要首先停止VPN连接。

sudo systemctl stop [email protected]

然后编辑客户端配置文件。

sudo nano /etc/wireguard/wg-client0.conf

例如,如果您在 [interface] 部分,然后WireGuard将创建一个名为“ 1234”的路由表,并将ip规则添加到该路由表中。 在此示例中,仅当将TCP用作传输层协议且目标端口为25(即客户端计算机发送电子邮件)时,流量才会通过VPN服务器路由。

Table = 1234
PostUp = ip rule add ipproto tcp dport 25 table 1234
PreDown = ip rule delete ipproto tcp dport 25 table 1234

Wireguard VPN策略路由Ubuntu

注意:客户端应运行Ubuntu 20.04或更高版本才能配置策略路由。 的 ip Ubuntu 18.04上的实用程序不支持 ipprotodport 论据。

保存并关闭文件。 然后启动WireGuard客户端。

sudo systemctl start [email protected]

VPN Kill Switch

默认情况下,VPN连接中断时,您的计算机可以通过普通网关访问Internet。 您可能要启用终止开关功能,该功能可防止未加密的数据包通过非WireGuard接口流动。

停止WireGuard客户端进程。

sudo systemctl stop [email protected]

编辑客户端配置文件。

sudo nano /etc/wireguard/wg-client0.conf

将以下两行添加到 [interface] 部分。

PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

像这样:

[Interface]
Address = 10.10.10.2/24
DNS = 10.10.10.1
PrivateKey = cOFA+x5UvHF+a3xJ6enLatG+DoE3I5PhMgKrMKkUyXI=
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

[Peer]
PublicKey = RaoAdsIEIwgV9DHNSubxWVG+nZ1GP/c3OU6A/efBJ0I=
AllowedIPs = 0.0.0.0/0
Endpoint = 12.34.56.78:51820
PersistentKeepalive = 25

保存并关闭文件。 然后启动WireGuard客户端。

sudo systemctl start [email protected]

故障排除

您可以从VPN服务器ping通到VPN客户端,以查看隧道是否正常工作。 如果您在ping中看到以下错误消息,

ping: sendmsg: Required key not available

可能是 AllowedIPs 参数是错误的,如错字。

请注意,我不建议使用 SaveConfig=true 在里面 [Interface] WireGuard配置文件的部分。 SaveConfig 告诉WireGuard在关机时保存运行时配置。 因此,如果您添加其他 [Peer] 在配置文件中,然后重新启动WireGuard,新添加的配置将被覆盖。

包起来

而已! 我希望本教程可以帮助您在Ubuntu上安装和配置WireGuard。 与往常一样,如果您发现此帖子有用,请订阅我们的免费新闻简报以获取更多提示和技巧。

Sidebar