184 lines
3.8 KiB
Markdown
184 lines
3.8 KiB
Markdown
<span style="color:#34c759">**Xray: IPv6 中转、IPv4 出口配置攻略**</span>
|
||
|
||
## 目标链路
|
||
~~~
|
||
客户端
|
||
↓ IPv6
|
||
节点 A(VLESS 入站)
|
||
↓ IPv6
|
||
节点 B(Shadowsocks 入站)
|
||
↓ IPv4
|
||
Internet
|
||
~~~
|
||
## 一、节点 B:创建 Shadowsocks 入站
|
||
在节点 B 创建一个独立的 Shadowsocks 入站,例如:
|
||
~~~
|
||
入站标签: ss-in-from-a
|
||
监听地址:任意地址
|
||
端口:自定义
|
||
加密方式:双方保持一致
|
||
密码:双方保持一致
|
||
网络: TCP/UDP
|
||
~~~
|
||
确认该端口正在监听 IPv6:
|
||
~~~
|
||
ss -6 -lntup | grep '<SS端口>'
|
||
~~~
|
||
## 二、节点 B:创建 IPv4 出站
|
||
|
||
创建一个 Freedom 出站:
|
||
|
||
```
|
||
{
|
||
"tag": "direct-v4",
|
||
"protocol": "freedom",
|
||
"sendThrough": "<节点B的IPv4地址>",
|
||
"settings": {
|
||
"domainStrategy": "UseIPv4"
|
||
},
|
||
"streamSettings": {
|
||
"sockopt": {
|
||
"domainStrategy": "ForceIPv4"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
其中:
|
||
|
||
- `sendThrough` 填写节点 B 本机的公网 IPv4。
|
||
- `UseIPv4` 和 `ForceIPv4` 用于优先或强制解析 IPv4。
|
||
- 不会影响节点 B 上的其他入站和用户。
|
||
## 三、节点 B:添加路由规则
|
||
|
||
将来自节点 A 的 SS 入站转发到 IPv4 出站:
|
||
|
||
```
|
||
{
|
||
"type": "field",
|
||
"inboundTag": [
|
||
"ss-in-from-a"
|
||
],
|
||
"outboundTag": "direct-v4"
|
||
}
|
||
```
|
||
|
||
>
|
||
> 该规则应放在默认直连或兜底规则之前。
|
||
|
||
## 四、节点 A:创建 Shadowsocks 出站
|
||
|
||
地址填写节点 B 的 IPv6:
|
||
|
||
```
|
||
{
|
||
"tag": "to-node-b-v6",
|
||
"protocol": "shadowsocks",
|
||
"settings": {
|
||
"servers": [
|
||
{
|
||
"address": "<节点B的IPv6地址>",
|
||
"port": "<SS端口>",
|
||
"method": "<加密方式>",
|
||
"password": "<SS密码>"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
注意:
|
||
|
||
- JSON 中的 IPv6 地址不需要添加方括号。
|
||
- 加密方式、端口和密码必须与节点 B 完全一致。
|
||
- 建议为该链路使用独立的 SS 入站端口。
|
||
|
||
## 五、节点 A:创建独立 VLESS 入站
|
||
|
||
建议为这条链路创建一个独立 VLESS 入站,例如:
|
||
|
||
```
|
||
入站标签: vless-in-chain
|
||
监听地址: 任意地址
|
||
端口: 自定义
|
||
传输方式: 根据实际需要设置
|
||
```
|
||
|
||
>
|
||
> 客户端使用节点 A 的 IPv6 地址或 AAAA 域名连接。
|
||
|
||
## 六、节点 A:添加路由规则
|
||
|
||
将指定 VLESS 入站流量发送到节点 B:
|
||
|
||
```
|
||
{
|
||
"type": "field",
|
||
"inboundTag": [
|
||
"vless-in-chain"
|
||
],
|
||
"outboundTag": "to-node-b-v6"
|
||
}
|
||
```
|
||
|
||
>
|
||
> 使用 `inboundTag` 通常比按端口匹配更清晰,也不容易误伤其他入站。
|
||
|
||
## 七、重启服务
|
||
|
||
两台服务器保存配置后重启 x-ui:
|
||
|
||
```
|
||
x-ui restart
|
||
```
|
||
|
||
然后确认 Xray 正常运行:
|
||
|
||
```
|
||
systemctl status x-ui --no-pager
|
||
```
|
||
|
||
## 八、验证 A 到 B 是否走 IPv6
|
||
|
||
在节点 A 执行:
|
||
|
||
```
|
||
tcpdump -ni eth0 \
|
||
'ip6 and host <节点B的IPv6地址> and port <SS端口>'
|
||
```
|
||
|
||
使用客户端连接并产生流量。如果看到:
|
||
|
||
```
|
||
节点A的IPv6地址 → 节点B的IPv6地址
|
||
```
|
||
|
||
以及双向 TCP 数据包,说明 A 到 B 确实通过 IPv6 通信。
|
||
|
||
## 九、验证最终出口是否为 IPv4
|
||
|
||
通过代理访问 IPv4 地址检测服务:
|
||
|
||
```
|
||
https://api.ipify.org
|
||
```
|
||
|
||
>
|
||
> 如果显示节点 B 的公网 IPv4,说明配置成功。
|
||
|
||
最终链路应为:
|
||
|
||
```
|
||
客户端 → 节点A: IPv6
|
||
节点A → 节点B: IPv6
|
||
节点B → Internet: IPv4
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. JSON 配置应填写到 x-ui 的「出站」或「路由」编辑器中,不要直接粘贴到 Shell。
|
||
2. 路由规则应放在默认直连、默认代理或兜底规则之前。
|
||
3. 如果 x-ui 会自动删除出站中的 `targetStrategy`,可以在节点 B 使用 `Freedom + sendThrough + sockopt.domainStrategy` 实现 IPv4 出口。
|
||
4. 如果目标已经是 IPv6 地址,Xray 无法自动将它转换为对应的 IPv4。
|
||
5. 严格要求 IPv4 出口时,应让域名在节点 B 解析,并避免客户端提前将域名解析成 IPv6 地址。
|
||
6. 发布教程时不要公开真实密码、UUID、Reality 私钥或其他认证信息。 |