mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-06 11:24:07 +08:00
🦄 Sync 2026-06-17 03:41:10
This commit is contained in:
1 parent
aa76a8f79d
commit
08b7eb4ffb
79 files changed
+1354
-486
No files matched your search
@@ -6,8 +6,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-passwall2
|
||||
PKG_VERSION:=26.6.3
|
||||
PKG_RELEASE:=54
|
||||
PKG_VERSION:=26.6.16
|
||||
PKG_RELEASE:=55
|
||||
PKG_PO_VERSION:=$(PKG_VERSION)
|
||||
|
||||
PKG_CONFIG_DEPENDS:= \
|
||||
|
||||
@@ -320,15 +320,6 @@ o.rewrite_option = "method"
|
||||
for a, t in ipairs(ss_method_list) do o:value(t) end
|
||||
o:depends({ [_n("protocol")] = "shadowsocks" })
|
||||
|
||||
o = s:option(Flag, _n("iv_check"), translate("IV Check"))
|
||||
o:depends({ [_n("protocol")] = "shadowsocks", [_n("ss_method")] = "aes-128-gcm" })
|
||||
o:depends({ [_n("protocol")] = "shadowsocks", [_n("ss_method")] = "aes-256-gcm" })
|
||||
o:depends({ [_n("protocol")] = "shadowsocks", [_n("ss_method")] = "chacha20-poly1305" })
|
||||
o:depends({ [_n("protocol")] = "shadowsocks", [_n("ss_method")] = "xchacha20-poly1305" })
|
||||
|
||||
o = s:option(Flag, _n("uot"), translate("UDP over TCP"))
|
||||
o:depends({ [_n("protocol")] = "shadowsocks" })
|
||||
|
||||
o = s:option(ListValue, _n("flow"), translate("flow"))
|
||||
o.default = ""
|
||||
o:value("", translate("Disable"))
|
||||
@@ -420,7 +411,6 @@ o:value("http/1.1")
|
||||
o:value("h2,http/1.1")
|
||||
o:value("h3,h2,http/1.1")
|
||||
o:depends({ [_n("tls")] = true, [_n("reality")] = false })
|
||||
o:depends({ [_n("protocol")] = "hysteria2" })
|
||||
|
||||
-- o = s:option(Value, _n("minversion"), translate("minversion"))
|
||||
-- o.default = "1.3"
|
||||
@@ -772,11 +762,6 @@ o.default = 0
|
||||
o = s:option(Flag, _n("tcpMptcp"), "tcpMptcp", translate("Enable Multipath TCP, need to be enabled in both server and client configuration."))
|
||||
o.default = 0
|
||||
|
||||
o = s:option(Value, _n("preconns"), translate("Pre-connections"), translate("Number of early established connections to reduce latency."))
|
||||
o.datatype = "uinteger"
|
||||
o.placeholder = 0
|
||||
o:depends({ [_n("protocol")] = "vless" })
|
||||
|
||||
o = s:option(ListValue, _n("domain_resolver"), translate("Domain DNS Resolve"), translate("If the node address is a domain name, this DNS will be used for resolution."))
|
||||
o:value("", translate("Auto"))
|
||||
o:value("tcp", "TCP")
|
||||
|
||||
@@ -97,9 +97,6 @@ o.rewrite_option = "method"
|
||||
for a, t in ipairs(x_ss_method_list) do o:value(t) end
|
||||
o:depends({ [_n("protocol")] = "shadowsocks" })
|
||||
|
||||
o = s:option(Flag, _n("iv_check"), translate("IV Check"))
|
||||
o:depends({ [_n("protocol")] = "shadowsocks" })
|
||||
|
||||
o = s:option(ListValue, _n("ss_network"), translate("Transport"))
|
||||
o.default = "tcp,udp"
|
||||
o:value("tcp", "TCP")
|
||||
@@ -232,7 +229,6 @@ o:value("http/1.1")
|
||||
o:value("h2,http/1.1")
|
||||
o:value("h3,h2,http/1.1")
|
||||
o:depends({ [_n("tls")] = true, [_n("reality")] = false })
|
||||
o:depends({ [_n("protocol")] = "hysteria2"})
|
||||
|
||||
o = s:option(Flag, _n("use_mldsa65Seed"), translate("ML-DSA-65"))
|
||||
o.default = "0"
|
||||
|
||||
@@ -1611,27 +1611,23 @@ end
|
||||
|
||||
function parse_realm_uri(uri)
|
||||
if type(uri) ~= "string" then return nil end
|
||||
-- realm://token@server/realm_id?query
|
||||
local token, server_url, realm_id, query = trim(uri):match("^realm://([^@]+)@([^/]+)/([^?]*)%??(.*)$")
|
||||
if not token or not server_url or not realm_id then return nil end
|
||||
-- realm[+http]://token@server/realm_id?query
|
||||
local scheme, token, server_url, realm_id, query = trim(uri):match("^(realm%+http|realm)://([^@]+)@([^/]+)/([^?]*)%??(.*)$")
|
||||
if not scheme or not token or not server_url or not realm_id then return nil end
|
||||
realm_id = realm_id:gsub("/+$", "")
|
||||
local realm = {
|
||||
scheme = scheme,
|
||||
token = token,
|
||||
server_url = server_url,
|
||||
realm_id = realm_id
|
||||
}
|
||||
-- 解析 query 中的 stun=
|
||||
if query and query ~= "" then
|
||||
local stun_servers = {}
|
||||
for key, value in query:gmatch("([^&=?]+)=([^&]+)") do
|
||||
if key == "stun" and value ~= "" then
|
||||
stun_servers[#stun_servers + 1] = value
|
||||
end
|
||||
end
|
||||
if #stun_servers > 0 then
|
||||
realm.stun_servers = stun_servers
|
||||
end
|
||||
-- Parse stun= in the query
|
||||
local stun_servers
|
||||
for value in (query or ""):gmatch("[?&]?[Ss][Tt][Uu][Nn]=([^&]+)") do
|
||||
if not stun_servers then stun_servers = {} end
|
||||
stun_servers[#stun_servers + 1] = value
|
||||
end
|
||||
realm.stun_servers = stun_servers
|
||||
return realm
|
||||
end
|
||||
|
||||
|
||||
@@ -64,7 +64,8 @@ function gen_config(var)
|
||||
server_host = api.get_ipv6_full(server_host)
|
||||
end
|
||||
|
||||
local server = server_host .. ":" .. ((server_port or "") .. "," .. (node.hysteria2_hop or "")):gsub("^[%s,]+", ""):gsub("[%s,]+$", ""):gsub(":", "-")
|
||||
local port_hop = ((server_port or "") .. "," .. (node.hysteria2_hop or "")):gsub("^[%s,]+", ""):gsub("[%s,]+$", ""):gsub(":", "-")
|
||||
local server = server_host .. ":" .. (port_hop ~= "" and port_hop or "443")
|
||||
|
||||
local config = {
|
||||
server = (function()
|
||||
|
||||
@@ -617,8 +617,9 @@ function gen_outbound(flag, node, tag, proxy_table)
|
||||
result.server_port = nil
|
||||
local realm = api.parse_realm_uri(node.hysteria2_realm_url)
|
||||
if realm then
|
||||
realm.server_url = realm.server_url and "https://" .. realm.server_url or nil
|
||||
realm.server_url = (realm.scheme == "realm+http" and "http://" or "https://") .. realm.server_url
|
||||
realm.stun_servers = realm.stun_servers or node.hysteria2_realm_stun
|
||||
realm.scheme = nil
|
||||
return realm
|
||||
end
|
||||
return nil
|
||||
@@ -959,8 +960,9 @@ function gen_config_server(node)
|
||||
realm = node.hysteria2_realms and (function()
|
||||
local realm = api.parse_realm_uri(node.hysteria2_realm_url)
|
||||
if realm then
|
||||
realm.server_url = realm.server_url and "https://" .. realm.server_url or nil
|
||||
realm.server_url = (realm.scheme == "realm+http" and "http://" or "https://") .. realm.server_url
|
||||
realm.stun_servers = realm.stun_servers or node.hysteria2_realm_stun
|
||||
realm.scheme = nil
|
||||
realm.stun_domain_resolver = "direct"
|
||||
return realm
|
||||
end
|
||||
@@ -1797,13 +1799,12 @@ function gen_config(var)
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(route.rules, {
|
||||
action = "route",
|
||||
ip_is_private = true,
|
||||
outbound = "direct"
|
||||
})
|
||||
|
||||
if COMMON.default_outbound_tag then
|
||||
table.insert(route.rules, {
|
||||
action = "route",
|
||||
port_range = { "0:65535" },
|
||||
outbound = COMMON.default_outbound_tag
|
||||
})
|
||||
route.final = COMMON.default_outbound_tag
|
||||
end
|
||||
|
||||
|
||||
@@ -285,21 +285,22 @@ function gen_outbound(flag, node, tag, proxy_table)
|
||||
local finalmask = {}
|
||||
local TP = node.transport
|
||||
if TP == "mkcp" then
|
||||
local map = {none = "none", srtp = "header-srtp", utp = "header-utp", ["wechat-video"] = "header-wechat",
|
||||
dtls = "header-dtls", wireguard = "header-wireguard", dns = "header-dns"}
|
||||
local map = {none = "none", srtp = "srtp", utp = "utp", ["wechat-video"] = "wechat",
|
||||
dtls = "dtls", wireguard = "wireguard", dns = "dns"}
|
||||
local udp = {}
|
||||
if node.mkcp_guise and node.mkcp_guise ~= "none" then
|
||||
local g = { type = map[node.mkcp_guise] }
|
||||
local g = { type = "mkcp-legacy" }
|
||||
g.settings = { header = map[node.mkcp_guise] }
|
||||
if node.mkcp_guise == "dns" and node.mkcp_domain and node.mkcp_domain ~= "" then
|
||||
g.settings = { domain = node.mkcp_domain }
|
||||
g.settings.value = node.mkcp_domain
|
||||
end
|
||||
udp[#udp+1] = g
|
||||
end
|
||||
local c = { type = (node.mkcp_seed and node.mkcp_seed ~= "") and "mkcp-aes128gcm" or "mkcp-original" }
|
||||
local s = { type = "mkcp-legacy" }
|
||||
if node.mkcp_seed and node.mkcp_seed ~= "" then
|
||||
c.settings = { password = node.mkcp_seed }
|
||||
s.settings = { value = node.mkcp_seed }
|
||||
end
|
||||
udp[#udp+1] = c
|
||||
udp[#udp+1] = s
|
||||
finalmask.udp = udp
|
||||
elseif TP == "hysteria" then
|
||||
local udp = {}
|
||||
@@ -317,9 +318,7 @@ function gen_outbound(flag, node, tag, proxy_table)
|
||||
local realm = api.parse_realm_uri(node.hysteria2_realm_url)
|
||||
local url, stun
|
||||
if realm then
|
||||
if realm.token and realm.server_url and realm.realm_id then
|
||||
url = "realm://" .. realm.token .. "@" .. realm.server_url .. "/" .. realm.realm_id
|
||||
end
|
||||
url = realm.scheme .. "://" .. realm.token .. "@" .. realm.server_url .. "/" .. realm.realm_id
|
||||
stun = realm.stun_servers or node.hysteria2_realm_stun
|
||||
end
|
||||
local r = {
|
||||
@@ -386,43 +385,18 @@ function gen_outbound(flag, node, tag, proxy_table)
|
||||
end)()
|
||||
} or nil,
|
||||
settings = {
|
||||
vnext = (node.protocol == "vmess" or node.protocol == "vless") and {
|
||||
{
|
||||
address = node.address,
|
||||
port = tonumber(node.port),
|
||||
users = {
|
||||
{
|
||||
id = node.uuid,
|
||||
level = 0,
|
||||
security = (node.protocol == "vmess") and node.security or nil,
|
||||
testpre = (node.protocol == "vless") and tonumber(node.preconns) or nil,
|
||||
encryption = (node.protocol == "vless") and ((node.encryption and node.encryption ~= "") and node.encryption or "none") or nil,
|
||||
flow = (node.protocol == "vless"
|
||||
and (node.tls == "1" or (node.encryption and node.encryption ~= "" and node.encryption ~= "none"))
|
||||
and node.flow and node.flow ~= "") and node.flow or nil
|
||||
}
|
||||
}
|
||||
}
|
||||
} or nil,
|
||||
servers = (node.protocol == "socks" or node.protocol == "http" or node.protocol == "shadowsocks" or node.protocol == "trojan") and {
|
||||
{
|
||||
address = node.address,
|
||||
port = tonumber(node.port),
|
||||
method = (node.method == "chacha20-ietf-poly1305" and "chacha20-poly1305") or
|
||||
(node.method == "xchacha20-ietf-poly1305" and "xchacha20-poly1305") or
|
||||
(node.method ~= "" and node.method) or nil,
|
||||
ivCheck = (node.protocol == "shadowsocks") and node.iv_check == "1" or nil,
|
||||
uot = (node.protocol == "shadowsocks") and node.uot == "1" or nil,
|
||||
password = node.password or "",
|
||||
users = (node.username and node.password) and {
|
||||
{
|
||||
user = node.username,
|
||||
pass = node.password
|
||||
}
|
||||
} or nil
|
||||
}
|
||||
} or nil,
|
||||
address = (node.protocol == "wireguard" and node.wireguard_local_address) or (node.protocol == "hysteria" and node.address) or nil,
|
||||
address = (node.protocol == "wireguard") and node.wireguard_local_address or node.address,
|
||||
port = tonumber(node.port),
|
||||
id = (node.protocol == "vmess" or node.protocol == "vless") and node.uuid or nil,
|
||||
encryption = (node.protocol == "vless") and ((node.encryption and node.encryption ~= "") and node.encryption or "none") or nil,
|
||||
flow = (node.protocol == "vless" and (node.tls == "1" or (node.encryption and node.encryption ~= "" and node.encryption ~= "none"))
|
||||
and node.flow and node.flow ~= "") and node.flow or nil,
|
||||
security = (node.protocol == "vmess") and node.security or nil,
|
||||
user = (node.protocol == "socks" or node.protocol == "http") and node.username or nil,
|
||||
pass = (node.protocol == "socks" or node.protocol == "http") and node.password or nil,
|
||||
password = (node.protocol == "shadowsocks" or node.protocol == "trojan") and node.password or nil,
|
||||
method = (node.protocol == "shadowsocks") and ((node.method == "chacha20-ietf-poly1305" and "chacha20-poly1305") or
|
||||
(node.method == "xchacha20-ietf-poly1305" and "xchacha20-poly1305") or (node.method ~= "" and node.method) or nil) or nil,
|
||||
secretKey = (node.protocol == "wireguard") and node.wireguard_secret_key or nil,
|
||||
peers = (node.protocol == "wireguard") and {
|
||||
{
|
||||
@@ -434,13 +408,13 @@ function gen_outbound(flag, node, tag, proxy_table)
|
||||
} or nil,
|
||||
mtu = (node.protocol == "wireguard" and node.wireguard_mtu) and tonumber(node.wireguard_mtu) or nil,
|
||||
reserved = (node.protocol == "wireguard" and node.wireguard_reserved) and node.wireguard_reserved or nil,
|
||||
port = (node.protocol == "hysteria" and node.port) and tonumber(node.port) or nil,
|
||||
version = node.protocol == "hysteria" and 2 or nil
|
||||
version = (node.protocol == "hysteria") and 2 or nil,
|
||||
level = 0
|
||||
}
|
||||
}
|
||||
|
||||
if node.protocol == "wireguard" then
|
||||
result.settings.kernelMode = false
|
||||
result.settings.noKernelTun = true
|
||||
if node.finalmask and node.finalmask ~= "" then
|
||||
local ok, fm = pcall(jsonc.parse, api.base64Decode(node.finalmask))
|
||||
if ok and type(fm) == "table" then
|
||||
@@ -561,7 +535,6 @@ function gen_config_server(node)
|
||||
settings = {
|
||||
method = node.method,
|
||||
password = node.password,
|
||||
ivCheck = ("1" == node.iv_check) and true or false,
|
||||
network = node.ss_network or "TCP,UDP"
|
||||
}
|
||||
elseif node.protocol == "trojan" then
|
||||
@@ -740,21 +713,22 @@ function gen_config_server(node)
|
||||
finalmask = (function()
|
||||
local finalmask = {}
|
||||
if node.transport == "mkcp" then
|
||||
local map = {none = "none", srtp = "header-srtp", utp = "header-utp", ["wechat-video"] = "header-wechat",
|
||||
dtls = "header-dtls", wireguard = "header-wireguard", dns = "header-dns"}
|
||||
local map = {none = "none", srtp = "srtp", utp = "utp", ["wechat-video"] = "wechat",
|
||||
dtls = "dtls", wireguard = "wireguard", dns = "dns"}
|
||||
local udp = {}
|
||||
if node.mkcp_guise and node.mkcp_guise ~= "none" then
|
||||
local g = { type = map[node.mkcp_guise] }
|
||||
local g = { type = "mkcp-legacy" }
|
||||
g.settings = { header = map[node.mkcp_guise] }
|
||||
if node.mkcp_guise == "dns" and node.mkcp_domain and node.mkcp_domain ~= "" then
|
||||
g.settings = { domain = node.mkcp_domain }
|
||||
g.settings.value = node.mkcp_domain
|
||||
end
|
||||
udp[#udp+1] = g
|
||||
end
|
||||
local c = { type = (node.mkcp_seed and node.mkcp_seed ~= "") and "mkcp-aes128gcm" or "mkcp-original" }
|
||||
local s = { type = "mkcp-legacy" }
|
||||
if node.mkcp_seed and node.mkcp_seed ~= "" then
|
||||
c.settings = { password = node.mkcp_seed }
|
||||
s.settings = { value = node.mkcp_seed }
|
||||
end
|
||||
udp[#udp+1] = c
|
||||
udp[#udp+1] = s
|
||||
finalmask.udp = udp
|
||||
elseif node.transport == "hysteria" then
|
||||
local udp = {}
|
||||
@@ -772,9 +746,7 @@ function gen_config_server(node)
|
||||
local realm = api.parse_realm_uri(node.hysteria2_realm_url)
|
||||
local url, stun
|
||||
if realm then
|
||||
if realm.token and realm.server_url and realm.realm_id then
|
||||
url = "realm://" .. realm.token .. "@" .. realm.server_url .. "/" .. realm.realm_id
|
||||
end
|
||||
url = realm.scheme .. "://" .. realm.token .. "@" .. realm.server_url .. "/" .. realm.realm_id
|
||||
stun = realm.stun_servers or node.hysteria2_realm_stun
|
||||
end
|
||||
local r = {
|
||||
@@ -1524,7 +1496,7 @@ function gen_config(var)
|
||||
outboundTag = default_outboundTag,
|
||||
}
|
||||
if node.domainStrategy == "IPIfNonMatch" then
|
||||
rule.ip = { "0.0.0.0/0", "::/0" }
|
||||
rule.port = "1-65535"
|
||||
else
|
||||
rule.network = "tcp,udp"
|
||||
end
|
||||
@@ -1718,7 +1690,8 @@ function gen_config(var)
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local dns_outbound
|
||||
if dns_listen_port then
|
||||
table.insert(inbounds, {
|
||||
listen = "127.0.0.1",
|
||||
@@ -1775,12 +1748,13 @@ function gen_config(var)
|
||||
}
|
||||
}
|
||||
local type_dns = direct_type_dns
|
||||
table.insert(outbounds, {
|
||||
dns_outbound = {
|
||||
tag = "dns-out",
|
||||
protocol = "dns",
|
||||
proxySettings = type_dns.proxySettings,
|
||||
settings = type_dns.settings
|
||||
})
|
||||
}
|
||||
table.insert(outbounds, dns_outbound)
|
||||
table.insert(routing.rules, 1, {
|
||||
inboundTag = {
|
||||
"dns-in"
|
||||
@@ -1815,6 +1789,7 @@ function gen_config(var)
|
||||
end
|
||||
|
||||
-- Shunt rule DNS logic
|
||||
local dns_out_rules = {}
|
||||
if dns_domain_rules and #dns_domain_rules > 0 then
|
||||
for index, value in ipairs(dns_domain_rules) do
|
||||
if value.domain and value.outboundTag then
|
||||
@@ -1834,19 +1809,19 @@ function gen_config(var)
|
||||
end
|
||||
end
|
||||
end
|
||||
local dns_block = true -- If you do not want the blackhole rule to use DNS routing, please change it to `nil` or do not assign a value.
|
||||
if dns_outboundTag == "blackhole" then
|
||||
if dns_block then
|
||||
local dns_block_mode = "Hosts" -- use the Hosts mode to block.
|
||||
if dns_block_mode == "Hosts" then
|
||||
for d_i, d_k in ipairs(value.domain) do
|
||||
dns.hosts[d_k] = "0.0.0.0"
|
||||
end
|
||||
dns_server = nil
|
||||
end
|
||||
else
|
||||
dns_server = nil
|
||||
end
|
||||
table.insert(dns_out_rules, {
|
||||
action = "return",
|
||||
rCode = 0,
|
||||
domain = api.clone(value.domain)
|
||||
})
|
||||
dns_server = nil
|
||||
else
|
||||
table.insert(dns_out_rules, {
|
||||
action = "hijack",
|
||||
qType = "1,28",
|
||||
domain = api.clone(value.domain)
|
||||
})
|
||||
end
|
||||
if dns_server then
|
||||
dns_server.finalQuery = true
|
||||
@@ -1861,6 +1836,11 @@ function gen_config(var)
|
||||
end
|
||||
end
|
||||
end
|
||||
if dns_outbound and #dns_out_rules > 0 then
|
||||
for i = #dns_out_rules, 1, -1 do
|
||||
table.insert(dns_outbound.settings.rules, 1, dns_out_rules[i])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1251,9 +1251,6 @@ msgstr "پاک کردن گزارشها"
|
||||
msgid "Password"
|
||||
msgstr "رمز عبور"
|
||||
|
||||
msgid "IV Check"
|
||||
msgstr "بررسی IV"
|
||||
|
||||
msgid "UDP over TCP"
|
||||
msgstr "UDP بر روی TCP"
|
||||
|
||||
@@ -1266,12 +1263,6 @@ msgstr "پورت محلی"
|
||||
msgid "Fast Open"
|
||||
msgstr "بازگشایی سریع (Fast Open)"
|
||||
|
||||
msgid "Pre-connections"
|
||||
msgstr "پیشاتصالات"
|
||||
|
||||
msgid "Number of early established connections to reduce latency."
|
||||
msgstr "تعداد اتصالات از پیش برقرار شده برای کاهش تاخیر."
|
||||
|
||||
msgid "plugin"
|
||||
msgstr "افزونه"
|
||||
|
||||
|
||||
@@ -1252,9 +1252,6 @@ msgstr "Очистить журнал"
|
||||
msgid "Password"
|
||||
msgstr "Пароль"
|
||||
|
||||
msgid "IV Check"
|
||||
msgstr "Проверка IV"
|
||||
|
||||
msgid "UDP over TCP"
|
||||
msgstr "UDP через TCP"
|
||||
|
||||
@@ -1267,12 +1264,6 @@ msgstr "Локальный порт"
|
||||
msgid "Fast Open"
|
||||
msgstr "Fast Open"
|
||||
|
||||
msgid "Pre-connections"
|
||||
msgstr "Предварительные соединения"
|
||||
|
||||
msgid "Number of early established connections to reduce latency."
|
||||
msgstr "Количество заранее установленных соединений для снижения задержки."
|
||||
|
||||
msgid "plugin"
|
||||
msgstr "Плагин"
|
||||
|
||||
|
||||
@@ -1243,9 +1243,6 @@ msgstr "清空日志"
|
||||
msgid "Password"
|
||||
msgstr "密码"
|
||||
|
||||
msgid "IV Check"
|
||||
msgstr "IV 检查"
|
||||
|
||||
msgid "UDP over TCP"
|
||||
msgstr "TCP 封装 UDP"
|
||||
|
||||
@@ -1258,12 +1255,6 @@ msgstr "本地端口"
|
||||
msgid "Fast Open"
|
||||
msgstr "快速打开"
|
||||
|
||||
msgid "Pre-connections"
|
||||
msgstr "预连接"
|
||||
|
||||
msgid "Number of early established connections to reduce latency."
|
||||
msgstr "预连接的数量,用于降低延迟。"
|
||||
|
||||
msgid "plugin"
|
||||
msgstr "插件"
|
||||
|
||||
|
||||
@@ -1243,9 +1243,6 @@ msgstr "清空日誌"
|
||||
msgid "Password"
|
||||
msgstr "密碼"
|
||||
|
||||
msgid "IV Check"
|
||||
msgstr "IV 檢查"
|
||||
|
||||
msgid "UDP over TCP"
|
||||
msgstr "TCP 封装 UDP"
|
||||
|
||||
@@ -1258,12 +1255,6 @@ msgstr "本地端口"
|
||||
msgid "Fast Open"
|
||||
msgstr "快速打開"
|
||||
|
||||
msgid "Pre-connections"
|
||||
msgstr "預連接"
|
||||
|
||||
msgid "Number of early established connections to reduce latency."
|
||||
msgstr "預連接的數量,用於降低延遲。"
|
||||
|
||||
msgid "plugin"
|
||||
msgstr "插件"
|
||||
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
|
||||
START=99
|
||||
|
||||
boot_func() {
|
||||
sleep 90
|
||||
restart
|
||||
}
|
||||
|
||||
boot() {
|
||||
boot_func >/dev/null 2>&1 &
|
||||
}
|
||||
|
||||
start() {
|
||||
lua /usr/lib/lua/luci/passwall2/server_app.lua start
|
||||
}
|
||||
|
||||
@@ -88,6 +88,23 @@ config shunt_rules 'Russia'
|
||||
option ip_list 'geoip:ru
|
||||
#rule-set:remote:https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/refs/heads/release/sing-box/rule-set-geoip/geoip-ru.srs'
|
||||
|
||||
config shunt_rules 'PrivateIP'
|
||||
option remarks 'PrivateIP'
|
||||
option network 'tcp,udp'
|
||||
option ip_list '10.0.0.0/8
|
||||
127.0.0.0/8
|
||||
198.51.100.0/24
|
||||
192.0.0.0/24
|
||||
169.254.0.0/16
|
||||
224.0.0.0/3
|
||||
192.168.0.0/16
|
||||
192.88.99.0/24
|
||||
100.64.0.0/10
|
||||
172.16.0.0/12
|
||||
0.0.0.0/8
|
||||
192.0.2.0/24
|
||||
203.0.113.0/24'
|
||||
|
||||
config nodes 'examplenode'
|
||||
option remarks 'Example'
|
||||
option type 'Xray'
|
||||
@@ -104,6 +121,7 @@ config nodes 'rulenode'
|
||||
option remarks 'rulenode'
|
||||
option type 'Xray'
|
||||
option protocol '_shunt'
|
||||
option PrivateIP '_direct'
|
||||
option default_node 'examplenode'
|
||||
option domainStrategy 'IPOnDemand'
|
||||
option domainMatcher 'hybrid'
|
||||
|
||||
@@ -1937,7 +1937,6 @@ local function curl(url, file, ua, mode)
|
||||
ua = (ua == "passwall2") and ("passwall2/" .. api.get_version()) or ua
|
||||
curl_args[#curl_args + 1] = '--user-agent "' .. ua .. '"'
|
||||
end
|
||||
curl_args[#curl_args + 1] = get_headers()
|
||||
local return_code, result
|
||||
if mode == "direct" then
|
||||
return_code, result = api.curl_direct(url, file, curl_args)
|
||||
@@ -1949,57 +1948,6 @@ local function curl(url, file, ua, mode)
|
||||
return return_code, tonumber(result)
|
||||
end
|
||||
|
||||
function get_headers()
|
||||
local cache_file = "/tmp/etc/" .. appname .. "_tmp/sub_curl_headers"
|
||||
if fs.access(cache_file) then
|
||||
return luci.sys.exec("cat " .. cache_file)
|
||||
end
|
||||
local headers = {}
|
||||
|
||||
local function readfile(path)
|
||||
local f = io.open(path, "r")
|
||||
if not f then return nil end
|
||||
local c = f:read("*a")
|
||||
f:close()
|
||||
return api.trim(c)
|
||||
end
|
||||
|
||||
headers[#headers + 1] = "x-device-os: OpenWrt"
|
||||
|
||||
local rel = readfile("/etc/openwrt_release")
|
||||
local os_ver = rel and rel:match("DISTRIB_RELEASE='([^']+)'")
|
||||
if os_ver then
|
||||
headers[#headers + 1] = "x-ver-os: " .. os_ver
|
||||
end
|
||||
|
||||
local model = readfile("/tmp/sysinfo/model")
|
||||
if model then
|
||||
headers[#headers + 1] = "x-device-model: " .. model
|
||||
end
|
||||
|
||||
local mac = readfile("/sys/class/net/eth0/address")
|
||||
if mac and model then
|
||||
local raw = mac .. "-" .. model
|
||||
local p = io.popen("printf '%s' '" .. raw:gsub("'", "'\\''") .. "' | sha256sum")
|
||||
if p then
|
||||
local hash = p:read("*l")
|
||||
p:close()
|
||||
hash = hash and hash:match("^%w+")
|
||||
if hash then
|
||||
headers[#headers + 1] = "x-hwid: " .. hash
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local out = {}
|
||||
for i = 1, #headers do
|
||||
out[i] = "-H '" .. headers[i]:gsub("'", "'\\''") .. "'"
|
||||
end
|
||||
local headers_str = table.concat(out, " ")
|
||||
local f = io.open(cache_file, "w"); if f then f:write(headers_str); f:close() end
|
||||
return headers_str
|
||||
end
|
||||
|
||||
local function truncate_nodes(group)
|
||||
for _, config in pairs(CONFIG) do
|
||||
if config.currentNodes and #config.currentNodes > 0 then
|
||||
|
||||
Reference in new issue
Block a user