sub json fix fragment noises effect #1617

This commit is contained in:
Alireza Ahmadi
2026-02-20 01:05:37 +01:00
parent 35798c2c74
commit e5184b81be
2 changed files with 46 additions and 53 deletions

View File

@@ -20,8 +20,7 @@ var defaultJson string
type SubJsonService struct { type SubJsonService struct {
configJson map[string]interface{} configJson map[string]interface{}
defaultOutbounds []json_util.RawMessage defaultOutbounds []json_util.RawMessage
fragment string fragmentOrNoises bool
noises string
mux string mux string
inboundService service.InboundService inboundService service.InboundService
@@ -39,6 +38,31 @@ func NewSubJsonService(fragment string, noises string, mux string, rules string,
} }
} }
fragmentOrNoises := false
if fragment != "" || noises != "" {
fragmentOrNoises = true
defaultOutboundsSettings := map[string]interface{}{
"domainStrategy": "UseIP",
"redirect": "",
}
if fragment != "" {
defaultOutboundsSettings["fragment"] = json_util.RawMessage(fragment)
}
if noises != "" {
defaultOutboundsSettings["noises"] = json_util.RawMessage(noises)
}
defaultDirectOutbound := map[string]interface{}{
"protocol": "freedom",
"settings": defaultOutboundsSettings,
"tag": "direct_out",
}
jsonBytes, _ := json.MarshalIndent(defaultDirectOutbound, "", " ")
defaultOutbounds = append(defaultOutbounds, jsonBytes)
}
if rules != "" { if rules != "" {
var newRules []interface{} var newRules []interface{}
routing, _ := configJson["routing"].(map[string]interface{}) routing, _ := configJson["routing"].(map[string]interface{})
@@ -49,19 +73,10 @@ func NewSubJsonService(fragment string, noises string, mux string, rules string,
configJson["routing"] = routing configJson["routing"] = routing
} }
if fragment != "" {
defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(fragment))
}
if noises != "" {
defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(noises))
}
return &SubJsonService{ return &SubJsonService{
configJson: configJson, configJson: configJson,
defaultOutbounds: defaultOutbounds, defaultOutbounds: defaultOutbounds,
fragment: fragment, fragmentOrNoises: fragmentOrNoises,
noises: noises,
mux: mux, mux: mux,
SubService: subService, SubService: subService,
} }
@@ -222,8 +237,8 @@ func (s *SubJsonService) streamData(stream string) map[string]interface{} {
} }
delete(streamSettings, "sockopt") delete(streamSettings, "sockopt")
if s.fragment != "" { if s.fragmentOrNoises {
streamSettings["sockopt"] = json_util.RawMessage(`{"dialerProxy": "fragment", "tcpKeepAliveIdle": 100, "penetrate": true}`) streamSettings["sockopt"] = json_util.RawMessage(`{"dialerProxy": "direct_out", "tcpKeepAliveIdle": 100}`)
} }
// remove proxy protocol // remove proxy protocol

View File

@@ -477,34 +477,14 @@
remarkSeparators: [' ', '-', '_', '@', ':', '~', '|', ',', '.', '/'], remarkSeparators: [' ', '-', '_', '@', ':', '~', '|', ',', '.', '/'],
remarkSample: '', remarkSample: '',
defaultFragment: { defaultFragment: {
tag: "fragment",
protocol: "freedom",
settings: {
domainStrategy: "AsIs",
fragment: {
packets: "tlshello", packets: "tlshello",
length: "100-200", length: "100-200",
interval: "10-20", interval: "10-20",
maxSplit: "300-400" maxSplit: "300-400"
}
}, },
streamSettings: { defaultNoises: [
sockopt: { { type: "rand", packet: "10-20", delay: "10-16" }
tcpKeepAliveIdle: 100,
penetrate: true
}
}
},
defaultNoises: {
tag: "noises",
protocol: "freedom",
settings: {
domainStrategy: "AsIs",
noises: [
{ type: "rand", packet: "10-20", delay: "10-16" },
], ],
},
},
defaultMux: { defaultMux: {
enabled: true, enabled: true,
concurrency: 8, concurrency: 8,
@@ -661,41 +641,41 @@
} }
}, },
fragmentPackets: { fragmentPackets: {
get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.packets : ""; }, get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).packets : ""; },
set: function (v) { set: function (v) {
if (v != "") { if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment); newFragment = JSON.parse(this.allSetting.subJsonFragment);
newFragment.settings.fragment.packets = v; newFragment.packets = v;
this.allSetting.subJsonFragment = JSON.stringify(newFragment); this.allSetting.subJsonFragment = JSON.stringify(newFragment);
} }
} }
}, },
fragmentLength: { fragmentLength: {
get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.length : ""; }, get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).length : ""; },
set: function (v) { set: function (v) {
if (v != "") { if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment); newFragment = JSON.parse(this.allSetting.subJsonFragment);
newFragment.settings.fragment.length = v; newFragment.length = v;
this.allSetting.subJsonFragment = JSON.stringify(newFragment); this.allSetting.subJsonFragment = JSON.stringify(newFragment);
} }
} }
}, },
fragmentInterval: { fragmentInterval: {
get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.interval : ""; }, get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).interval : ""; },
set: function (v) { set: function (v) {
if (v != "") { if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment); newFragment = JSON.parse(this.allSetting.subJsonFragment);
newFragment.settings.fragment.interval = v; newFragment.interval = v;
this.allSetting.subJsonFragment = JSON.stringify(newFragment); this.allSetting.subJsonFragment = JSON.stringify(newFragment);
} }
} }
}, },
fragmentMaxSplit: { fragmentMaxSplit: {
get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.maxSplit : ""; }, get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).maxSplit : ""; },
set: function (v) { set: function (v) {
if (v != "") { if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment); newFragment = JSON.parse(this.allSetting.subJsonFragment);
newFragment.settings.fragment.maxSplit = v; newFragment.maxSplit = v;
this.allSetting.subJsonFragment = JSON.stringify(newFragment); this.allSetting.subJsonFragment = JSON.stringify(newFragment);
} }
} }
@@ -714,13 +694,11 @@
}, },
noisesArray: { noisesArray: {
get() { get() {
return this.noises ? JSON.parse(this.allSetting.subJsonNoises).settings.noises : []; return this.noises ? JSON.parse(this.allSetting.subJsonNoises) : [];
}, },
set(value) { set(value) {
if (this.noises) { if (this.noises) {
const newNoises = JSON.parse(this.allSetting.subJsonNoises); this.allSetting.subJsonNoises = JSON.stringify(value);
newNoises.settings.noises = value;
this.allSetting.subJsonNoises = JSON.stringify(newNoises);
} }
} }
}, },