# WireGuard 配置 Global IPv6 （公网下放）

众所周知，IPv6 和 IPv4 不同，IPv6 的地址池更加丰富，也摒弃了 IPv4 中目前常见的 NAT 做法（虽然有 NAT6 的存在，但这终究是一种不受推荐的选择）。对于如果 WireGuard 中的一个 Peer 存在 IPv6 前缀（即 IP 地址不是`/128`），该设备就可以作为 Server，将前缀下的一部分地址分配给 VPN 中的其他设备的。

本文以 WireGuard 为例进行展示，IP地址均为静态指定，不涉及 DHCPv6。

首先给出网络拓扑图：

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1692003171848/1e5e8b76-14af-40cf-91d5-fab19e1a0ecd.png align="center")

# 1\. 更改 Linux 配置，开启 IPv6 转发

修改 `/etc/sysctl.conf` 或创建 `/etc/sysctl.d/wireguard.conf` 文件（文件名随意），更改后添加下面参数，启用对应的功能。

```bash
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` 即可。

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">注：该命令重启后失效。推荐使用 <code>PostUp/PostDown</code> 设置为VPN 启动/停止时自动配置，也可设置独立的开机自启项。</div>
</div>

# 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

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text"><code>iptables</code> 默认 <code>FORWARD</code> 规则为 <code>ACCEPT</code>，未修改情况下可不作设置。</div>
</div>

允许网内流量转发：`ip6tables -A FORWARD -i wg0 -j ACCEPT;`

允许来自公网的流量进入：`ip6tables -A FORWARD -i eth0 -o wg0 -j ACCEPT;`

如果不生效，可以调整下规则顺序，把 `-A FORWARD` 改为 `-I FORWARD 1` 。

# 5\. 更改Server（Pi）上的配置文件

```bash
[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 上的配置文件

```bash
[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 均可，改成自己的。
```

这边给出了最简单的配置文件，可根据个人需要进行修改。

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">注：<code>::/0</code> 可能存在一个问题，就是它也包括了所有的 IPv4 流量。如果不需要 IPv4 的流量进入 VPN 网络，可拆分成两个网段（<code>::/1, 8000::/1</code>）的写法，避免生成高优先级的默认路由。</div>
</div>

# 7\. 效果展示

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1692007729498/01205bef-548c-43c6-90ef-4199114b4ddb.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1692007734249/a10bc83a-e93f-4465-a594-c98a467eb1c2.png align="center")
