diff --git a/sub/subJsonService.go b/sub/subJsonService.go index 1da1da85..322e1adc 100644 --- a/sub/subJsonService.go +++ b/sub/subJsonService.go @@ -20,8 +20,7 @@ var defaultJson string type SubJsonService struct { configJson map[string]interface{} defaultOutbounds []json_util.RawMessage - fragment string - noises string + fragmentOrNoises bool mux string 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 != "" { var newRules []interface{} routing, _ := configJson["routing"].(map[string]interface{}) @@ -49,19 +73,10 @@ func NewSubJsonService(fragment string, noises string, mux string, rules string, configJson["routing"] = routing } - if fragment != "" { - defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(fragment)) - } - - if noises != "" { - defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(noises)) - } - return &SubJsonService{ configJson: configJson, defaultOutbounds: defaultOutbounds, - fragment: fragment, - noises: noises, + fragmentOrNoises: fragmentOrNoises, mux: mux, SubService: subService, } @@ -222,8 +237,8 @@ func (s *SubJsonService) streamData(stream string) map[string]interface{} { } delete(streamSettings, "sockopt") - if s.fragment != "" { - streamSettings["sockopt"] = json_util.RawMessage(`{"dialerProxy": "fragment", "tcpKeepAliveIdle": 100, "penetrate": true}`) + if s.fragmentOrNoises { + streamSettings["sockopt"] = json_util.RawMessage(`{"dialerProxy": "direct_out", "tcpKeepAliveIdle": 100}`) } // remove proxy protocol diff --git a/web/html/xui/settings.html b/web/html/xui/settings.html index a79b4d22..6e8c265e 100644 --- a/web/html/xui/settings.html +++ b/web/html/xui/settings.html @@ -477,34 +477,14 @@ remarkSeparators: [' ', '-', '_', '@', ':', '~', '|', ',', '.', '/'], remarkSample: '', defaultFragment: { - tag: "fragment", - protocol: "freedom", - settings: { - domainStrategy: "AsIs", - fragment: { - packets: "tlshello", - length: "100-200", - interval: "10-20", - maxSplit: "300-400" - } - }, - streamSettings: { - sockopt: { - tcpKeepAliveIdle: 100, - penetrate: true - } - } - }, - defaultNoises: { - tag: "noises", - protocol: "freedom", - settings: { - domainStrategy: "AsIs", - noises: [ - { type: "rand", packet: "10-20", delay: "10-16" }, - ], - }, + packets: "tlshello", + length: "100-200", + interval: "10-20", + maxSplit: "300-400" }, + defaultNoises: [ + { type: "rand", packet: "10-20", delay: "10-16" } + ], defaultMux: { enabled: true, concurrency: 8, @@ -661,41 +641,41 @@ } }, 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) { if (v != "") { newFragment = JSON.parse(this.allSetting.subJsonFragment); - newFragment.settings.fragment.packets = v; + newFragment.packets = v; this.allSetting.subJsonFragment = JSON.stringify(newFragment); } } }, 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) { if (v != "") { newFragment = JSON.parse(this.allSetting.subJsonFragment); - newFragment.settings.fragment.length = v; + newFragment.length = v; this.allSetting.subJsonFragment = JSON.stringify(newFragment); } } }, 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) { if (v != "") { newFragment = JSON.parse(this.allSetting.subJsonFragment); - newFragment.settings.fragment.interval = v; + newFragment.interval = v; this.allSetting.subJsonFragment = JSON.stringify(newFragment); } } }, 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) { if (v != "") { newFragment = JSON.parse(this.allSetting.subJsonFragment); - newFragment.settings.fragment.maxSplit = v; + newFragment.maxSplit = v; this.allSetting.subJsonFragment = JSON.stringify(newFragment); } } @@ -714,13 +694,11 @@ }, noisesArray: { get() { - return this.noises ? JSON.parse(this.allSetting.subJsonNoises).settings.noises : []; + return this.noises ? JSON.parse(this.allSetting.subJsonNoises) : []; }, set(value) { if (this.noises) { - const newNoises = JSON.parse(this.allSetting.subJsonNoises); - newNoises.settings.noises = value; - this.allSetting.subJsonNoises = JSON.stringify(newNoises); + this.allSetting.subJsonNoises = JSON.stringify(value); } } },