Sniffing: Add ipsExcluded, domainsExcluded (supports IP, CIDR, "geoip:", "ext:")

This commit is contained in:
MHSanaei 2026-04-20 18:22:43 +02:00
parent 094ea9faaa
commit 2b3b2770b4
No known key found for this signature in database
GPG key ID: 7E4060F2FBE5AB7A
2 changed files with 55 additions and 16 deletions

View file

@ -1252,28 +1252,43 @@ class Sniffing extends XrayCommonClass {
enabled = false, enabled = false,
destOverride = ['http', 'tls', 'quic', 'fakedns'], destOverride = ['http', 'tls', 'quic', 'fakedns'],
metadataOnly = false, metadataOnly = false,
routeOnly = false) { routeOnly = false,
ipsExcluded = [],
domainsExcluded = []) {
super(); super();
this.enabled = enabled; this.enabled = enabled;
this.destOverride = destOverride; this.destOverride = Array.isArray(destOverride) && destOverride.length > 0 ? destOverride : ['http', 'tls', 'quic', 'fakedns'];
this.metadataOnly = metadataOnly; this.metadataOnly = metadataOnly;
this.routeOnly = routeOnly; this.routeOnly = routeOnly;
this.ipsExcluded = Array.isArray(ipsExcluded) ? ipsExcluded : [];
this.domainsExcluded = Array.isArray(domainsExcluded) ? domainsExcluded : [];
} }
static fromJson(json = {}) { static fromJson(json = {}) {
let destOverride = ObjectUtil.clone(json.destOverride); let destOverride = ObjectUtil.clone(json.destOverride);
if (!ObjectUtil.isEmpty(destOverride) && !ObjectUtil.isArrEmpty(destOverride)) { if (ObjectUtil.isEmpty(destOverride) || ObjectUtil.isArrEmpty(destOverride) || ObjectUtil.isEmpty(destOverride[0])) {
if (ObjectUtil.isEmpty(destOverride[0])) { destOverride = ['http', 'tls', 'quic', 'fakedns'];
destOverride = ['http', 'tls', 'quic', 'fakedns'];
}
} }
return new Sniffing( return new Sniffing(
!!json.enabled, !!json.enabled,
destOverride, destOverride,
json.metadataOnly, json.metadataOnly,
json.routeOnly, json.routeOnly,
json.ipsExcluded || [],
json.domainsExcluded || [],
); );
} }
toJson() {
return {
enabled: this.enabled,
destOverride: this.destOverride,
metadataOnly: this.metadataOnly,
routeOnly: this.routeOnly,
ipsExcluded: this.ipsExcluded.length > 0 ? this.ipsExcluded : undefined,
domainsExcluded: this.domainsExcluded.length > 0 ? this.domainsExcluded : undefined,
};
}
} }
class Inbound extends XrayCommonClass { class Inbound extends XrayCommonClass {

View file

@ -1,29 +1,53 @@
{{define "form/sniffing"}} {{define "form/sniffing"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item> <a-form-item>
<span slot="label"> <span slot="label">
{{ i18n "enabled" }} {{ i18n "enabled" }}
<a-tooltip> <a-tooltip>
<template slot="title"> <template slot="title">
<span>{{ i18n "pages.inbounds.noRecommendKeepDefault" }}</span> <span>{{ i18n "pages.inbounds.noRecommendKeepDefault" }}</span>
</template> </template>
<a-icon type="question-circle"></a-icon> <a-icon type="question-circle"></a-icon>
</a-tooltip> </a-tooltip>
</span> </span>
<a-switch v-model="inbound.sniffing.enabled"></a-switch> <a-switch v-model="inbound.sniffing.enabled"></a-switch>
</a-form-item> </a-form-item>
<template v-if="inbound.sniffing.enabled"> <template v-if="inbound.sniffing.enabled">
<a-form-item :wrapper-col="{span:24}"> <a-form-item :wrapper-col="{span:24}">
<a-checkbox-group v-model="inbound.sniffing.destOverride"> <a-checkbox-group v-model="inbound.sniffing.destOverride">
<a-checkbox v-for="key,value in SNIFFING_OPTION" :value="key">[[ value ]]</a-checkbox> <a-checkbox v-for="key,value in SNIFFING_OPTION" :value="key"
>[[ value ]]</a-checkbox
>
</a-checkbox-group> </a-checkbox-group>
</a-form-item> </a-form-item>
<a-form-item label='Metadata Only'> <a-form-item label="Metadata Only">
<a-switch v-model="inbound.sniffing.metadataOnly"></a-switch> <a-switch v-model="inbound.sniffing.metadataOnly"></a-switch>
</a-form-item> </a-form-item>
<a-form-item label='Route Only'> <a-form-item label="Route Only">
<a-switch v-model="inbound.sniffing.routeOnly"></a-switch> <a-switch v-model="inbound.sniffing.routeOnly"></a-switch>
</a-form-item> </a-form-item>
<a-form-item label="IPs Excluded">
<a-select
mode="tags"
v-model="inbound.sniffing.ipsExcluded"
:style="{ width: '100%' }"
:token-separators="[',']"
placeholder="IP/CIDR/geoip:*/ext:*"
></a-select>
</a-form-item>
<a-form-item label="Domains Excluded">
<a-select
mode="tags"
v-model="inbound.sniffing.domainsExcluded"
:style="{ width: '100%' }"
:token-separators="[',']"
placeholder="domain:*/ext:*"
></a-select>
</a-form-item>
</template> </template>
</a-form> </a-form>
{{end}} {{end}}