From 083fe874bb692a4bcfa7aa15bcd77863d117e47c Mon Sep 17 00:00:00 2001 From: kenzok8 Date: Fri, 11 Oct 2024 04:21:53 +0800 Subject: [PATCH] update 2024-10-11 04:21:53 --- .../model/cbi/passwall2/client/other.lua | 39 +++++++++++++++++ .../luasrc/passwall2/util_xray.lua | 42 +++++++++++++++---- luci-app-passwall2/po/zh-cn/passwall2.po | 18 ++++++++ 3 files changed, 90 insertions(+), 9 deletions(-) diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua index a45de6af7..9765793d6 100644 --- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua +++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua @@ -160,6 +160,9 @@ if has_xray then o.default = "10-20" o:depends("fragment", true) + o = s_xray:option(Flag, "noise", translate("Noise"), translate("UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.")) + o.default = 0 + o = s_xray:option(Flag, "sniffing_override_dest", translate("Override the connection destination address"), translate("Override the connection destination address with the sniffed domain.")) o.default = 0 @@ -177,6 +180,42 @@ if has_xray then o = s_xray:option(Value, "buffer_size", translate("Buffer Size"), translate("Buffer size for every connection (kB)")) o.datatype = "uinteger" + + s_xray_noise = m:section(TypedSection, "xray_noise_packets", translate("Xray Noise Packets"),"" .. translate("To send noise packets, select \"Noise\" in Xray Settings.") .. "") + s_xray_noise.template = "cbi/tblsection" + s_xray_noise.sortable = true + s_xray_noise.anonymous = true + s_xray_noise.addremove = true + + s_xray_noise.create = function(e, t) + TypedSection.create(e, api.gen_short_uuid()) + end + + s_xray_noise.remove = function(self, section) + for k, v in pairs(self.children) do + v.rmempty = true + v.validate = nil + end + TypedSection.remove(self, section) + end + + o = s_xray_noise:option(Flag, "enabled", translate("Enable")) + o.default = 1 + o.rmempty = false + + o = s_xray_noise:option(ListValue, "type", translate("Type")) + o:value("rand", "rand") + o:value("str", "str") + o:value("base64", "base64") + + o = s_xray_noise:option(Value, "packet", translate("Packet")) + o.datatype = "minlength(1)" + o.rmempty = false + + o = s_xray_noise:option(Value, "delay", translate("Delay (ms)")) + o.datatype = "or(uinteger,portrange)" + o.rmempty = false + end if has_singbox then diff --git a/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/luci-app-passwall2/luasrc/passwall2/util_xray.lua index 42bdf2c3c..e80dc92b5 100644 --- a/luci-app-passwall2/luasrc/passwall2/util_xray.lua +++ b/luci-app-passwall2/luasrc/passwall2/util_xray.lua @@ -18,6 +18,20 @@ local function get_new_port() return new_port end +local function get_noise_packets() + local noises = {} + uci:foreach(appname, "xray_noise_packets", function(n) + local noise = (n.enabled == "1") and { + type = n.type, + packet = n.packet, + delay = string.find(n.delay, "-") and n.delay or tonumber(n.delay) + } or nil + table.insert(noises, noise) + end) + if #noises == 0 then noises = nil end + return noises +end + local function get_domain_excluded() local path = string.format("/usr/share/%s/domains_excluded", appname) local content = fs.readfile(path) @@ -44,10 +58,12 @@ function gen_outbound(flag, node, tag, proxy_table) local proxy = 0 local proxy_tag = "nil" local fragment = nil + local noise = nil if proxy_table ~= nil and type(proxy_table) == "table" then proxy = proxy_table.proxy or 0 proxy_tag = proxy_table.tag or "nil" fragment = proxy_table.fragment or nil + noise = proxy_table.noise or nil end if node.type == "Xray" then @@ -132,7 +148,7 @@ function gen_outbound(flag, node, tag, proxy_table) mark = 255, tcpMptcp = (node.tcpMptcp == "1") and true or nil, tcpNoDelay = (node.tcpNoDelay == "1") and true or nil, - dialerProxy = fragment and "fragment" or nil + dialerProxy = (fragment or noise) and "dialerproxy" or nil }, network = node.transport, security = node.stream_security, @@ -679,7 +695,7 @@ function gen_config(var) end if is_new_blc_node then local blc_node = uci:get_all(appname, blc_node_id) - local outbound = gen_outbound(flag, blc_node, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, blc_node, blc_node_tag, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outbound then table.insert(outbounds, outbound) valid_nodes[#valid_nodes + 1] = blc_node_tag @@ -698,7 +714,7 @@ function gen_config(var) if is_new_node then local fallback_node = uci:get_all(appname, fallback_node_id) if fallback_node.protocol ~= "_balancing" then - local outbound = gen_outbound(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.noise == "1" or nil }) if outbound then table.insert(outbounds, outbound) else @@ -863,10 +879,17 @@ function gen_config(var) if xray_settings.fragment == "1" and not proxy_table.tag then proxy_table.fragment = true end + if xray_settings.noise == "1" and not proxy_table.tag then + proxy_table.noise = true + end local outbound = gen_outbound(flag, _node, rule_name, proxy_table) if outbound then set_outbound_detour(_node, outbound, outbounds, rule_name) - table.insert(outbounds, outbound) + if rule_name == "default" then + table.insert(outbounds, 1, outbound) + else + table.insert(outbounds, outbound) + end rule_outboundTag = rule_name end end @@ -1054,7 +1077,7 @@ function gen_config(var) sys.call("touch /tmp/etc/passwall2/iface/" .. node.iface) end else - local outbound = gen_outbound(flag, node, nil, { fragment = xray_settings.fragment == "1" or nil }) + local outbound = gen_outbound(flag, node, nil, { fragment = xray_settings.fragment == "1" or nil, noise = xray_settings.fragment == "1" or nil }) if outbound then local default_outTag = set_outbound_detour(node, outbound, outbounds) table.insert(outbounds, outbound) @@ -1421,17 +1444,18 @@ function gen_config(var) } } - if xray_settings.fragment == "1" then + if xray_settings.fragment == "1" or xray_settings.noise == "1" then table.insert(outbounds, { protocol = "freedom", - tag = "fragment", + tag = "dialerproxy", settings = { domainStrategy = (direct_dns_query_strategy and direct_dns_query_strategy ~= "") and direct_dns_query_strategy or "UseIP", - fragment = { + fragment = (xray_settings.fragment == "1") and { packets = (xray_settings.fragment_packets and xray_settings.fragment_packets ~= "") and xray_settings.fragment_packets, length = (xray_settings.fragment_length and xray_settings.fragment_length ~= "") and xray_settings.fragment_length, interval = (xray_settings.fragment_interval and xray_settings.fragment_interval ~= "") and xray_settings.fragment_interval - } + } or nil, + noises = (xray_settings.noise == "1") and get_noise_packets() or nil }, streamSettings = { sockopt = { diff --git a/luci-app-passwall2/po/zh-cn/passwall2.po b/luci-app-passwall2/po/zh-cn/passwall2.po index 856af5b39..6f70bcee2 100644 --- a/luci-app-passwall2/po/zh-cn/passwall2.po +++ b/luci-app-passwall2/po/zh-cn/passwall2.po @@ -1516,6 +1516,24 @@ msgstr "分片间隔" msgid "Fragmentation interval (ms)" msgstr "分片间隔(ms)" +msgid "Noise" +msgstr "噪声" + +msgid "UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions." +msgstr "UDP 噪声,在某些情况下可以绕过一些针对 UDP 协议的限制。" + +msgid "To send noise packets, select \"Noise\" in Xray Settings." +msgstr "在 Xray 设置中勾选 “噪声” 以发送噪声包。" + +msgid "Xray Noise Packets" +msgstr "Xray 噪声数据包" + +msgid "Packet" +msgstr "数据包" + +msgid "Delay (ms)" +msgstr "延迟(ms)" + msgid "If is domain name, The requested domain name will be resolved to IP before connect." msgstr "如果是域名,域名将在请求发出之前解析为 IP。"