# IPv6 RA Override

在 Surge Mac v6 中，新增了 IPv6 RA Override 功能，用于接管其他设备的 IPv6 网络。该功能为 Surge 首创，因此互联网上几乎不存在该方案的技术资料，因此创建了该文档以解释功能细节，方便使用者排错。

### 核心原理

在 IPv6 网络中，RA 广播是网络的基石之一，一般情况下，路由器通过发送 RA 广播完成三件事：

1. 提供 IPv6 地址前缀，让其他设备可以生成自己的公网 IPv6 地址（GUA 地址）。
2. 宣告自己的 link-local 地址为默认路由。
3. 配置客户端的 IPv6 DNS。

RA 消息的设计中，存在优先级的机制，因此可以通过高优先级的 RA 消息，覆盖中和低优先级的消息。这是 Surge IPv6 RA Override 的核心工作原理，一个不太一样的地方是，RA 消息通常是进行广播，而 Surge 的 RA 是单播，只影响需要被接管的设备。

同时，Surge 的 RA 不包含地址前缀信息，所以地址分配依然依赖原路由的 RA 广播，Surge 的高优先级广播只进行路由和 DNS 覆盖。因此原路由的 RA 广播一定不可关闭，否则无法完成 IPv6 地址分配，只需要保证优先级设置不为高即可。

### IPv6 RA DNS

如果原路由的 RA 配置了 IPv6 DNS，且该地址为 link-local 地址，或路由器自身的 IPv6 地址。则会因为路由优先级问题导致 DNS 包无法被 Surge 劫持，fake IP 机制无法生效。

Surge 的 RA 包会广播自己的 v6 DNS 地址 `fd00:6152::2`，但是不同操作系统对高优先级 RA DNS 的处理方式不同，有些系统是覆盖原有设置，有些只是单纯追加。因此 Surge 会提示建议修改原广播的 DNS 地址为空或任意公网地址，以避免无法覆盖时的情况。

不过，即使 DNS 覆盖失败，也只是 fake IP 机制失效，仍然可以接管请求，域名类规则也可以靠 SNI 嗅探完成。

### 稳定性

在 v4 DHCP 模式下，由于 Surge 是完全取代了原有的 DHCP 服务，所以可以确保接管一定成功，否则客户端根本无法连接网络。

但是在 v6 RA 覆盖模式下，由于覆盖行为与原有 RA 相互独立，所以如果存在网络波动，导致 Surge的 RA 覆盖消息丢包，则可能出现客户端设备未能被覆盖的情况，此时客户端设备的 IPv6 将会是直接连接。

但是这种情况即使发生，一般也只出现于刚接入网络的时候，一旦接入后，Surge 会定期不断发送 RA 覆盖消息，且周期远高于 RA 消息的有效期，所以很少会出现失效的情况。

### 兼容性问题

在我们的测试中，绝大多数设备对 Surge 的 RA 覆盖表现良好，在少数情况下可能会有兼容性问题：

#### Sony PS5

PS5 的 IPv6 协议栈不完善，无法正确处理高优先级 IPv6 RA 消息，因此无法接管。

#### Windows

部分 Windows 设备，可能在一段时间后，出现接管失效的问题，事件查看器中出现警告：`TCPIP - Event 4205 - Autoconfigured route limit has been reached. No further autoconfigured routes will be added until the interface is reconnected.`。

发现只有部分设备在低概率下出现该问题，我们还在分析与测试出现该问题的真正原因，由于 Windows 闭源且未提供相关文档，因此比较困难，也可能就是 Windows 的 Bug。

以上问题，都可以通过手动修改设备的 IPv6 配置解决，即不再依赖 RA，直接配置 IPv6 地址、网关和 DNS。

* IPv6 地址：保证与原自动分配的地址一致即可。但是如果你的 IPv6 前缀可能会变化，则变化后需要重新配置。
* 网关地址：可在 Surge 总览页面查看 Surge VM 的 IPv6 地址，填入该地址。
* DNS：`fd00:6152::2`

手动配置后即可保证稳定的完全接管。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kb.nssurge.com/surge-knowledge-base/zh/technotes/ipv6-ra.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
