如何在 Ubuntu 22.04 上设置 WireGuard VPN
本教程适用于这些操作系统版本
- Ubuntu 22.04(Jammy Jellyfish)
- Ubuntu 20.04(Focal Fossa)
在此页
- 先决条件
- 第 1 步 - 安装 Wireguard 并生成密钥对
- 第 2 步 - 选择 IPv4 和 IPv6 地址
- 选择 IPv4 范围
- 选择 IPv6 范围
- 创建 Wireguard 对等密钥对
- 创建对等配置文件
- 配置对等点以通过隧道路由所有流量
- 配置对等 DNS 解析器
Wireguard 是一种开源跨平台虚拟专用网络 (VPN) 实现,它使用最先进的加密技术。它支持 IPv4 和 IPv6 连接。它比 IPSec 和 OpenVPN 协议更快、更简单且功能更强大。它被设计为运行在嵌入式接口和超级计算机上的通用 VPN,可运行在 Linux、Windows、macOS、iOS、Android 和各种其他平台上。
Wireguards 加密使用私钥和公钥进行工作,以便对等方在它们之间建立加密隧道。
本教程将介绍如何在 Ubuntu 22.04 服务器上安装 Wireguard VPN 并使用 Ubuntu 客户端连接到它。
先决条件
-
A server running Ubuntu 22.04 supports both IPv4 and IPv6 connections.
-
A client running Ubuntu 22.04 to connect to the Wireguard server. For our tutorial, we will be using our local machine as our client but you can use a remote server for it.
-
A non-root user with sudo privileges.
-
The uncomplicated Firewall(UFW) is enabled and running.
-
Everything is updated.
$ sudo apt update && sudo apt upgrade
第 1 步 - 安装 Wireguard 并生成密钥对
Ubuntu 22.04 附带最新版本的 Wireguard。安装线卫。
$ sudo apt install wireguard
下一步是为服务器生成私钥和公钥对。使用
wg genkey
命令为服务器创建私钥。$ wg genkey | sudo tee /etc/wireguard/private.key
更改权限以保护私钥。
chmod go=
命令阻止其他用户和组访问该文件。您将在终端上收到编码密钥。请记下密钥,因为稍后将需要它。$ sudo chmod go= /etc/wireguard/private.key
接下来,根据私钥生成相应的公钥。使用
wg pubkey
生成公钥。以下命令分为三部分,第一部分输出私钥,wg pubkey
命令使用该私钥生成公钥,然后存储在相应的文件中。$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
您将再次在终端上收到公钥。记下它。
第 2 步 - 选择 IPv4 和 IPv6 地址
我们需要定义私有 IPv4 和 IPv6 地址以与您的 Wireguard 服务器和对等方一起使用。
选择 IPv4 范围
要将 Wireguard 与 IPv4 对等方一起使用,服务器需要为其隧道接口提供一系列私有 IPv4 地址。您可以从以下保留的地址块中选择任意范围的 IP 地址:
10.0.0.0
到10.255.255.255
(10/8 前缀)172.16.0.0
到172.31.255.255
(172.16/12 前缀)192.168.0.0
到192.168.255.255
(192.168/16 前缀)
对于我们的教程,我们将使用 10.8.0.0/24 作为第一个保留 IP 范围中的 IP 地址块。此范围最多允许 255 个对等连接。您还可以使用托管公司提供的私有 IP 范围。
选择 IPv6 范围
根据 RFC 算法,获得唯一 IPv6 前缀的推荐方法是将一天中的时间与机器 ID 等唯一值相结合。然后将这些值散列并截断以用作保留私有
fd00::/8
IP 块中的唯一地址。第一步是使用
date
实用程序收集 64 位时间戳。$ date +%s%N
它将生成类似于以下内容的输出,即自 Unix 纪元时间(1970 年 1 月 1 日 00:00 UTC)以来经过的秒数。
1659342559092041940
记下该值以备后用。接下来,复制服务器的
machine-id
值。该值对于每个系统都是唯一的。$ cat /var/lib/dbus/machine-id
您将获得类似的输出。
d97e195db6584d63aeedfdc35dc83c7f
接下来,将时间戳与
machine-id
结合起来,并使用 SHA-1 算法对字符串进行哈希处理。printf <timestamp><machine-id> | sha1sum
替换之前上述命令中的
和
值。您将收到另一个哈希值。$ printf 1659342559092041940d97e195db6584d63aeedfdc35dc83c7f | sha1sum d789c02d9d8faef806d40ec15b307d4d9c8ec4bc -
运行以下命令以根据 RFC 算法修剪
printf
输出。$ printf d789c02d9d8faef806d40ec15b307d4d9c8ec4bc | cut -c 31-
您应该得到以下输出。
4d9c8ec4bc
在上面的输出中,字节集是
4d 9c 8e c4 bc
。通过以下方式在上面的 5 个字节后附加fd
前缀来生成 IPv6 地址。使用先前使用
/64
子网大小生成的字节,结果前缀如下。Unique Local IPv6 Address Prefix fd4d:9c8e:c4bc::/64
要为服务器分配 IP,请在最后一个
::
字符后添加 1。结果地址将是fd4d:9c8e:c4bc::1/64
。对等点通过添加另一个增量来使用 IP 地址,例如fd4d:9c8e:c4bc::2/64
。第 3 步 - 配置 Wireguard
生成配置文件并打开以进行编辑。
$ sudo nano /etc/wireguard/wg0.conf
将以下代码粘贴到其中。将
server_private_key
替换为步骤 1 中生成的私钥。您可以将侦听端口更改为任何您喜欢的端口。[Interface] PrivateKey = server_private_key Address = 10.8.0.1/24, fd4d:9c8e:c4bc::/64 ListenPort = 51820 SaveConfig = true
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
第 4 步 - 配置 Wireguard 网络
要通过 Wireguard 服务器路由对等流量,您需要配置 IP 转发。打开文件
/etc/sysctl.conf
进行编辑。$ sudo nano /etc/sysctl.conf
通过删除前面的井号来取消注释以下行。
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 # Uncomment the next line to enable packet forwarding for IPv6 # Enabling this option disables Stateless Address Autoconfiguration # based on Router Advertisements for this host net.ipv6.conf.all.forwarding=1
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。使用以下命令验证新值。
$ sudo sysctl -p net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 vm.swappiness = 0
现在,您的 Wireguard 服务器会将来自 VPN 以太网设备的所有传入流量转发到服务器上的其他设备,并从那里转发到公共互联网。这允许服务器通过服务器 IP 地址路由来自对等方的所有 Web 流量,并将隐藏客户端 IP 地址。
下一步是配置防火墙规则以使转发正常工作。
第 5 步 - 配置 Wireguard 服务器防火墙
要允许 VPN 流量通过服务器防火墙,您需要启用提供即时动态网络地址转换 (NAT) 的伪装来路由客户端连接。
找到 Wireguard 服务器的公共网络接口。
$ ip route list default default via 209.23.8.1 dev eth0 proto static
根据上面的命令,
eth0
是公共接口。打开 Wireguard 配置文件以将防火墙规则添加到您的 Wireguard 服务器。
$ sudo nano /etc/wireguard/wg0.conf
将以下行粘贴到文件底部
SaveConfig=true
行之后。. . . PostUp = ufw route allow in on wg0 out on eth0 PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PreDown = ufw route delete allow in on wg0 out on eth0 PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
PostUp
行在 Wireguard 服务器启动 VPN 隧道时运行。第一条规则允许转发 IPv4 和 IPv6 流量。第二条和第三条规则为 IPv4 和 IPv6 流量配置伪装。PreDown
行在 Wireguard 服务器停止 VPN 隧道时运行。配置防火墙的最后一步是允许流量进出 Wireguard UDP 端口。使用简易防火墙 (UFW) 打开 Wireguard 端口。
检查防火墙的状态。
$ sudo ufw status
您应该会看到如下内容。
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
打开在步骤 1 中配置的 51820 端口。如果您为 Wireguard 使用不同的端口,请打开该端口。
$ sudo ufw allow 51820/udp
禁用并重新启用 UFW 防火墙以加载在此步骤中修改的所有文件的更改。
$ sudo ufw disable $ sudo ufw enable
再次检查状态以确认。
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 51820/udp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 51820/udp (v6) ALLOW Anywhere (v6)
您的 Wireguard 服务器配置为处理 VPN 流量,包括对等点的转发和伪装。
第 6 步 - 启动 WireGuard 服务器
Wireguard 可以配置为使用
wg-quick
脚本作为服务运行。启用 Wireguard 服务。$ sudo systemctl enable
服务名称的
wg0
部分对应于/etc/wireguard/wg0.conf
文件。这意味着您可以使用不同的配置文件和服务创建任意数量的 VPN 隧道。启动 Wireguard 服务。
$ sudo systemctl start
检查服务的状态。
$ sudo systemctl status
您将获得类似的输出。
? - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/; enabled; vendor preset: enabled) Active: active (exited) since Mon 2022-08-01 11:35:59 UTC; 6s ago Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 Process: 3935 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 3935 (code=exited, status=0/SUCCESS) CPU: 216ms Aug 01 11:35:58 wireguard wg-quick[3935]: [#] wg setconf wg0 /dev/fd/63 Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -6 address add fd4d:9c8e:c4bc::/64 dev wg0 Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip link set mtu 1420 up dev wg0 Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ufw route allow in on wg0 out on eth0 Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added (v6) Aug 01 11:35:59 wireguard wg-quick[3935]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE Aug 01 11:35:59 wireguard systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
第 7 步 - 安装和配置 Wireguard Peer
在基于 Ubuntu 22.04 的对等节点上安装 Wireguard 客户端。
$ sudo apt update $ sudo apt install wireguard
如果您在本地 Ubuntu 桌面上安装,则可能预装了 Wireguard。
创建 Wireguard 对等密钥对
以与步骤 1 中相同的方式在对等点上生成密钥对。此外,为私钥授予权限。
$ wg genkey | sudo tee /etc/wireguard/private.key $ sudo chmod go= /etc/wireguard/private.key
创建公钥。
$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
创建对等配置文件
要创建对等配置文件,您需要以下内容:
- 在对等端生成的
base64
编码私钥。 - 在 Wireguard 服务器上定义的 IPv4 和 IPv6 地址范围。
- 来自 Wireguard 服务器的
base64
编码公钥。 - Wireguard 服务器的公共 IP 地址和端口号。如果您的服务器和客户端有 IPv6 连接,则需要使用 IPv6 地址。
创建并打开对等配置文件以进行编辑。
$ sudo nano /etc/wireguard/wg0.conf
将以下代码粘贴到其中。
[Interface] PrivateKey = peer_private_key Address = 10.8.0.2/24 Address = fd4d:9c8e:c4bc::2/64 [Peer] PublicKey = JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8= AllowedIPs = 10.8.0.0/24, fd4d:9c8e:c4bc::/64 Endpoint = 209.23.10.202:51820 PersistentKeepalive = 15
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
第一个密钥是在对等方生成的私钥。第一个地址行使用先前选择的子网中的 IPv4 地址。第二个地址行使用先前选择的子网中的 IPv6 地址。
第二个密钥是在服务器上生成的公钥。
AllowedIPs
使用之前选择的 IPv4 和 IPv6 范围,指示对等方仅在目标系统具有任一范围内的 IP 地址时通过 VPN 发送流量。如果仅使用 IPv4 连接,则可以省略 IPv6 地址。配置 Peer 以通过隧道路由所有流量
查找系统用作其默认网关的 IP 地址。运行以下
ip route
命令。$ ip route list table main default
您将获得类似的输出。
default via 69.28.84.1 dev eth0 proto static
记下网关 IP 地址和设备名称。查找对等方的公共 IP。
$ ip -brief address show eth0
您将收到类似的输出。
eth0 UP 69.28.84.160/23 2607:f170:14:13::910/64 fe80::200:45ff:fe1c:54a0/64
打开对等配置文件进行编辑。
$ sudo nano /etc/wireguard/wg0.conf
在
[Peer]
部分之前粘贴以下行。PostUp = ip rule add table 200 from 69.28.84.160 PostUp = ip route add table 200 default via 69.28.84.1 PreDown = ip rule delete table 200 from 69.28.84.160 PreDown = ip route delete table 200 default via 69.28.84.1 [Peer] . . .
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
当 IP 与系统公共 IP 匹配时,
PostUp
命令创建一个规则来检查表 200 中的任何路由条目。PreDown
命令确保由表 200 处理的流量使用203.0.113.1
网关而不是 Wireguard 接口进行路由。配置对等 DNS 解析器
如果
eth0
与您的以太网设备名称不同,请在服务器上运行以下命令。$ resolvectl dns eth0
您将收到类似的输出。
Link 2 (eth0): 209.208.127.65 209.208.25.18 2001:4860:4860::8888 2001:4860:4860::8844
打开对等配置文件。
$ sudo nano /etc/wireguard/wg0.conf
在
[Peer]
行之前添加以下代码。DNS = 209.208.127.65 2001:4860:4860::8888 [Peer] . . .
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
第 8 步 - 将对等公钥添加到 Wireguard 服务器
检查 Wireguard 对等体上的公钥。
$ sudo cat /etc/wireguard/public.key PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
在您的 Wireguard 服务器上运行以下命令。
$ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
要更新现有对等点的
allowed-ips
,请通过更改 IP 地址再次运行上述命令。检查服务器上隧道的状态。
$ sudo wg interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::2/128
第 9 步 - 将对等点连接到隧道
安装
resolvconf
包,以防您通过 VPN 路由所有流量。$ sudo apt install resolvconf
在对等体上启动隧道。
$ sudo wg-quick up wg0
您将收到类似的输出。
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd4d:9c8e:c4bc::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x [#] ip rule add table 200 from 69.28.84.160 [#] ip route add table 200 default via 69.28.84.1
检查对端隧道的状态。
$ sudo wg interface: wg0 public key: nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= private key: (hidden) listening port: 45392 peer: JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8= endpoint: 209.23.10.202:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 23 seconds ago transfer: 92 B received, 212 B sent persistent keepalive: every 15 seconds
这确认了对等点和 VPN 之间的连接。
验证对等方是否正在使用 VPN。
$ ip route get 10.0.8.1 10.0.8.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache
如果您使用的是 IPv6,请改用以下命令。
$ ip -6 route get fd24:609a:6c18::1 fd24:609a:6c18::1 from :: dev wg0 proto kernel src fd24:609a:6c18::2 metric 256 pref medium
使用以下命令断开对等体。
$ sudo wg-quick down wg0 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f
使用以下命令删除服务器上的对等配置。
$ sudo wg set wg0 peer nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= remove
结论
关于在 Ubuntu 22.04 服务器上设置和配置 Wireguard VPN 并将其与客户端连接的教程到此结束。如果您有任何问题,请在下面的评论中发表。