入站代理
入站连接用于接收发来的数据,可用的协议请见入站协议。
InboundObject
InboundObject 对应配置文件中 inbounds 项的一个子元素。
{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 1080,
"protocol": "协议名称",
"settings": {},
"streamSettings": {},
"tag": "标识",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
]
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
listen: address
监听地址,IP 地址或 Unix domain socket,默认值为 "0.0.0.0",表示接收所有网卡上的连接.
可以指定一个系统可用的 IP 地址。
"::" 等价于"0.0.0.0" 两者都会同时监听 IPv6 和 IPv4. 不过如果只想监听IPv6可以将 sockopt 的 v6only 设置为 true. 如果只想监听ipv4 可以用 ip a 等命令查看网卡上的具体 IP (通常直接就是机器的公网 IP 地址或者一个类似 10.x.x.x 的内网地址) 然后监听,当然对于 IPv6 也可以这么做。
注意,因为UDP不是面向连接的,如果入站基于 UDP 且网卡上存在多个IP地址而外部连接的是网卡上的非首选地址,将会导致 Xray 错误地使用首选地址而非外部连接的目标作为源地址回复导致连接不通。 解决办法是不要监听 0.0.0.0 而是监听网卡上具体的 IP 地址。
支持填写 Unix domain socket,格式为绝对路径,形如 "/dev/shm/domain.socket",可在开头加 @ 代表 abstract,@@ 则代表带 padding 的 abstract。
填写 Unix domain socket 时,port 和 allocate 将被忽略,协议目前可选 VLESS、VMess、Trojan,仅适用于基于 TCP 的底层传输,如 tcp axpath websocket grpc. 不支持基于 UDP 的传输,如 mkcp.
填写 Unix domain socket 时,填写为形如 "/dev/shm/domain.socket,0666" 的形式,即 socket 后加逗号及访问权限指示符,即可指定 socket 的访问权限,可用于解决默认情况下出现的 socket 访问权限问题。
port: number | "env:variable" | string
端口。接受的格式如下:
- 整型数值:实际的端口号。
- 环境变量:以
"env:"开头,后面是一个环境变量的名称,如"env:PORT"。Xray 会以字符串形式解析这个环境变量。 - 字符串:可以是一个数值类型的字符串,如
"1234";或者一个数值范围,如"5-10"表示端口 5 到端口 10,这 6 个端口。可以使用逗号进行分段,如11,13,15-17表示端口 11、端口 13、端口 15 到端口 17 这 5 个端口。
当只有一个端口时,Xray 会在此端口监听入站连接。当指定了一个端口范围时,范围内的端口都会由 Xray 监听。
注意,监听一个端口是相当昂贵的操作,监听端口范围太大可能造成占用显著提高甚至导致 Xray 无法正常工作,一般来说监听数量接近四位数时可能就会开始出现问题,要使用一个很大的范围请考虑使用 iptables 进行重定向而不是在这里设置。
protocol: "tunnel" | "dokodemo-door" | "http" | "shadowsocks" | "mixed" | "socks" | "vless" | "vmess" | "trojan" | "wireguard"
连接协议名称,可选的协议列表见左侧 入站协议。
TIP
tunnel 是 dokodemo-door 的别名;mixed 是 socks 的别名。
settings: InboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的 InboundConfigurationObject。
streamSettings: StreamSettingsObject
底层传输方式(transport)是当前 Xray 节点和其它节点对接的方式
tag: string 此入站连接的标识,用于在其它的配置中定位此连接。
DANGER
当其不为空时,其值必须在所有 tag 中唯一。
sniffing: SniffingObject
流量探测主要作用于在透明代理等用途,比如一个典型流程如下:
- 如有一个设备上网,去访问 abc.com,首先设备通过 DNS 查询得到 abc.com 的 IP 是 1.2.3.4, 然后设备会向 1.2.3.4 去发起连接。
- 如果不设置嗅探,Xray 收到的连接请求是 1.2.3.4, 并不能用于域名规则的路由分流。
- 当设置了 sniffing 中的 enable 为 true,Xray 处理此连接的流量时,会从流量的数据中,嗅探出域名,即 abc.com。
- Xray 会把 1.2.3.4 重置为 abc.com。路由就可以根据域名去进行路由的域名规则的分流。
因为变成了一个向 abc.com 请求的连接,就可以做更多的事情,除了路由域名规则分流,还能重新做 DNS 解析等其他工作。
当设置了 sniffing 中的 enable 为 true,还能嗅探出 bittorrent 类型的流量,然后可以在路由中配置 "protocol" 项来设置规则处理未加密的 BT 流量,比如服务端用来拦截未加密的 BT 流量,或客户端固定转发 BT 流量到某个 VPS 去等。
注意:较新的浏览器可能使用 ECH 加密 Client Hello, 此时 Xray 只能看到 Outer Hello 中的域名,可能需要考虑劫持 DNS 或者手动在浏览器配置关闭 ECH.
支持的嗅探协议(本地增强)
嗅探分为两类:
- 可提取域名:可用于重置目标地址或路由域名规则
http(http1)、tls、quic、dns、fakedns - 仅用于协议识别:用于
routing.rules.protocolhttp2、ech、wireguard、mtproto、zerotier、rdp、mqtt、ntp、postgres(postgres+ssl/postgres+gssenc/postgres+cancel)、ikev2、dtls、bittorrent(含 uTP)、stun/turn、socks4/socks5、ssh、trojan
注意事项:
dns嗅探只有在路由规则中包含protocol: "dns"时才会启用;ech嗅探只有在路由规则中包含protocol: "ech"时才会启用;不会返回域名(避免对 Outer SNI 做目标地址重置),但会提取alpn;zerotier为尽力识别(不绑定端口),基于报文头特征(例如明文 HELLO / 分片头),不提取域名;mtproto嗅探为路由驱动,仅识别明文 transport(abridged / intermediate / padded intermediate),不提取域名,也不识别 MTProxy 的 obfuscated/fake-tls 形态;trojan嗅探仅在路由规则中包含protocol: "trojan"时才会启用;fakedns需启用 FakeDNS 才能生效;http/tls/quic会写入alpn属性,路由可通过protocol: ["alpn"]、protocol: ["alpn:h2"]、protocol: ["alpn=apns-security-v3"]、protocol: ["!alpn:h2"]等条件匹配(前缀匹配,不区分大小写,支持!反匹配);http2嗅探目前仅识别 HTTP/2 连接前言(h2c)并写入alpn,不会返回域名;域名通常依赖tls的 SNI 或 HTTP/1.x 的Host;tls会写入tls_sni属性:1表示 ClientHello 包含 SNI,0表示无 SNI;可用于routing.rules.attrs匹配(无 SNI 时Domain为空,不会触发目标地址重置);tls同时会写入tls_version属性(如1.2/1.3,若为未知格式则会回退到0x....);tls嗅探支持 ClientHello 跨多个 TLS record 分片(即使 SNI/ALPN 不在首个 record 中也可识别);- HTTP 嗅探会写入请求头到
attrs(可用于routing.rules.attrs)。
routing.rules.attrs 常见示例:
- 检测 HTTP GET:
{":method": "GET"} - 检测 HTTP Path:
{":path": "/test"} - 检测 Content Type:
{"accept": "text/html"} - 检测 TLS 无 SNI:
{"tls_sni": "^0$"} - 检测 TLS 有 SNI:
{"tls_sni": "^1$"} - 检测 TLS 1.3:
{"tls_version": "^1\\.3$"}
更多协议列表、启用条件与各协议的嗅探过程(含代码路径)详见 流量探测(Sniffing)。
SniffingObject
{
"enabled": true,
"destOverride": ["http", "tls", "fakedns"],
"metadataOnly": false,
"domainsExcluded": [],
"routeOnly": false
}2
3
4
5
6
7
enabled: true | false
是否开启流量探测。
destOverride: ["http" | "tls" | "quic" | "dns" | "fakedns"]
当流量为指定类型时,按其中包括的目标地址重置当前连接的目标。
TIP
Xray只会嗅探 destOverride 中协议的域名用作路由,如果只想进行嗅探用作路由而不想重置目标地址(如使用Tor浏览器时,重置目标地址会导致无法连接),请在这里添加对应的协议并启用 routeOnly 。
TIP
trojan 的协议识别是路由驱动嗅探:仅在路由规则中包含 protocol: "trojan" 时才会启用;与 destOverride 无关,也不会触发目标地址重置。
TIP
mtproto 的协议识别同样是路由驱动嗅探:仅在路由规则中包含 protocol: "mtproto" 时才会启用;与 destOverride 无关,也不会触发目标地址重置。
TIP
dns 嗅探仅在路由中使用 protocol: "dns" 时启用,启用后会自动加入覆盖列表。
TIP
destOverride 支持前缀匹配:例如 http 可匹配 http1 / http2。
metadataOnly: true | false
当启用时,将仅使用连接的元数据嗅探目标地址。此时,除 fakedns 以外的 sniffer 将不能激活。
如果关闭仅使用元数据推断目标地址,此时客户端必须先发送数据,代理服务器才会实际建立连接。此行为与需要服务器首先发起第一个消息的协议不兼容,如 SMTP 协议。
domainsExcluded: [string] WIP
一个域名列表,如果流量探测结果在这个列表中时,将 不会 重置目标地址。
支持直接的域名(精确匹配),或 regexp: 开头后接正则表达式。
TIP
填写一些域名,可能解决iOS 推送通知,米家智能设备,某些游戏(彩虹六号)语音问题。
如果需要排查某些问题的原因,可以通过关闭 "sniffing" 或者启用 "routeOnly" 来测试。
"domainsExcluded": [
"courier.push.apple.com", // iOS 推送通知
"Mijia Cloud", // 米家智能设备
"dlg.io.mi.com"
]2
3
4
5
6
WARNING
目前,domainsExcluded 不支持类似路由中的域名匹配方式。此选项未来可能会改变,不保证跨版本兼容。
routeOnly: true | false
将嗅探得到的域名仅用于路由,代理目标地址仍为 IP。默认值为 false。
此项需要开启 destOverride 使用。
TIP
在能保证 被代理连接能得到正确的 DNS 解析 时,使用 routeOnly 且开启 destOverride 的同时,将路由匹配策略 domainStrategy 设置为 AsIs 即可实现全程无 DNS 解析进行域名及 IP 分流。此时遇到 IP 规则匹配时使用的 IP 为域名原始 IP。