(此次更新较为重大呀。
TUN入站
于Xray-core的26.1.23版本中,@Owersun为Xray-core于Windows、MacOS、Linux和Android平台增加了TUN入站,以便网络游戏以及其它不遵循系统代理的应用 能够使用Xray-core代理。
TUN
基本上,“TUN”是1个由应用创建的虚拟网络设备(可被理解为“虚拟网卡”),它将所有经过此“设备”的数据发送至创建此设备的应用。从网络层级架构而言,它为应用提供了处理网络层数据(主要为IP协议)的前提。
目前被广泛使用的代理应用,若需使Xray-core使用TUN,通常借助Sing-box或Mihomo的TUN入站、hev-tun、tun2socks等第三方应用,并通过SOCKS协议向Xray-core发起代理请求 以实现,显然有许多额外的性能开销(虽然对于网络速率影响通常较小),而Xray-core自身支持TUN后,便不必借助它们啦。
[!attention] 注意
No ICMP support.它不支持ICMP协议,于创建的虚拟网络接口所收到的任何ICMP请求均会超时。
Connections are established to any host, as connection success is only a mark of successful accepting packet for proxying. Hosts that are not accepting connections or don’t even exists, will look like they opened a connection (SYN-ACK), and never send back a single byte, closing connection (RST) after some time. This is the side effect of the whole process actually being a proxy, and not real network layer 3 vpn.
连接可建立至任何主机,因为连接成功仅代表数据包接收成功。对于不接受连接或者不存在的主机,连接建立者将拥有成功建立连接(收到
SYN ACK)的假象,却无法收到任何数据,且一段时间后连接将被关闭(收到RST),它是整个过程实质为代理 而非网络层VPN的副作用。
配置
TUN自身的配置十分简单,以下为示例配置:
{
"inbounds": [
{
"tag": "tun",
"port": 0,
"protocol": "tun",
"settings": {
"name": "xray0",
"MTU": 1492
}
}
]
}
name:虚拟网络接口的名称。MTU:IP协议数据包可包含的最大字节数,通常无需设置。
port字段必须存在,仅仅用于满足配置文件的完整性需求而填写,它实际上不会监听任何端口。
绑定网络接口
简单地添加此配置项可能导致数据包陷入无限循环,为使得Xray-core不向自身所创建的网络接口发送数据包,需要于所有出站添加sockopt对象,并设置interface为预期的网络接口名称。
例如,目前拥有以下配置文件:
{
"dns": {
"hosts": {
"dns.cloudflare.com": [
"1.1.1.1",
"1.0.0.1",
"2606:4700:4700::1111",
"2606:4700:4700::1001"
]
},
"servers": [
"https://dns.cloudflare.com/dns-query"
]
},
"outbounds": [
{
"tag": "vless_raw",
"protocol": "vless",
"settings": {
"address": "12.10.10.1",
"port": 443,
"id": "UUID",
"encryption": "none"
},
"streamSettings": {
"network": "raw"
}
},
{
"tag": "freedom",
"protocol": "freedom"
}
]
}
执行以下命令以获取网络接口名称:
# Linux
$ ip route
default via 192.168.0.1 dev eth0 proto kernel metric 30
192.168.0.0/24 dev eth0 proto kernel scope link metric 286
192.168.0.1 dev eth0 proto kernel scope link metric 30
# 此处预期的网络接口名称为`eth0`。
# Windows
> netsh interface ipv4 show interfaces
Idx Met MTU State Name
--- ---------- ---------- ------------ ---------------------------
1 75 4294967295 connected Loopback Pseudo-Interface 1
10 30 1500 connected WLAN
20 75 1500 disconnected 以太网
14 25 1500 disconnected 本地连接* 9
9 65 1500 disconnected 蓝牙网络连接
13 25 1500 disconnected 本地连接* 10
# 此处预期的网络接口名称为`WLAN`。
# MacOS
$ ifconfig -l
lo0 gif0 stf0 anpi0 anpi1 anpi2 en0 awdl0 llw0 bridge0
# 此处预期的网络接口名称为`en0`。
将预期的网络接口名称置入配置文件,便完成呀:
{
"outbounds": [
{
"tag": "vless_raw",
"protocol": "vless",
"streamSettings": {
"network": "raw",
"sockopt": {
"interface": "WLAN"
}
}
},
{
"tag": "freedom",
"protocol": "freedom",
"streamSettings": {
"sockopt": {
"interface": "WLAN"
}
}
}
]
}
设置路由表
以root用户或管理员用户 开启Xray-core后,通常需要等待数秒,以确保操作系统为其分配IP地址,随后设置系统路由表,以使所有数据包通过此虚拟网络接口发送。此处将设置全局路由,尝试执行以下命令:
# Linux
sudo ip route replace default dev xray0
# MacOS
sudo route change -inet default -interface xray0
sudo route change -inet6 default -interface xray0
Windows平台需要多项步骤:
# Windows
$interface = "xray0"
$config = Get-NetIPConfiguration -InterfaceAlias $interface
# 取得默认网关作为下一跃点。
$ipv4_next_hop = $config.IPv4DefaultGateway.NextHop
$ipv6_next_hop = $config.IPv6DefaultGateway.NextHop
if ($ipv4_next_hop) {
New-NetRoute -DestinationPrefix "0.0.0.0/0" -InterfaceAlias $interface -NextHop $ipv4_next_hop -RouteMetric 5
Write-Host "IPv4全局路由已指向'$ipv4_next_hop'"
}
if ($ipv6_next_hop) {
New-NetRoute -DestinationPrefix "::/0" -InterfaceAlias $interface -NextHop $ipv6_next_hop -RouteMetric 5
Write-Host "IPv6全局路由已指向'$ipv6_next_hop'"
}
请将xray0替换为虚拟网络接口的名称。
如此设置后,通常便能够使用。若Xray-core关闭,此处的xray0网络接口消失,操作系统将切换使用先前的网络接口,或删除此路由表规则。
阻止QUIC协议
QUIC协议基于UDP协议,不过,由于它已经基本实现类似于TCP的逻辑,使得“TCP中的QUIC”于性能考量上 并不划算,因此,通常需要阻止QUIC协议。
只需使用路由规则呀:
{
"routing": {
"rules": [
{
"type": "field",
"protocol": [
"quic"
],
"outboundTag": "blackhole"
},
{
"type": "field",
"network": "udp",
"port": 443,
"outboundTag": "blackhole"
}
]
},
"outbounds": [
{
"tag": "blackhole",
"protocol": "blackhole"
}
]
}
以上不仅阻止所有QUIC协议,为防止对QUIC协议的嗅探失效,亦阻止向443端口的UDP数据。
通过进程信息路由
Xray-core于26.1.23更新中,其能够“根据套接字地址确定进程信息”,使用户能够通过可执行文件名称、绝对路径与文件夹进行路由,亦能够对自身所发起的数据进行路由呀。
配置
只需于路由规则的process数组中配置便可,以下为示例配置文件:
{
"routing": {
"rules": [
{
"type": "field",
"process": [
"self/",
"xray/",
"curl",
"C:/Windows/System32/curl.exe",
"C:/Windows/System32/"
],
"outboundTag": "freedom"
}
]
},
"outbounds": [
{
"tag": "freedom",
"protocol": "freedom"
}
]
}
以上配置文件已经展示process配置的所有可能性:
self/:匹配当前Xray-core的进程ID。xray/:匹配当前Xray-core的路径。curl:匹配curl与Windows中的curl.exe。C:/Windows/System32/curl.exe:以绝对路径匹配curl.exe。C:/Windows/System32/:匹配此文件夹下的所有可执行文件。若希望匹配文件夹,此项必须以/或\\(仅Windows系统)结尾。
Hysteria2出站
26.1.23版本中,@LjhAUMEM使Xray-core初步支持Hysteria2协议,其出站已经处于可用状态,且支持“端口跳跃”与“改变数据外观为完全随机数据”。
端口跳跃(Port Hopping)
(或许大家早已熟悉此部分?)
互联网提供商常常对UDP协议进行QoS限制,使得Hysteria2难以使用,而“端口跳跃”允许客户端于一段时间之内 切换使用不同的服务器端口。Hysteria2借助QUIC协议的“连接ID”机制,即“使用标识符表示1个连接”,“端口跳跃”发生时不会重新建立连接,而是继续使用先前建立的连接,保证网络不会因此而断开或产生延迟。
[!warning] 警告
“端口跳跃”拥有十分显著的可识别特征,这里并不认为它是1种可持续的方式,请谨慎使用。
配置
于outbounds数组添加以下对象:
{
"outbounds": [
{
"tag": "hysteria2",
"protocol": "hysteria",
"settings": {
"address": "服务器地址",
"port": 443
},
"streamSettings": {
"network": "hysteria",
"security": "tls",
"hysteriaSettings": {
"version": 2,
"auth": "密码"
},
"tlsSettings": {
"alpn": [
"h3"
],
"serverName": "服务器域名"
}
}
}
]
}
目前,Xray-core仅支持Hysteria2,version字段仅允许为2。并没有支持Hysteria1的计划。
拥塞控制
通过congestion字段,可指定此Hysteria2应使用的拥塞控制,它应当为reno、cubic、bbr、brutal与force-brutal之一。
{
"hysteriaSettings": {
"congestion": "bbr"
}
}
此字段未指定时,将根据“是否设置up与down字段(见下部分)”以决定默认值,若是,则使用brutal,否则使用bbr。
“Brutal”拥塞控制
默认情况下,Hysteria2使用“BBR”拥塞控制,若希望尽量达到最大速度(若不考虑互联网提供商的QoS限制),可选择使用“Brutal”拥塞控制,其逻辑为“尽量以允许的最大速率发送数据包”呀。
为启用它,需要于hysteriaSettings设置down(下载带宽)与up(上传带宽)字段:
{
"hysteriaSettings": {
"up": "50mbps",
"down": "1000mbps"
}
}
当congestion字段为brutal时,Xray-core将与代理服务器协商彼此设置的速率,并取用对方的最小值。例如,当Xray-core协商得到服务器的下载速率 相比此处的up字段(上传速率)更小,将使用前者作为上传速率。若拥塞控制为force-brutal,Xray-core将忽略速率协商的结果,强制使用预设速率。
端口跳跃
“端口跳跃”相关配置亦十分简单,当服务器配置完毕“iptables重定向”等,将需要使用的端口 与“端口跳跃间隔(单位:秒)”置入udphop对象便可:
{
"hysteriaSettings": {
"udphop": {
"port": "9999,10000-60000",
"interval": 30
}
}
}
随机间隔时间(26.2.6)
Xray-core的26.2.6版本允许于上述的interval字段使用“范围内随机数”,形式如<最小值>-<最大值>,例如:
{
"interval": "30-60"
}
改变数据外观(26.2.6)
部分网络环境可能禁止QUIC协议,却允许其它UDP协议数据传输。因此,通过“Salamander”将Hysteria2原本的“QUIC协议”外观转变为“完全随机数据”外观,便可绕过此限制。
{
"streamSettings": {
"finalmask": {
"udp": [
{
"type": "salamander",
"settings": {
"password": "密码"
}
}
]
}
}
}
理论上,可通过增加更多对象以应用更多次数的数据外观改变。
)