我为什么需要 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 genkey 和 wg 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.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 地址范围中的地址块。该范围最多支持 255 个不同的对等节点连接,通常不会与其他私有 IP 地址范围产生重叠或冲突。如果这个示例范围与你的网络不兼容,可以根据你的网络配置选择一个合适的地址范围。 我选择使用10.8.0.1/24作为 WireGuard 服务器的私有隧道 IPv4 地址,但也可以使用10.8.0.1至10.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(网络地址转换)的规则。
PostUp和PostDown命令用于配置服务器的防火墙规则、转发流量以及设置 NAT。这些命令允许服务器在内部网络和公共互联网之间路由流量。SaveConfig选项设置为true,以确保服务器配置保存到磁盘中。建议启用此选项,以防止服务器重启或关机时丢失数据。 请注意,你需要将<在此处填入你的服务器私钥>和<填入你自己的 IPv6 地址>分别替换为你自己的私钥和 IPv6 地址。 未完待续……