如何在 FreeBSD 上设置一个简单且实际工作的 WireGuard 服务器

在我努力使 WireGuard 正常运行的过程中,我碰到了许多指南和教程。但它们都缺少关键信息,或者依赖于过时的信息。通常只是微妙的指示出现了问题。当与其他潜在故障点一起出现时,这很快就会变成一个令人沮丧的打地鼠游戏,让人走入很多死胡同。

话虽如此,以下是一个最小化的设置,截止到今天,在运行 FreeBSD 13.2 的具有单个以太网连接的树莓派 3 上有效。

首先,安装所需的软件:

pkg install wireguard wireguard-tools libqrencode

开启 Wireguard 服务:

service wireguard enable
sysrc wireguard_interfaces="wg0"

启用 IP 转发并立即激活:

sysrc gateway_enable=YES
sysctl -w net.inet.ip.forwarding=1

设置防火墙和日志记录:

service pf enable
service pflog enable
# /etc/pf.conf

ext_if="ue0"
wg_net="10.10.10.0/24"
scrub in all
nat on $ext_if from $wg_net to any -> ($ext_if)
pass log all

接下来生成服务器密钥:

你还需要客户端密钥。这个示例假设使用 iPhone 作为名称,但对于任何客户端,流程都是相同的:

创建服务器配置:

创建客户端配置:

对于额外的客户端,使用不同的文件名重复密钥生成。然后在服务器配置中添加另一个 [Peer] 部分,其中包含唯一的 IP 和客户端密钥内容。还要创建相应的客户端配置。在更改了服务器配置之后重新启动 WireGuard。

为了方便传输到 iPhone,在 WireGuard 应用程序中生成一个二维码,并通过摄像头导入:

开启 Wireguard 服务:


现在,你应该能够成功地使用 iPhone 进行连接,并且能够访问你的内部网络以及互联网了。

几点注意事项:

  • 在家中进行此操作时,请不要忘记在路由器中设置端口转发。WireGuard 专门使用 UDP。

  • 可以使用本地 DNS 服务器,比如 Adguard Home。我就是这么做的。这样你就可以在任何地方实现全面的广告拦截。

  • 如果遇到问题,首先重新启动机器。如果问题仍然存在,请使用 tcpdump -n -e -i pflog0 检查连接日志。

  • 在几乎所有连接无法工作的情况下,要么你忘记设置 IP 转发,要么有其他干扰的防火墙规则,要么 NAT 规则错误。

  • 我发现握手可靠性不稳定。你可能需要多次停止和启动客户端连接才能使其正常工作。

最后更新于

这有帮助吗?