luci-app-passwall2: sync upstream

This commit is contained in:
sbwml 2023-09-13 12:57:55 +08:00
parent a9e22bbdc5
commit 2728e7b0db
9 changed files with 206 additions and 85 deletions

View File

@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall2 PKG_NAME:=luci-app-passwall2
PKG_VERSION:=1.20-8 PKG_VERSION:=1.20-10
PKG_RELEASE:= PKG_RELEASE:=
PKG_CONFIG_DEPENDS:= \ PKG_CONFIG_DEPENDS:= \

View File

@ -252,6 +252,19 @@ o:depends({ [option_name("protocol")] = "vmess" })
o:depends({ [option_name("protocol")] = "vless" }) o:depends({ [option_name("protocol")] = "vless" })
o:depends({ [option_name("protocol")] = "tuic" }) o:depends({ [option_name("protocol")] = "tuic" })
o = s:option(Value, option_name("alter_id"), "Alter ID")
o.datatype = "uinteger"
o.default = "0"
o:depends({ [option_name("protocol")] = "vmess" })
o = s:option(Flag, option_name("global_padding"), "global_padding", translate("Protocol parameter. Will waste traffic randomly if enabled."))
o.default = "0"
o:depends({ [option_name("protocol")] = "vmess" })
o = s:option(Flag, option_name("authenticated_length"), "authenticated_length", translate("Protocol parameter. Enable length block encryption."))
o.default = "0"
o:depends({ [option_name("protocol")] = "vmess" })
o = s:option(ListValue, option_name("flow"), translate("flow")) o = s:option(ListValue, option_name("flow"), translate("flow"))
o.default = "" o.default = ""
o:value("", translate("Disable")) o:value("", translate("Disable"))
@ -355,19 +368,6 @@ o:depends({ [option_name("protocol")] = "trojan" })
o:depends({ [option_name("protocol")] = "shadowsocks" }) o:depends({ [option_name("protocol")] = "shadowsocks" })
o:depends({ [option_name("protocol")] = "shadowtls" }) o:depends({ [option_name("protocol")] = "shadowtls" })
if singbox_tags:find("with_reality") then
o = s:option(Flag, option_name("reality"), translate("REALITY"))
o.default = 0
o:depends({ [option_name("protocol")] = "vless", [option_name("tls")] = true })
-- [[ REALITY部分 ]] --
o = s:option(Value, option_name("reality_publicKey"), translate("Public Key"))
o:depends({ [option_name("tls")] = true, [option_name("reality")] = true })
o = s:option(Value, option_name("reality_shortId"), translate("Short Id"))
o:depends({ [option_name("tls")] = true, [option_name("reality")] = true })
end
o = s:option(ListValue, option_name("alpn"), translate("alpn")) o = s:option(ListValue, option_name("alpn"), translate("alpn"))
o.default = "default" o.default = "default"
o:value("default", translate("Default")) o:value("default", translate("Default"))
@ -392,22 +392,36 @@ o:depends({ [option_name("protocol")] = "hysteria2" })
if singbox_tags:find("with_utls") then if singbox_tags:find("with_utls") then
o = s:option(Flag, option_name("utls"), translate("uTLS")) o = s:option(Flag, option_name("utls"), translate("uTLS"))
o.default = "0" o.default = "0"
o:depends({ [option_name("tls")] = true, [option_name("reality")] = false }) o:depends({ [option_name("tls")] = true })
o = s:option(ListValue, option_name("fingerprint"), translate("Finger Print")) o = s:option(ListValue, option_name("fingerprint"), translate("Finger Print"))
o:value("chrome") o:value("chrome")
o:value("firefox") o:value("firefox")
o:value("edge") o:value("edge")
o:value("safari") o:value("safari")
o:value("360") -- o:value("360")
o:value("qq") o:value("qq")
o:value("ios") o:value("ios")
o:value("android") -- o:value("android")
o:value("random") o:value("random")
o:value("randomized") -- o:value("randomized")
o.default = "chrome" o.default = "chrome"
o:depends({ [option_name("tls")] = true, [option_name("utls")] = true }) o:depends({ [option_name("tls")] = true, [option_name("utls")] = true })
o:depends({ [option_name("tls")] = true, [option_name("reality")] = true })
-- [[ REALITY部分 ]] --
o = s:option(Flag, option_name("reality"), translate("REALITY"))
o.default = 0
o:depends({ [option_name("protocol")] = "vless", [option_name("utls")] = true })
o:depends({ [option_name("protocol")] = "vmess", [option_name("utls")] = true })
o:depends({ [option_name("protocol")] = "shadowsocks", [option_name("utls")] = true })
o:depends({ [option_name("protocol")] = "socks", [option_name("utls")] = true })
o:depends({ [option_name("protocol")] = "trojan", [option_name("utls")] = true })
o = s:option(Value, option_name("reality_publicKey"), translate("Public Key"))
o:depends({ [option_name("utls")] = true, [option_name("reality")] = true })
o = s:option(Value, option_name("reality_shortId"), translate("Short Id"))
o:depends({ [option_name("utls")] = true, [option_name("reality")] = true })
end end
o = s:option(ListValue, option_name("transport"), translate("Transport")) o = s:option(ListValue, option_name("transport"), translate("Transport"))
@ -512,7 +526,7 @@ o:depends({ [option_name("protocol")] = "vmess" })
o:depends({ [option_name("protocol")] = "vless", [option_name("flow")] = "" }) o:depends({ [option_name("protocol")] = "vless", [option_name("flow")] = "" })
o:depends({ [option_name("protocol")] = "http" }) o:depends({ [option_name("protocol")] = "http" })
o:depends({ [option_name("protocol")] = "socks" }) o:depends({ [option_name("protocol")] = "socks" })
o:depends({ [option_name("protocol")] = "shadowsocks" }) o:depends({ [option_name("protocol")] = "shadowsocks", [option_name("uot")] = "" })
o:depends({ [option_name("protocol")] = "trojan" }) o:depends({ [option_name("protocol")] = "trojan" })
o = s:option(ListValue, option_name("mux_type"), translate("Mux")) o = s:option(ListValue, option_name("mux_type"), translate("Mux"))
@ -525,4 +539,8 @@ o = s:option(Value, option_name("mux_concurrency"), translate("Mux concurrency")
o.default = 8 o.default = 8
o:depends({ [option_name("mux")] = true }) o:depends({ [option_name("mux")] = true })
o = s:option(Flag, option_name("mux_padding"), translate("Padding"))
o.default = 0
o:depends({ [option_name("mux")] = true })
api.luci_types(arg[1], m, s, type_name, option_prefix) api.luci_types(arg[1], m, s, type_name, option_prefix)

View File

@ -115,6 +115,8 @@ o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0 o.default = 0
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value then if value then
local reality = s.fields[option_name("reality")]:formvalue(t)
if reality and reality == "1" then return value end
if value == "1" then if value == "1" then
local ca = s.fields[option_name("tls_certificateFile")]:formvalue(t) or "" local ca = s.fields[option_name("tls_certificateFile")]:formvalue(t) or ""
local key = s.fields[option_name("tls_keyFile")]:formvalue(t) or "" local key = s.fields[option_name("tls_keyFile")]:formvalue(t) or ""
@ -131,6 +133,24 @@ o:depends({ [option_name("protocol")] = "socks" })
o:depends({ [option_name("protocol")] = "shadowsocks" }) o:depends({ [option_name("protocol")] = "shadowsocks" })
o:depends({ [option_name("protocol")] = "trojan" }) o:depends({ [option_name("protocol")] = "trojan" })
-- [[ REALITY部分 ]] --
o = s:option(Flag, option_name("reality"), translate("REALITY"))
o.default = 0
o:depends({ [option_name("tls")] = true })
o = s:option(Value, option_name("reality_private_key"), translate("Private Key"))
o:depends({ [option_name("reality")] = true })
o = s:option(Value, option_name("reality_shortId"), translate("Short Id"))
o:depends({ [option_name("reality")] = true })
o = s:option(Value, option_name("reality_dest"), translate("Dest"))
o.default = "google.com:443"
o:depends({ [option_name("reality")] = true })
o = s:option(Value, option_name("reality_serverNames"), translate("serverNames"))
o:depends({ [option_name("reality")] = true })
o = s:option(ListValue, option_name("alpn"), translate("alpn")) o = s:option(ListValue, option_name("alpn"), translate("alpn"))
o.default = "h2,http/1.1" o.default = "h2,http/1.1"
o:value("h2,http/1.1") o:value("h2,http/1.1")
@ -147,7 +167,7 @@ o:depends({ [option_name("tls")] = true })
o = s:option(FileUpload, option_name("tls_certificateFile"), translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem") o = s:option(FileUpload, option_name("tls_certificateFile"), translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem")
o.default = m:get(s.section, "tls_certificateFile") or "/etc/config/ssl/" .. arg[1] .. ".pem" o.default = m:get(s.section, "tls_certificateFile") or "/etc/config/ssl/" .. arg[1] .. ".pem"
o:depends({ [option_name("tls")] = true }) o:depends({ [option_name("tls")] = true, [option_name("reality")] = false })
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value and value ~= "" then if value and value ~= "" then
if not nixio.fs.access(value) then if not nixio.fs.access(value) then
@ -161,7 +181,7 @@ end
o = s:option(FileUpload, option_name("tls_keyFile"), translate("Private key absolute path"), translate("as:") .. "/etc/ssl/private.key") o = s:option(FileUpload, option_name("tls_keyFile"), translate("Private key absolute path"), translate("as:") .. "/etc/ssl/private.key")
o.default = m:get(s.section, "tls_keyFile") or "/etc/config/ssl/" .. arg[1] .. ".key" o.default = m:get(s.section, "tls_keyFile") or "/etc/config/ssl/" .. arg[1] .. ".key"
o:depends({ [option_name("tls")] = true }) o:depends({ [option_name("tls")] = true, [option_name("reality")] = false })
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value and value ~= "" then if value and value ~= "" then
if not nixio.fs.access(value) then if not nixio.fs.access(value) then

View File

@ -202,6 +202,8 @@ o = s:option(Flag, option_name("tls"), translate("TLS"))
o.default = 0 o.default = 0
o.validate = function(self, value, t) o.validate = function(self, value, t)
if value then if value then
local reality = s.fields[option_name("reality")]:formvalue(t)
if reality and reality == "1" then return value end
if value == "1" then if value == "1" then
local ca = s.fields[option_name("tls_certificateFile")]:formvalue(t) or "" local ca = s.fields[option_name("tls_certificateFile")]:formvalue(t) or ""
local key = s.fields[option_name("tls_keyFile")]:formvalue(t) or "" local key = s.fields[option_name("tls_keyFile")]:formvalue(t) or ""
@ -218,11 +220,38 @@ o:depends({ [option_name("protocol")] = "vmess" })
o:depends({ [option_name("protocol")] = "vless" }) o:depends({ [option_name("protocol")] = "vless" })
o:depends({ [option_name("protocol")] = "trojan" }) o:depends({ [option_name("protocol")] = "trojan" })
if singbox_tags:find("with_reality_server") then
-- [[ REALITY部分 ]] --
o = s:option(Flag, option_name("reality"), translate("REALITY"))
o.default = 0
o:depends({ [option_name("protocol")] = "vless", [option_name("tls")] = true })
o:depends({ [option_name("protocol")] = "vmess", [option_name("tls")] = true })
o:depends({ [option_name("protocol")] = "shadowsocks", [option_name("tls")] = true })
o:depends({ [option_name("protocol")] = "http", [option_name("tls")] = true })
o:depends({ [option_name("protocol")] = "trojan", [option_name("tls")] = true })
o = s:option(Value, option_name("reality_private_key"), translate("Private Key"))
o:depends({ [option_name("reality")] = true })
o = s:option(Value, option_name("reality_shortId"), translate("Short Id"))
o:depends({ [option_name("reality")] = true })
o = s:option(Value, option_name("reality_handshake_server"), translate("Handshake Server"))
o.default = "google.com"
o:depends({ [option_name("reality")] = true })
o = s:option(Value, option_name("reality_handshake_server_port"), translate("Handshake Server Port"))
o.datatype = "port"
o.default = "443"
o:depends({ [option_name("reality")] = true })
end
-- [[ TLS部分 ]] -- -- [[ TLS部分 ]] --
o = s:option(FileUpload, option_name("tls_certificateFile"), translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem") o = s:option(FileUpload, option_name("tls_certificateFile"), translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem")
o.default = m:get(s.section, "tls_certificateFile") or "/etc/config/ssl/" .. arg[1] .. ".pem" o.default = m:get(s.section, "tls_certificateFile") or "/etc/config/ssl/" .. arg[1] .. ".pem"
o:depends({ [option_name("tls")] = true }) o:depends({ [option_name("tls")] = true, [option_name("reality")] = false })
o:depends({ [option_name("protocol")] = "naive" })
o:depends({ [option_name("protocol")] = "hysteria" }) o:depends({ [option_name("protocol")] = "hysteria" })
o:depends({ [option_name("protocol")] = "tuic" }) o:depends({ [option_name("protocol")] = "tuic" })
o:depends({ [option_name("protocol")] = "hysteria2" }) o:depends({ [option_name("protocol")] = "hysteria2" })
@ -239,7 +268,8 @@ end
o = s:option(FileUpload, option_name("tls_keyFile"), translate("Private key absolute path"), translate("as:") .. "/etc/ssl/private.key") o = s:option(FileUpload, option_name("tls_keyFile"), translate("Private key absolute path"), translate("as:") .. "/etc/ssl/private.key")
o.default = m:get(s.section, "tls_keyFile") or "/etc/config/ssl/" .. arg[1] .. ".key" o.default = m:get(s.section, "tls_keyFile") or "/etc/config/ssl/" .. arg[1] .. ".key"
o:depends({ [option_name("tls")] = true }) o:depends({ [option_name("tls")] = true, [option_name("reality")] = false })
o:depends({ [option_name("protocol")] = "naive" })
o:depends({ [option_name("protocol")] = "hysteria" }) o:depends({ [option_name("protocol")] = "hysteria" })
o:depends({ [option_name("protocol")] = "tuic" }) o:depends({ [option_name("protocol")] = "tuic" })
o:depends({ [option_name("protocol")] = "hysteria2" }) o:depends({ [option_name("protocol")] = "hysteria2" })

View File

@ -111,6 +111,7 @@ function gen_outbound(flag, node, tag, proxy_table)
enabled = true, enabled = true,
protocol = node.mux_type or "h2mux", protocol = node.mux_type or "h2mux",
max_connections = tonumber(node.mux_concurrency) or 4, max_connections = tonumber(node.mux_concurrency) or 4,
padding = (node.mux_padding == "1") and true or false
--min_streams = 4, --min_streams = 4,
--max_streams = 0, --max_streams = 0,
} }
@ -215,9 +216,9 @@ function gen_outbound(flag, node, tag, proxy_table)
protocol_table = { protocol_table = {
uuid = node.uuid, uuid = node.uuid,
security = node.security, security = node.security,
alter_id = 0, alter_id = (node.alter_id) and tonumber(node.alter_id) or 0,
global_padding = false, global_padding = (node.global_padding == "1") and true or false,
authenticated_length = true, authenticated_length = (node.authenticated_length == "1") and true or false,
tls = tls, tls = tls,
packet_encoding = "", --UDP 包编码。(空):禁用 packetaddr由 v2ray 5+ 支持 xudp由 xray 支持 packet_encoding = "", --UDP 包编码。(空):禁用 packetaddr由 v2ray 5+ 支持 xudp由 xray 支持
multiplex = mux, multiplex = mux,
@ -231,6 +232,7 @@ function gen_outbound(flag, node, tag, proxy_table)
flow = (node.tls == '1' and node.flow) and node.flow or nil, flow = (node.tls == '1' and node.flow) and node.flow or nil,
tls = tls, tls = tls,
packet_encoding = "xudp", --UDP 包编码。(空):禁用 packetaddr由 v2ray 5+ 支持 xudp由 xray 支持 packet_encoding = "xudp", --UDP 包编码。(空):禁用 packetaddr由 v2ray 5+ 支持 xudp由 xray 支持
multiplex = mux,
transport = v2ray_transport, transport = v2ray_transport,
} }
end end
@ -345,13 +347,25 @@ function gen_config_server(node)
{ type = "block", tag = "block" } { type = "block", tag = "block" }
} }
local tls = nil local tls = {
enabled = true,
certificate_path = node.tls_certificateFile,
key_path = node.tls_keyFile,
}
if node.tls == "1" then if node.tls == "1" and node.reality == "1" then
tls = { tls.certificate_path = nil
tls.key_path = nil
tls.reality = {
enabled = true, enabled = true,
certificate_path = node.tls_certificateFile, private_key = node.reality_private_key,
key_path = node.tls_keyFile, short_id = {
node.reality_shortId
},
handshake = {
server = node.reality_handshake_server,
server_port = tonumber(node.reality_handshake_server_port)
}
} }
end end
@ -428,7 +442,7 @@ function gen_config_server(node)
password = node.password password = node.password
} }
} or nil, } or nil,
tls = tls, tls = (node.tls == "1") and tls or nil,
} }
end end
@ -451,7 +465,7 @@ function gen_config_server(node)
end end
protocol_table = { protocol_table = {
users = users, users = users,
tls = tls, tls = (node.tls == "1") and tls or nil,
transport = v2ray_transport, transport = v2ray_transport,
} }
end end
@ -469,7 +483,7 @@ function gen_config_server(node)
end end
protocol_table = { protocol_table = {
users = users, users = users,
tls = tls, tls = (node.tls == "1") and tls or nil,
transport = v2ray_transport, transport = v2ray_transport,
} }
end end
@ -481,12 +495,12 @@ function gen_config_server(node)
for i = 1, #node.uuid do for i = 1, #node.uuid do
users[i] = { users[i] = {
name = node.uuid[i], name = node.uuid[i],
uuid = node.uuid[i], password = node.uuid[i],
} }
end end
protocol_table = { protocol_table = {
users = users, users = users,
tls = tls, tls = (node.tls == "1") and tls or nil,
fallback = nil, fallback = nil,
fallback_for_alpn = nil, fallback_for_alpn = nil,
transport = v2ray_transport, transport = v2ray_transport,
@ -502,11 +516,14 @@ function gen_config_server(node)
password = node.password password = node.password
} }
}, },
tls = tls, tls = tls
} }
end end
if node.protocol == "hysteria" then if node.protocol == "hysteria" then
tls.alpn = (node.hysteria_alpn and node.hysteria_alpn ~= "") and {
node.hysteria_alpn
} or nil
protocol_table = { protocol_table = {
up = node.hysteria_up_mbps .. " Mbps", up = node.hysteria_up_mbps .. " Mbps",
down = node.hysteria_down_mbps .. " Mbps", down = node.hysteria_down_mbps .. " Mbps",
@ -524,18 +541,14 @@ function gen_config_server(node)
recv_window_client = node.hysteria_recv_window_client and tonumber(node.hysteria_recv_window_client) or nil, recv_window_client = node.hysteria_recv_window_client and tonumber(node.hysteria_recv_window_client) or nil,
max_conn_client = node.hysteria_max_conn_client and tonumber(node.hysteria_max_conn_client) or nil, max_conn_client = node.hysteria_max_conn_client and tonumber(node.hysteria_max_conn_client) or nil,
disable_mtu_discovery = (node.hysteria_disable_mtu_discovery == "1") and true or false, disable_mtu_discovery = (node.hysteria_disable_mtu_discovery == "1") and true or false,
tls = { tls = tls
enabled = true,
certificate_path = node.tls_certificateFile,
key_path = node.tls_keyFile,
alpn = (node.hysteria_alpn and node.hysteria_alpn ~= "") and {
node.hysteria_alpn
} or nil
}
} }
end end
if node.protocol == "tuic" then if node.protocol == "tuic" then
tls.alpn = (node.tuic_alpn and node.tuic_alpn ~= "") and {
node.tuic_alpn
} or nil
protocol_table = { protocol_table = {
users = { users = {
{ {
@ -547,14 +560,7 @@ function gen_config_server(node)
congestion_control = node.tuic_congestion_control or "cubic", congestion_control = node.tuic_congestion_control or "cubic",
zero_rtt_handshake = (node.tuic_zero_rtt_handshake == "1") and true or false, zero_rtt_handshake = (node.tuic_zero_rtt_handshake == "1") and true or false,
heartbeat = node.tuic_heartbeat .. "s", heartbeat = node.tuic_heartbeat .. "s",
tls = { tls = tls
enabled = true,
certificate_path = node.tls_certificateFile,
key_path = node.tls_keyFile,
alpn = (node.tuic_alpn and node.tuic_alpn ~= "") and {
node.tuic_alpn
} or nil,
}
} }
end end
@ -573,11 +579,7 @@ function gen_config_server(node)
} }
}, },
ignore_client_bandwidth = (node.hysteria2_ignore_client_bandwidth == "1") and true or false, ignore_client_bandwidth = (node.hysteria2_ignore_client_bandwidth == "1") and true or false,
tls = { tls = tls
enabled = true,
certificate_path = node.tls_certificateFile,
key_path = node.tls_keyFile,
}
} }
end end
@ -1278,6 +1280,7 @@ function gen_config(var)
default_dns_flag = "direct" default_dns_flag = "direct"
end end
end end
else default_dns_flag = "direct"
end end
dns.final = default_dns_flag dns.final = default_dns_flag
end end

View File

@ -482,6 +482,21 @@ function gen_config_server(node)
if "1" == node.tls then if "1" == node.tls then
config.inbounds[1].streamSettings.security = "tls" config.inbounds[1].streamSettings.security = "tls"
if "1" == node.reality then
config.inbounds[1].streamSettings.tlsSettings = nil
config.inbounds[1].streamSettings.security = "reality"
config.inbounds[1].streamSettings.realitySettings = {
show = false,
dest = node.reality_dest,
serverNames = {
node.reality_serverNames
},
privateKey = node.reality_private_key,
shortIds = {
node.reality_shortId
}
} or nil
end
end end
return config return config

View File

@ -1303,6 +1303,9 @@ msgstr "XUDP 最大并发连接数"
msgid "Mux idle timeout" msgid "Mux idle timeout"
msgstr "最大闲置时间" msgstr "最大闲置时间"
msgid "Padding"
msgstr "填充"
msgid "Enable early data" msgid "Enable early data"
msgstr "启用前置数据" msgstr "启用前置数据"
@ -1371,3 +1374,15 @@ msgstr "覆盖连接目标地址"
msgid "Override the connection destination address with the sniffed domain." msgid "Override the connection destination address with the sniffed domain."
msgstr "用探测出的域名覆盖连接目标地址。" msgstr "用探测出的域名覆盖连接目标地址。"
msgid "Handshake Server"
msgstr "握手服务器"
msgid "Handshake Server Port"
msgstr "握手服务器端口"
msgid "Protocol parameter. Will waste traffic randomly if enabled."
msgstr "协议参数。 如果启用会随机浪费流量。"
msgid "Protocol parameter. Enable length block encryption."
msgstr "协议参数。启用长度块加密。"

View File

@ -114,12 +114,17 @@ destroy_nftset() {
insert_nftset() { insert_nftset() {
local nftset_name="${1}"; shift local nftset_name="${1}"; shift
local timeout_argument="${1}"; shift
local defalut_timeout_argument="3650d"
local nftset_elements local nftset_elements
nftset_elements=$(echo -e $@ | sed 's/\s/, /g') [ -n "${1}" ] && {
[ -n "${nftset_elements}" ] && { if [ "$timeout_argument" == "0" ]; then
nftset_elements=$(echo -e $@ | sed "s/\s/ timeout $defalut_timeout_argument, /g" | sed "s/$/ timeout $defalut_timeout_argument/")
else
nftset_elements=$(echo -e $@ | sed "s/\s/ timeout $timeout_argument, /g" | sed "s/$/ timeout $timeout_argument/")
fi
mkdir -p $TMP_PATH2/nftset mkdir -p $TMP_PATH2/nftset
cat > "$TMP_PATH2/nftset/$nftset_name" <<-EOF cat > "$TMP_PATH2/nftset/$nftset_name" <<-EOF
define $nftset_name = {$nftset_elements} define $nftset_name = {$nftset_elements}
add element inet fw4 $nftset_name \$$nftset_name add element inet fw4 $nftset_name \$$nftset_name
@ -132,12 +137,20 @@ insert_nftset() {
gen_nftset() { gen_nftset() {
local nftset_name="${1}"; shift local nftset_name="${1}"; shift
local ip_type="${1}"; shift local ip_type="${1}"; shift
# 0 - don't set defalut timeout
local timeout_argument_set="${1}"; shift
# 0 - don't let element timeout(3650 days)
local timeout_argument_element="${1}"; shift
nft "list set inet fw4 $nftset_name" &>/dev/null nft "list set inet fw4 $nftset_name" &>/dev/null
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
nft "add set inet fw4 $nftset_name { type $ip_type; flags interval; auto-merge; }" if [ "$timeout_argument_set" == "0" ]; then
nft "add set inet fw4 $nftset_name { type $ip_type; flags interval, timeout; auto-merge; }"
else
nft "add set inet fw4 $nftset_name { type $ip_type; flags interval, timeout; timeout $timeout_argument_set; gc-interval $timeout_argument_set; auto-merge; }"
fi
fi fi
[ -n "${1}" ] && insert_nftset $nftset_name $@ [ -n "${1}" ] && insert_nftset $nftset_name $timeout_argument_element $@
} }
get_action_chain_name() { get_action_chain_name() {
@ -245,8 +258,8 @@ load_acl() {
local nftset_whitelist="passwall2_${sid}_whitelist" local nftset_whitelist="passwall2_${sid}_whitelist"
local nftset_whitelist6="passwall2_${sid}_whitelist6" local nftset_whitelist6="passwall2_${sid}_whitelist6"
gen_nftset $nftset_whitelist ipv4_addr gen_nftset $nftset_whitelist 0 0 ipv4_addr
gen_nftset $nftset_whitelist6 ipv6_addr gen_nftset $nftset_whitelist6 0 0 ipv6_addr
[ -n "$redir_port" ] && { [ -n "$redir_port" ] && {
if [ "$tcp_proxy_mode" != "disable" ]; then if [ "$tcp_proxy_mode" != "disable" ]; then
@ -264,11 +277,13 @@ load_acl() {
[ "$accept_icmp" = "1" ] && { [ "$accept_icmp" = "1" ] && {
nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr $FAKE_IP $(REDIRECT) comment \"$remarks\"" nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr $FAKE_IP $(REDIRECT) comment \"$remarks\""
nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} $(REDIRECT) comment \"$remarks\"" nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} $(REDIRECT) comment \"$remarks\""
nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} return comment \"$remarks\""
} }
[ "$accept_icmpv6" = "1" ] && [ "$PROXY_IPV6" == "1" ] && { [ "$accept_icmpv6" = "1" ] && [ "$PROXY_IPV6" == "1" ] && {
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \"$remarks\"" 2>/dev/null nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \"$remarks\"" 2>/dev/null
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} $(REDIRECT) comment \"$remarks\"" 2>/dev/null nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} $(REDIRECT) comment \"$remarks\"" 2>/dev/null
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} return comment \"$remarks\"" 2>/dev/null
} }
[ "$tcp_no_redir_ports" != "disable" ] && { [ "$tcp_no_redir_ports" != "disable" ] && {
@ -362,11 +377,13 @@ load_acl() {
[ "$accept_icmp" = "1" ] && { [ "$accept_icmp" = "1" ] && {
nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp ip daddr $FAKE_IP $(REDIRECT) comment \"默认\"" nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp ip daddr $FAKE_IP $(REDIRECT) comment \"默认\""
nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp $(REDIRECT) comment \"默认\"" nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp $(REDIRECT) comment \"默认\""
nft "add rule inet fw4 PSW2_ICMP_REDIRECT ip protocol icmp return comment \"默认\""
} }
[ "$accept_icmpv6" = "1" ] && [ "$PROXY_IPV6" == "1" ] && { [ "$accept_icmpv6" = "1" ] && [ "$PROXY_IPV6" == "1" ] && {
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \"默认\"" nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \"默认\""
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 $(REDIRECT) comment \"默认\"" nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 $(REDIRECT) comment \"默认\""
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 return comment \"默认\""
} }
if [ -z "${is_tproxy}" ]; then if [ -z "${is_tproxy}" ]; then
@ -424,7 +441,7 @@ load_acl() {
filter_haproxy() { filter_haproxy() {
for item in $(uci show $CONFIG | grep ".lbss=" | cut -d "'" -f 2); do for item in $(uci show $CONFIG | grep ".lbss=" | cut -d "'" -f 2); do
local ip=$(get_host_ip ipv4 $(echo $item | awk -F ":" '{print $1}') 1) local ip=$(get_host_ip ipv4 $(echo $item | awk -F ":" '{print $1}') 1)
[ -n "$ip" ] && insert_nftset $NFTSET_VPSLIST $ip [ -n "$ip" ] && insert_nftset $NFTSET_VPSLIST 0 $ip
done done
echolog "加入负载均衡的节点到nftset[$NFTSET_VPSLIST]直连完成" echolog "加入负载均衡的节点到nftset[$NFTSET_VPSLIST]直连完成"
} }
@ -433,14 +450,14 @@ filter_vps_addr() {
for server_host in $@; do for server_host in $@; do
local vps_ip4=$(get_host_ip "ipv4" ${server_host}) local vps_ip4=$(get_host_ip "ipv4" ${server_host})
local vps_ip6=$(get_host_ip "ipv6" ${server_host}) local vps_ip6=$(get_host_ip "ipv6" ${server_host})
[ -n "$vps_ip4" ] && insert_nftset $NFTSET_VPSLIST $vps_ip4 [ -n "$vps_ip4" ] && insert_nftset $NFTSET_VPSLIST 0 $vps_ip4
[ -n "$vps_ip6" ] && insert_nftset $NFTSET_VPSLIST6 $vps_ip6 [ -n "$vps_ip6" ] && insert_nftset $NFTSET_VPSLIST6 0 $vps_ip6
done done
} }
filter_vpsip() { filter_vpsip() {
insert_nftset $NFTSET_VPSLIST $(uci show $CONFIG | grep ".address=" | cut -d "'" -f 2 | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sed -e "/^$/d") insert_nftset $NFTSET_VPSLIST 0 $(uci show $CONFIG | grep ".address=" | cut -d "'" -f 2 | grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sed -e "/^$/d")
insert_nftset $NFTSET_VPSLIST6 $(uci show $CONFIG | grep ".address=" | cut -d "'" -f 2 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | sed -e "/^$/d") insert_nftset $NFTSET_VPSLIST6 0 $(uci show $CONFIG | grep ".address=" | cut -d "'" -f 2 | grep -E "([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}" | sed -e "/^$/d")
echolog "加入所有节点到nftset[$NFTSET_VPSLIST]直连完成" echolog "加入所有节点到nftset[$NFTSET_VPSLIST]直连完成"
} }
@ -553,11 +570,11 @@ dns_hijack() {
add_firewall_rule() { add_firewall_rule() {
echolog "开始加载防火墙规则..." echolog "开始加载防火墙规则..."
gen_nftset $NFTSET_LANLIST ipv4_addr $(gen_lanlist) gen_nftset $NFTSET_LANLIST ipv4_addr 0 0 $(gen_lanlist)
gen_nftset $NFTSET_VPSLIST ipv4_addr gen_nftset $NFTSET_VPSLIST ipv4_addr 0 0
gen_nftset $NFTSET_LANLIST6 ipv6_addr $(gen_lanlist_6) gen_nftset $NFTSET_LANLIST6 ipv6_addr 0 0 $(gen_lanlist_6)
gen_nftset $NFTSET_VPSLIST6 ipv6_addr gen_nftset $NFTSET_VPSLIST6 ipv6_addr 0 0
# 忽略特殊IP段 # 忽略特殊IP段
local lan_ifname lan_ip local lan_ifname lan_ip
@ -568,14 +585,14 @@ add_firewall_rule() {
#echolog "本机IPv4网段互访直连${lan_ip}" #echolog "本机IPv4网段互访直连${lan_ip}"
#echolog "本机IPv6网段互访直连${lan_ip6}" #echolog "本机IPv6网段互访直连${lan_ip6}"
[ -n "$lan_ip" ] && insert_nftset $NFTSET_LANLIST $(echo $lan_ip | sed -e "s/ /\n/g") [ -n "$lan_ip" ] && insert_nftset $NFTSET_LANLIST 0 $(echo $lan_ip | sed -e "s/ /\n/g")
[ -n "$lan_ip6" ] && insert_nftset $NFTSET_LANLIST6 $(echo $lan_ip6 | sed -e "s/ /\n/g") [ -n "$lan_ip6" ] && insert_nftset $NFTSET_LANLIST6 0 $(echo $lan_ip6 | sed -e "s/ /\n/g")
} }
[ -n "$ISP_DNS" ] && { [ -n "$ISP_DNS" ] && {
#echolog "处理 ISP DNS 例外..." #echolog "处理 ISP DNS 例外..."
for ispip in $ISP_DNS; do for ispip in $ISP_DNS; do
insert_nftset $NFTSET_LANLIST $ispip >/dev/null 2>&1 & insert_nftset $NFTSET_LANLIST 0 $ispip >/dev/null 2>&1 &
#echolog " - 追加到白名单:${ispip}" #echolog " - 追加到白名单:${ispip}"
done done
} }
@ -583,15 +600,15 @@ add_firewall_rule() {
[ -n "$ISP_DNS6" ] && { [ -n "$ISP_DNS6" ] && {
#echolog "处理 ISP IPv6 DNS 例外..." #echolog "处理 ISP IPv6 DNS 例外..."
for ispip6 in $ISP_DNS6; do for ispip6 in $ISP_DNS6; do
insert_nftset $NFTSET_LANLIST6 $ispip6 >/dev/null 2>&1 & insert_nftset $NFTSET_LANLIST6 0 $ispip6 >/dev/null 2>&1 &
#echolog " - 追加到白名单:${ispip6}" #echolog " - 追加到白名单:${ispip6}"
done done
} }
local nftset_global_whitelist="passwall2_global_whitelist" local nftset_global_whitelist="passwall2_global_whitelist"
local nftset_global_whitelist6="passwall2_global_whitelist6" local nftset_global_whitelist6="passwall2_global_whitelist6"
gen_nftset $nftset_global_whitelist ipv4_addr gen_nftset $nftset_global_whitelist 0 0 ipv4_addr
gen_nftset $nftset_global_whitelist6 ipv6_addr gen_nftset $nftset_global_whitelist6 0 0 ipv6_addr
# 过滤所有节点IP # 过滤所有节点IP
filter_vpsip > /dev/null 2>&1 & filter_vpsip > /dev/null 2>&1 &
@ -744,13 +761,15 @@ add_firewall_rule() {
echolog "加载路由器自身 TCP 代理..." echolog "加载路由器自身 TCP 代理..."
[ "$accept_icmp" = "1" ] && { [ "$accept_icmp" = "1" ] && {
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmp ip daddr $FAKE_IP counter redirect" nft "add rule inet fw4 PSW2_ICMP_REDIRECT oif lo ip protocol icmp ip daddr $FAKE_IP counter redirect"
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmp counter redirect" nft "add rule inet fw4 PSW2_ICMP_REDIRECT oif lo ip protocol icmp counter redirect"
nft "add rule inet fw4 PSW2_ICMP_REDIRECT oif lo ip protocol icmp counter return"
} }
[ "$accept_icmpv6" = "1" ] && { [ "$accept_icmpv6" = "1" ] && {
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 counter redirect" nft "add rule inet fw4 PSW2_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 counter redirect"
nft "add rule inet fw4 PSW2_ICMP_REDIRECT meta l4proto icmpv6 counter redirect" nft "add rule inet fw4 PSW2_ICMP_REDIRECT oif lo meta l4proto counter redirect"
nft "add rule inet fw4 PSW2_ICMP_REDIRECT oif lo meta l4proto icmpv6 counter return"
} }
[ -n "${is_tproxy}" ] && { [ -n "${is_tproxy}" ] && {

View File

@ -396,6 +396,7 @@ local function processData(szType, content, add_mode, add_from)
result.address = info.add result.address = info.add
result.port = info.port result.port = info.port
result.protocol = 'vmess' result.protocol = 'vmess'
result.alter_id = info.aid
result.uuid = info.id result.uuid = info.id
result.remarks = info.ps result.remarks = info.ps
-- result.mux = 1 -- result.mux = 1