Xray-core新特性使用教程(TUN入站、通过进程信息路由、Hysteria2出站)

(此次更新较为重大呀。

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应使用的拥塞控制,它应当为renocubicbbrbrutalforce-brutal之一。

{
    "hysteriaSettings": {
        "congestion": "bbr"
    }
}

此字段未指定时,将根据“是否设置updown字段(见下部分)”以决定默认值,若是,则使用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": "密码"
                    }
                }
            ]
        }
    }
}

理论上,可通过增加更多对象以应用更多次数的数据外观改变。

1 Like