在网上搜索 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
这将在每台计算机上生成两个文件privatekey
和publickey
。publickey
文件用于告诉全世界,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.1
和192.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.x
,AllowedIPs
更改为如下所示:
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 不支持它,但请随时告诉我应该添加什么,以便我修改文章。
与往常一样,tweet 或 toot 任何意见给我,或者在下面发表评论。
谢谢!