你好世界!

发布于
2026年8月1日
更新于
2026年8月2日
阅读进度
5 分钟
标签
example
Read the English version

我为什么需要 WireGuard

在获得我的 ASN 和自己的 IPv6 地址段后,我希望使用自己的 IP 地址访问互联网。然而,普通的家庭宽带无法提供 BGP 会话。此外,我的 ISP Vocus Retail 甚至不提供 IPv6 地址(但他们提供静态 IPv4 地址,这已经比中国大陆好得多了)。因此,我需要部署一个 IPv6 over IPv4 隧道,让我的家庭宽带能够使用自己的 IPv6 地址访问公共互联网。 在比较了各种 L2 和 L3 协议后,我决定使用 WireGuard 来建立 IPv6 over IPv4 隧道。WireGuard 是一种轻量级 VPN,通过公钥和私钥加密连接。当你连接到酒店或咖啡店等不受信任的网络时,它可以让你通过智能手机或笔记本电脑安全地访问互联网。WireGuard 的加密方式简单,并且与对等节点兼容。OpenVPN 和 IPSec 等其他 VPN 软件使用 TLS 和证书,配置起来更加复杂,也更耗时。

设置服务器

请注意,以下内容假设你已经完成了上一篇博客文章中的前置设置。如果你还没有完成,请参阅上一篇博客文章。 拥有自己的 ASN - xxxbrian's blog 安装并生成密钥对 要在服务器上安装 WireGuard,第一步是更新 WireGuard 服务器的软件包索引。可以使用以下命令完成:


apt-get update

apt-get install wireguard

安装 WireGuard 后,下一步是为服务器生成私钥和公钥。你可以使用内置的 wg genkeywg pubkey 命令完成此操作。生成密钥后,你需要将私钥添加到 WireGuard 的配置文件中。


wg genkey | tee etc/wireguard/server_private_key | wg pubkey | tee etc/wireguard/server_public_key

WireGuard 服务器配置 在创建 WireGuard 服务器的配置之前,你需要为隧道准备一个内部 IPv4 地址和一个内部 IPv6 地址。 a) 选择 IPv4 地址范围。 你可以从以下保留地址块中选择任意 IP 地址范围(有关这些地址块如何分配的更多信息,请参阅 RFC 1918 规范):

  • 10.0.0.010.255.255.255(10/8 前缀)
  • 172.16.0.0172.31.255.255(172.16/12 前缀)
  • 192.168.0.0192.168.255.255(192.168/16 前缀) 在这篇博客文章中,我使用 10.8.0.0/24 作为第一个保留 IP 地址范围中的地址块。该范围最多支持 255 个不同的对等节点连接,通常不会与其他私有 IP 地址范围产生重叠或冲突。如果这个示例范围与你的网络不兼容,可以根据你的网络配置选择一个合适的地址范围。 我选择使用 10.8.0.1/24 作为 WireGuard 服务器的私有隧道 IPv4 地址,但也可以使用 10.8.0.110.8.0.255 范围内的任意地址。如果你选择了不同的 IP 地址,请务必记录下来。 b**) 选择 IPv6 地址范围。 如果你在 WireGuard 中使用 IPv6,则需要根据 RFC 4193 中的算法生成一个唯一的本地 IPv6 单播地址前缀。该前缀将与虚拟隧道接口关联。要在保留的私有 IPv6 地址块 fd00::/8 内生成一个随机且唯一的 IPv6 前缀,请完成以下步骤。 首先,使用 date 工具通过以下命令获取一个 64 位时间戳:

date +%s%N

1628101352127592197

记录输出结果。该数字表示自 1970-01-01 00:00:00 UTC 以来的秒数(%s)和纳秒数(%N)的组合。 接下来,从 /var/lib/dbus/machine-id 文件中复制服务器的 machine-id 值。该标识符对你的系统而言是唯一的,只要服务器存在,通常就不会发生变化。运行以下命令获取它:


cat var/lib/dbus/machine-id

20086c25853947c7aeee2ca1ea849d7d

现在,将时间戳与 machine-id 组合起来,并使用 SHA-1 算法对结果值进行哈希处理。使用以下命令格式:


printf<timestamp><machine-id> | sha1sum

printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum

哈希输出将采用十六进制格式。由于 RFC 中的算法只需要哈希输出中最低有效的(末尾)40 位,即 5 个字节,因此使用 cut 命令仅打印哈希值中最后 5 个十六进制编码的字节:


printf [sha1sum output] | cut -c 31-

printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc | cut -c 31-

0d86fac3bc

输出结果将是哈希值中最后 5 个十六进制编码的字节,例如 0d 86 fa c3 bc。 现在,你可以通过将生成的 5 个字节与 fd 前缀拼接来构造唯一的 IPv6 网络前缀,并在每 2 个字节之间使用冒号 : 分隔,以提高可读性。由于你的唯一前缀中的每个子网总共可以容纳 18,446,744,073,709,551,616 个可能的 IPv6 地址,因此为了简单起见,可以将子网限制为标准的 /64 大小。使用之前生成的字节和 /64 子网大小,最终得到的前缀如下:


fd0d:86fa:c3bc::/64

这个前缀将用于为服务器和对等节点上的 WireGuard 隧道接口分配单独的 IP 地址。要为服务器分配 IP 地址,请在最后的 :: 后添加 1。最终地址将是 fd0d:86fa:c3bc::1/64。对等节点可以使用该范围内的任意 IP 地址,但通常每添加一个对等节点,就将数值递增 1。例如,fd0d:86fa:c3bc::2/64。 c) 创建服务器配置文件 使用以下内容创建服务器配置文件 /etc/wireguard/wg0.conf


[Interface]

PrivateKey = <在此处填入你的服务器私钥>

Address = 10.8.0.1/24 更改为之前设置的内部 IPv4 地址

Address = fd0d:86fa:c3bc::1/64 更改为之前设置的内部 IPv6 地址

ListenPort = 51820

SaveConfig = true

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

PostUp = ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -A FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -j SNAT --to-source [<填入你自己的 IPv6 地址>]

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

PostDown = ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -D FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -j SNAT --to-source [<填入你自己的 IPv6 地址>]

配置文件包含以下信息:

  • 服务器的私钥。
  • 隧道的内部 IPv4 和 IPv6 地址。
  • 服务器监听传入连接的端口。
  • 用于转发流量以及为 IPv4 和 IPv6 流量设置 NAT(网络地址转换)的规则。 PostUpPostDown 命令用于配置服务器的防火墙规则、转发流量以及设置 NAT。这些命令允许服务器在内部网络和公共互联网之间路由流量。 SaveConfig 选项设置为 true,以确保服务器配置保存到磁盘中。建议启用此选项,以防止服务器重启或关机时丢失数据。 请注意,你需要将 <在此处填入你的服务器私钥><填入你自己的 IPv6 地址> 分别替换为你自己的私钥和 IPv6 地址。 未完待续……

Bojin Li

写软件、系统,以及那些还没定型的部分。