Skip to content

Add xray tun support#9063

Merged
2dust merged 2 commits into
2dust:masterfrom
DHR60:xray_tun
Apr 16, 2026
Merged

Add xray tun support#9063
2dust merged 2 commits into
2dust:masterfrom
DHR60:xray_tun

Conversation

@DHR60
Copy link
Copy Markdown
Contributor

@DHR60 DHR60 commented Apr 9, 2026

No description provided.

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 14, 2026

看了下只支持 windows 的 auto-route,仍需要为其他系统保留 TunProtectSocksPort 等,使用 sing-box 提供 tun 入站;仅为 windows 启用 xray tun

然后我这边测试 autoOutboundsInterface 似乎仍会导致部分流量回环,CPU 占用 100%,需要在 outbound 里指定 sockopt.Interface
可能是 xray 的 bug,这边如果要做的话应该要用 NetworkInterface 和 Socket.Connect 获取一下默认网络接口,网口变动用户可能需要手动重启 tun

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 14, 2026

看了下只支持 windows 的 auto-route,仍需要为其他系统保留 TunProtectSocksPort 等,使用 sing-box 提供 tun 入站;仅为 windows 启用 xray tun

或者这边做个 ip route add 脚本,core 启动完成后 sudo 调用一下

@2dust
Copy link
Copy Markdown
Owner

2dust commented Apr 14, 2026

看了下只支持 windows 的 auto-route,仍需要为其他系统保留 TunProtectSocksPort 等,使用 sing-box 提供 tun 入站;仅为 windows 启用 xray tun

或者这边做个 ip route add 脚本,core 启动完成后 sudo 调用一下

如果通用性,是否脚本更好? 各个系统都能用?

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 14, 2026

如果通用性,是否脚本更好? 各个系统都能用?

三个系统三个脚本吧,如果考虑清理路由表就是六个脚本

问了下 AI 差不多就这样:
1. Windows (CMD/Batch)
保存为 setup_tun.bat。必须右键以管理员身份运行。
该脚本会自动检测 TUN 名称对应的 Interface Index (if),因为 route 命令在处理所有请求导入时,指定索引是最稳健的。

@echo off
setlocal enabledelayedexpansion

set TUN_NAME=%1
if "%TUN_NAME%"=="" (
    echo Usage: setup_tun.bat ^<TunName^>
    exit /b 1
)

echo Searching for Interface Index for: %TUN_NAME%...

:: 获取接口索引
set "IF_INDEX="
for /f "tokens=1" %%i in ('netsh interface ipv4 show interface ^| findstr /C:"%TUN_NAME%"') do (
    set IF_INDEX=%%i
)

if "%IF_INDEX%"=="" (
    echo Error: Could not find interface with name %TUN_NAME%
    exit /b 1
)

echo Found Interface Index: %IF_INDEX%

:: 添加两条半段路由覆盖全局流量
:: 0.0.0.0/1 -> 0.0.0.0 mask 128.0.0.0
:: 128.0.0.0/1 -> 128.0.0.0 mask 128.0.0.0
:: 注意:Windows 的 route add 必须指向一个存在的网关,通常 TUN 自身地址即可
:: 这里使用 'if' 参数强制指定物理接口路径

route add 0.0.0.0 mask 128.0.0.0 0.0.0.0 metric 1 if %IF_INDEX%
route add 128.0.0.0 mask 128.0.0.0 0.0.0.0 metric 1 if %IF_INDEX%

echo Done. To revert, run:
echo route delete 0.0.0.0 mask 128.0.0.0
echo route delete 128.0.0.0 mask 128.0.0.0
pause
2. Linux (Shell)
保存为 setup_tun_linux.sh,执行 sudo sh setup_tun_linux.sh tun0。

#!/bin/sh
TUN_NAME=$1

if [ -z "$TUN_NAME" ]; then
    echo "Usage: sudo sh $0 <TunName>"
    exit 1
fi

# 启用网卡
ip link set "$TUN_NAME" up

# 添加两段路由覆盖全网
ip route add 0.0.0.0/1 dev "$TUN_NAME"
ip route add 128.0.0.0/1 dev "$TUN_NAME"

echo "Routing table updated for $TUN_NAME."
3. macOS (Shell)
保存为 setup_tun_mac.sh,执行 sudo sh setup_tun_mac.sh utun1。

#!/bin/sh
TUN_NAME=$1

if [ -z "$TUN_NAME" ]; then
    echo "Usage: sudo sh $0 <TunName>"
    exit 1
fi

# macOS route 命令直接支持接口名
route -n add -net 0.0.0.0/1 -interface "$TUN_NAME"
route -n add -net 128.0.0.0/1 -interface "$TUN_NAME"

echo "Routing table updated for $TUN_NAME."

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 14, 2026

我的想法,这个 pr 先把 windows 平台支持做了吧,应该只加不减

CoreConfigContext 那边加个默认网口和 TUN Name,然后 CoreConfigContext.IsTunEnabled 指示是否启用当前核心 TUN,CoreConfigContext.AppConfig 的那个 TUN 表示全局状态

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 14, 2026

然后我这边测试 autoOutboundsInterface 似乎仍会导致部分流量回环,CPU 占用 100%,需要在 outbound 里指定 sockopt.Interface; 可能是 xray 的 bug,这边如果要做的话应该要用 NetworkInterface 和 Socket.Connect 获取一下默认网络接口,网口变动用户可能需要手动重启 tun

这个获取默认网口试着做一个吧,不做的话 CPU 占用 100% 感觉确实用不了

@2dust
Copy link
Copy Markdown
Owner

2dust commented Apr 14, 2026

是否等合并 #9004

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 14, 2026

是否等合并 #9004

没,目前这几个 pr 都不相关

后面的 Test 可能需要 #9004

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 14, 2026

这样,把 EnableLegacyProtect 改为 6.31+版本Tunxray tun 的切换开关 如何?
三种模式的条件判断有点头大

然后直接把我的那个链式保护删了,一是 xhttp 的那些链式处理确实有点丑,二是好像确实没有多少这个新模式的正面反馈

@RPRX
Copy link
Copy Markdown
Contributor

RPRX commented Apr 14, 2026

@DHR60 可以在 XTLS/Xray-core#5887 反馈下,或者开个 issue 也行

@2dust
Copy link
Copy Markdown
Owner

2dust commented Apr 15, 2026

这样,把 EnableLegacyProtect 改为 6.31+版本Tunxray tun 的切换开关 如何? 三种模式的条件判断有点头大

然后直接把我的那个链式保护删了,一是 xhttp 的那些链式处理确实有点丑,二是好像确实没有多少这个新模式的正面反馈

EnableLegacyProtect ,你是说改成下拉选择框是吗?
还是说改成 使用 sing-box tun 还是 xray tun 的开关?

@DHR60 DHR60 marked this pull request as ready for review April 15, 2026 04:24
@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

Ready 了,可以合并

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

@DHR60 可以在 XTLS/Xray-core#5887 反馈下,或者开个 issue 也行

懒了,交给用户吧;可能是我这边开发设备有问题

我这边测是 gateway = 172.18.0.1/32, freedom only 都存在这种现象,表现为大量 udp 回环,和 XTLS/Xray-core#5900 (comment) 差不多

freedom 加 sockopt.Interface 就没问题

日志为

2026/04/15 12:24:23.201670 [Info] [1063439333] proxy/tun: processing from udp:172.18.0.1:52643 to udp:117.189.***.***:16918
2026/04/15 12:24:23.202702 [Info] [1063439333] app/dispatcher: taking detour [direct] for [udp:117.189.***.***:16918]
2026/04/15 12:24:23.202702 from udp:172.18.0.1:52643 accepted udp:117.189.***.***:16918 [tun -> direct]
2026/04/15 12:24:23.203228 [Debug] [1063439333] transport/internet: dialing to udp:117.189.***.***:16918
2026/04/15 12:24:23.203228 [Info] [1063439333] proxy/freedom: connection opened to udp:117.189.***.***:16918, local endpoint [::]:52644, remote endpoint 117.189.***.***:16918   

如此重复几万条

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

这样,把 EnableLegacyProtect 改为 6.31+版本Tunxray tun 的切换开关 如何? 三种模式的条件判断有点头大
然后直接把我的那个链式保护删了,一是 xhttp 的那些链式处理确实有点丑,二是好像确实没有多少这个新模式的正面反馈

EnableLegacyProtect ,你是说改成下拉选择框是吗? 还是说改成 使用 sing-box tun 还是 xray tun 的开关?

6.31+版本sing-box Tunxray tun

@DHR60 DHR60 force-pushed the xray_tun branch 2 times, most recently from 3452096 to 6d8f9cf Compare April 15, 2026 04:36
@2dust
Copy link
Copy Markdown
Owner

2dust commented Apr 15, 2026

这样,把 EnableLegacyProtect 改为 6.31+版本Tunxray tun 的切换开关 如何? 三种模式的条件判断有点头大
然后直接把我的那个链式保护删了,一是 xhttp 的那些链式处理确实有点丑,二是好像确实没有多少这个新模式的正面反馈

EnableLegacyProtect ,你是说改成下拉选择框是吗? 还是说改成 使用 sing-box tun 还是 xray tun 的开关?

6.31+版本sing-box Tunxray tun

可行。
先改出来,然后大家用用,根据反馈再处理或反馈给 xray core

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

已经完成了

至于那个 sockopt.Interface,既然已确定是 xray 的 bug,那我们就不管了吧

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

已测试 xray tun 最新代码,没有明显回环问题

hy2 未测试

@RPRX
Copy link
Copy Markdown
Contributor

RPRX commented Apr 15, 2026

@DHR60 建议路由加个 XTLS/Xray-core#5887 (comment) ,让潜在的回环流量走 direct 出站,@Fangliding 文档也标一下吧

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

已添加

xray.exe 还有那两个语法糖都有

@RPRX
Copy link
Copy Markdown
Contributor

RPRX commented Apr 15, 2026

就留个 "self/" 吧,可以 cover 更多使用场景 XTLS/Xray-core#5887 (comment)

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

这个还负责保护第二个 xray 进程的出站来着

比如 xray 自定义配置,v2rayN 提供 TUN 入站;需要再起一个 xray 进程

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

目前生成的配置:

[
  {
    "port": "53",
    "outboundTag": "dns",
    "process": [
      "v2ray.exe",
      "mihomo-windows-amd64-v1.exe",
      // ...
      "overtls.exe",
      "shadowquic.exe",
      "mieru.exe"
    ]
  },
  {
    "outboundTag": "direct",
    "process": [
      "v2ray.exe",
      "xray.exe",
      "mihomo-windows-amd64-v1.exe",
      // ...
      "overtls.exe",
      "shadowquic.exe",
      "mieru.exe",
      "xray/",
      "self/"
    ]
  }
]

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 15, 2026

@2dust

突然想起来个特性,自定义配置 reality + xray tun 可能用不了,因为 xray 默认 destOverride;包括自签证书和 其他核心的 fake sni;
可能 ech 也是,都连不上

这玩意应该也修不了

sing-box 没有 sniff-override-destination,所以差点把这茬忘了

@RPRX
Copy link
Copy Markdown
Contributor

RPRX commented Apr 15, 2026

destOverride 在 v2rayN 中默认是开的?一般来说 REALITY、自签证书等 fake sni,address 填的大多是 IP,可以用 Xray 刚加的 ipsExcluded XTLS/Xray-core#5929

@RPRX
Copy link
Copy Markdown
Contributor

RPRX commented Apr 15, 2026

sing-tun->ss->xray 的话需要加个参数 XTLS/Xray-docs-next@44dda97

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 16, 2026

@2dust

xray 的 FakeDNS 就先不考虑了吧;目前 v2rayN 现有的是“全局 FakeIP + 少量白名单 RealIP”,这种 xray 实现不了

虽然能切换为“代理 FakeIP + 直连 RealIP”,但是 steam 下载什么的会有问题

@DHR60
Copy link
Copy Markdown
Contributor Author

DHR60 commented Apr 16, 2026

还有这个 issue #8977 使命完成了,可以 unpin 了

@2dust
Copy link
Copy Markdown
Owner

2dust commented Apr 16, 2026

@2dust

xray 的 FakeDNS 就先不考虑了吧;目前 v2rayN 现有的是“全局 FakeIP + 少量白名单 RealIP”,这种 xray 实现不了

虽然能切换为“代理 FakeIP + 直连 RealIP”,但是 steam 下载什么的会有问题

明白。实现不了的就放弃。
准备下一版本合并,毕竟 xray 那边也没有发正式版。

@2dust 2dust merged commit 494b35c into 2dust:master Apr 16, 2026
@debugzxcv
Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants