【译文】如何轻松配置 WireGuard

【译文】如何轻松配置 WireGuard

在网上搜索 WireGuard 时机缘巧合发现的一篇非常不错的教程,之所以说机缘巧合,是先在知乎专栏发现了一篇机翻的文章,虽然机翻质量很差,但浏览发现确实是我需要的资料,遂找到原文翻译,光荣属于原作者 Stavros Korokithakis,glory belongs to Stavros Korokithakis :)。原文链接 How to easily configure WireGuard 以下是译文。

WireGuard非常棒!

最近你可能注意到了网络上关于 WireGuard 的口碑谈论。WireGuard 是一个非常简单的VPN,它使用最先进的密码技术。其口碑既来自于 WireGuard 本身的简单好用,也来自它将默认包含于 Linux 内核。Linus Torvalds 本人说他很喜欢 WireGuard,这在软件社区风靡一时,因为我们并不知道 Linus 居然能够表达爱或者除了憎恶之外的任何情感。

我在 WireGuard 使用中遇到的唯一问题是缺少文档,更准确地说是缺少预期的文档。快速入门指南提到了一个配置文件,但它从未告诉你应该如何编写这个配置文件,而且它还假设你比我更熟悉网络知识。

因为宇宙形成的初始条件决定了一切,所以 WireGuard 的文档终将不足,我将违背造物主向你展示如何轻松配置和运行它。我们开始吧!

简短概述 #

![[Pasted image 20241118205757.png]] 一个看起来有点结实的守卫,确保你不会下意识地觉得这个帖子干燥无聊。

WireGuard 的核心是创建从一台计算机到另一台计算机的接口。它实际上不能让你访问网络任何一端的其他计算机或通过 VPN 服务器转发所有流量,或类似的任何内容。它只是直接、快速且安全地连接两台计算机。

要做除此之外的任何事情,你需要为它配置网络,而这并不再 WireGuard 文档的范围内,但就 VPN 来说这很重要。幸运的是,WireGuard 附带了一个帮助脚本wg-quick,几乎可以满足普通用户的所有需求。注意 wg-quick的配置文件与wg可执行文件不兼容,但我们只需要wg-quick,所以不用担心这个。

让我们开始设置一切。

安装和设置 #

要安装 WireGuard,请参阅安装页面,它应该非常简单。安装后,你需要为访问 VPN 的每台计算机生成一个私钥和一个公钥。由于 WireGuard 的设计,一个链接两端的计算机都需要拥有对方的公钥。

让我们生成这些密钥。在位于 VPN 中的每台计算机上,创建目录 /etc/wireguard/,并在每台计算机上刚刚创建的目录中,执行这些命令:

$ umask 077  # This makes sure credentials don't leak in a race condition.
$ wg genkey | tee privatekey | wg pubkey> publickey

这将在每台计算机上生成两个文件privatekeypublickeypublickey文件用于告诉全世界,privatekey文件是秘密的,应该保留在生成它的计算机上。

如果你的 VPN 服务器位于 NAT 后面,你还需要打开你选择的 UDP 端口(默认为51820)。为要连接到的任何一台计算机执行这个操作(据我所知用来连接的电脑不需要打开端口,如果我错了请纠正)。

常见情景 #

完成上述操作后,你就可以配置 WireGuard 了。在每台计算机上,转到/etc/wireguard/路径,并创建名为wg0.conf的文件。我们将讨论一些常见的场景以及每个场景的配置。

只需一个连接 #

如果你只想在两台计算机之间建立单个连接(例如将笔记本电脑连接到家庭服务器),配置则非常简单。在服务器上,wg0.conf输入以下内容:

[Interface]
Address = 192.168.2.1
PrivateKey = <server's privatekey>
ListenPort = 51820

[Peer]
PublicKey = <client's publickey>
AllowedIPs = 192.168.2.2/32

这就是服务器所需要的一切。请记住,<server's privatekey>是你的家庭服务器的privatekey文件内容(不是文件路径,而是实际内容,长行的乱码),类似地,<client's publickey>是笔记本电脑的publickey文件的内容。

对于客户端,配置如下:

[Interface]
Address = 192.168.2.2
PrivateKey = <client's privatekey>
ListenPort = 21841

[Peer]
PublicKey = <server's publickey>
Endpoint = <server's ip>:51820
AllowedIPs = 192.168.2.1/24

# This is for if you're behind a NAT and
# want the connection to be kept alive.
PersistentKeepalive = 25

同样,用你生成的相应字符串替换密钥。

如你所见,我为两台计算机选择的地址是192.168.2.1192.168.2.2,因为该子网在我的环境中是可用的。如果任一计算机上有该子网的接口,则应换一个以避免冲突,例如192.168.3.x

写完这两个文件后,先在服务器上运行wg-quick up wg0,然后在客户端上运行。如果你在配置中正确地输入了服务器的 IP 并配置了端口,则现在两台计算机已经连接成功,你应该能够从 VPN 客户端ping 192.168.2.1并看到响应。运行wg-quick down wg0以关闭连接。

重申,此设置只允许你从客户端访问服务器的接口,它不会通过服务器转发任何流量,也不允许你访问服务器 LAN 上的任何其他计算机。

访问你的家庭局域网 #

要访问服务器的 LAN,你需要对配置稍作修改。在服务器的配置文件中,在[Interface]部分的末尾添加以下两行:

PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

这假设你的 LAN 接口名为eth0。如果不是,请在上面两行中更改为实际名称。

在客户端上,在AllowedIPs下添加 LAN 的子网。例如,如果你的子网是192.168.1.xAllowedIPs更改为如下所示:

AllowedIPs = 192.168.2.1/24, 192.168.1.1/24

简而言之,AllowedIPs设置在发送时充当路由表,在接收时充当 ACL。当节点尝试向 IP 发送数据包时,它将检查AllowedIPs,如果IP出现在列表中,它将通过WireGuard接口发送。当它通过接口接收数据包时,它将再次检查AllowedIPs,如果数据包的源地址不在列表中,它将被丢弃。

你可能需要在服务器上启用 IP 转发才能正常工作,但这对 Linux 来说很简单。这是一个很好的指南 。如果你正在运行 OS X 或 Windows 服务器,那么你不值得拥有美好的东西。

然后如上所述运行wg-quick up wg0,你应该能够从客户端 ping 局域网中的其他计算机,就好像你在家一样。尝试ping 192.168.1.1或 LAN 中的任何其他计算机进行验证。

请注意,这不会通过你的服务器转发任何其他流量,因此它不会代理你的网页浏览或类似的访问。它只会让你与服务器 LAN 上的其他计算机进行通信。

若要使用流量转发,参见下文。

转发你的所有流量 #

如果你想通过 VPN 转发所有流量,WireGuard 也可以轻松实现。请记住,如果你这样做是为了避免 ISP 跟踪,它将无法对你的服务器的 ISP 起作用。你的所有流量都看起来就像它来自你的服务器,但是如果是在你家里,你所有种子和色情下载看起来就像会它来自服务器,即使你在柬埔寨的网吧。

要转发所有流量,只需将客户端上的AllowedIPs行更改为:

AllowedIPs = 0.0.0.0/0, ::/0

这是整个客户端配置:

[Interface]
Address = 192.168.2.2
PrivateKey = <client's privatekey>
ListenPort = 21841

[Peer]
PublicKey = <server's publickey>
Endpoint = <server's ip>:51820
AllowedIPs = 0.0.0.0/0, ::/0

这将使wg0接口负责路由所有 IP 地址(因此为0.0.0.0/0 ),并将所有流量路由到你的服务器上。你可以通过加载我的 IP 网站之一来检查你的服务器的 IP 是否被检测到。

在启动时保护并运行 #

完成后,运行以下命令使目录和文件只能由管理员读取(它确实包含密钥):

$ sudo chown -R root:root /etc/wireguard/
$ sudo chmod -R og-rwx /etc/wireguard/*

创建并保护文件后,如果操作系统使用systemd,则可以轻松设置 WireGuard 以在启动时初始化 VPN:

$ sudo systemctl enable `wg-quick`@wg0.service

同样,要启动或停止服务:

$ sudo systemctl start `wg-quick`@wg0.service
$ sudo systemctl stop `wg-quick`@wg0.service

结语 #

我希望这有用!在我花了三个小时配置 WireGuard 之前,这是我希望存在的指南,希望你可以复制配置并让它立即运行。

如果你需要配置 IPv6,我想你将不得不自己试验,因为我的 ISP 不支持它,但请随时告诉我应该添加什么,以便我修改文章。

与往常一样,tweettoot 任何意见给我,或者在下面发表评论。

谢谢!