WireGuard 配置 Global IPv6 (公网下放)

众所周知,IPv6 和 IPv4 不同,IPv6 的地址池更加丰富,也摒弃了 IPv4 中目前常见的 NAT 做法(虽然有 NAT6 的存在,但这终究是一种不受推荐的选择)。对于如果 WireGuard 中的一个 Peer 存在 IPv6 前缀(即 IP 地址不是/128),该设备就可以作为 Server,将前缀下的一部分地址分配给 VPN 中的其他设备的。
本文以 WireGuard 为例进行展示,IP地址均为静态指定,不涉及 DHCPv6。
首先给出网络拓扑图:

1. 更改 Linux 配置,开启 IPv6 转发
修改 /etc/sysctl.conf 或创建 /etc/sysctl.d/wireguard.conf 文件(文件名随意),更改后添加下面参数,启用对应的功能。
net.ipv4.ip_forward=1 # IPv4 的网络转发设置
net.ipv6.conf.all.forwarding=1 # IPv6 的网络转发设置
# net.ipv6.conf.default.forwarding=1 # IPv6 的网络转发设置(后续新建接口)
net.ipv6.conf.eth0.proxy_ndp=1 # 启用 NDP(Neighbor Discovery Protocol)协议,让主机作为代理响应 NDP 请求。
之后通过 sysctl -p 或重启使设置生效。
2. 添加 neighbor 对象
执行下面的命令,给客户机的 IPv6 地址设置 NDP 代理:
ip -6 neigh add proxy 2408:****:6666::2 dev eth0
删除时将 add 参数修改为 del 即可。
PostUp/PostDown 设置为VPN 启动/停止时自动配置,也可设置独立的开机自启项。3. 重新启动网络
执行命令 systemctl restart systemd-networkd 重启网络,使 NDP Proxy 生效。
4. 配置防火墙
这里我的以太网出口是 eth0 ,WireGuard 的配置文件为 wg0 。
请根据个人情况对命令进行修改。
4.1 ufw
允许网内流量转发:ufw route allow in on wg0
允许来自公网的流量进入:ufw route allow in on eth0 out on wg0
4.2 iptables
iptables 默认 FORWARD 规则为 ACCEPT,未修改情况下可不作设置。允许网内流量转发:ip6tables -A FORWARD -i wg0 -j ACCEPT;
允许来自公网的流量进入:ip6tables -A FORWARD -i eth0 -o wg0 -j ACCEPT;
如果不生效,可以调整下规则顺序,把 -A FORWARD 改为 -I FORWARD 1 。
5. 更改Server(Pi)上的配置文件
[Interface]
PrivateKey = :) # 记得改成自己的
ListenPort = 8501
Address = 192.168.7.1/32, 2408:****:6666::1/128
[peer]
publickey = :) # 记得改成自己的
allowedips = 192.168.7.2/32, 2408:****:6666::2/128
我们这里给 Server 配置一个本网段的地址(.1),同时给客户端地址(.2),这边给出了最简单的配置文件,可根据个人需要进行修改。
6. 配置 Client 上的配置文件
[Interface]
PrivateKey = :) # 记得改成自己的
Address = 192.168.7.2/32, 2408:****:6666::2/128
DNS = 240c::6666, 223.5.5.5 # 根据需要设置
[Peer]
PublicKey = :) # 记得改成自己的
AllowedIPs = 192.168.7.0/24, ::/0
Endpoint = :) # Server 地址, IPv4/IPv6 均可,改成自己的。
这边给出了最简单的配置文件,可根据个人需要进行修改。
::/0 可能存在一个问题,就是它也包括了所有的 IPv4 流量。如果不需要 IPv4 的流量进入 VPN 网络,可拆分成两个网段(::/1, 8000::/1)的写法,避免生成高优先级的默认路由。7. 效果展示





