parent
e674faa722
commit
cedddee5bc
@ -9,6 +9,7 @@ local split = api.split
|
|||||||
|
|
||||||
local local_version = api.get_app_version("sing-box")
|
local local_version = api.get_app_version("sing-box")
|
||||||
local version_ge_1_11_0 = api.compare_versions(local_version:match("[^v]+"), ">=", "1.11.0")
|
local version_ge_1_11_0 = api.compare_versions(local_version:match("[^v]+"), ">=", "1.11.0")
|
||||||
|
local version_ge_1_12_0 = api.compare_versions(local_version:match("[^v]+"), ">=", "1.12.0")
|
||||||
|
|
||||||
local geosite_all_tag = {}
|
local geosite_all_tag = {}
|
||||||
local geoip_all_tag = {}
|
local geoip_all_tag = {}
|
||||||
@ -126,6 +127,18 @@ function gen_outbound(flag, node, tag, proxy_table)
|
|||||||
detour = node.detour,
|
detour = node.detour,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if version_ge_1_12_0 then
|
||||||
|
--https://sing-box.sagernet.org/migration/#migrate-outbound-domain-strategy-option-to-domain-resolver
|
||||||
|
result.domain_strategy = nil
|
||||||
|
if node.domain_strategy then
|
||||||
|
local domain_resolver = {
|
||||||
|
server = "direct",
|
||||||
|
strategy = node.domain_strategy
|
||||||
|
}
|
||||||
|
result.domain_resolver = domain_resolver
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local tls = nil
|
local tls = nil
|
||||||
if node.tls == "1" then
|
if node.tls == "1" then
|
||||||
local alpn = nil
|
local alpn = nil
|
||||||
@ -841,6 +854,7 @@ function gen_config(var)
|
|||||||
local direct_dns_tcp_server = var["-direct_dns_tcp_server"]
|
local direct_dns_tcp_server = var["-direct_dns_tcp_server"]
|
||||||
local direct_dns_dot_server = var["-direct_dns_dot_server"]
|
local direct_dns_dot_server = var["-direct_dns_dot_server"]
|
||||||
local direct_dns_query_strategy = var["-direct_dns_query_strategy"]
|
local direct_dns_query_strategy = var["-direct_dns_query_strategy"]
|
||||||
|
local remote_dns_server = var["-remote_dns_server"]
|
||||||
local remote_dns_port = var["-remote_dns_port"]
|
local remote_dns_port = var["-remote_dns_port"]
|
||||||
local remote_dns_udp_server = var["-remote_dns_udp_server"]
|
local remote_dns_udp_server = var["-remote_dns_udp_server"]
|
||||||
local remote_dns_tcp_server = var["-remote_dns_tcp_server"]
|
local remote_dns_tcp_server = var["-remote_dns_tcp_server"]
|
||||||
@ -1420,10 +1434,12 @@ function gen_config(var)
|
|||||||
fakeip = nil,
|
fakeip = nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
table.insert(dns.servers, {
|
if not version_ge_1_12_0 then --Migrate to new DNS server formats
|
||||||
tag = "block",
|
table.insert(dns.servers, {
|
||||||
address = "rcode://success",
|
tag = "block",
|
||||||
})
|
address = "rcode://success",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
if dns_socks_address and dns_socks_port then
|
if dns_socks_address and dns_socks_port then
|
||||||
default_outTag = "dns_socks_out"
|
default_outTag = "dns_socks_out"
|
||||||
@ -1444,57 +1460,118 @@ function gen_config(var)
|
|||||||
remote_strategy = "ipv6_only"
|
remote_strategy = "ipv6_only"
|
||||||
end
|
end
|
||||||
|
|
||||||
local remote_server = {
|
local remote_server = {}
|
||||||
tag = "remote",
|
|
||||||
address_strategy = "prefer_ipv4",
|
|
||||||
strategy = remote_strategy,
|
|
||||||
address_resolver = "direct",
|
|
||||||
detour = default_outTag,
|
|
||||||
client_subnet = (remote_dns_client_ip and remote_dns_client_ip ~= "") and remote_dns_client_ip or nil,
|
|
||||||
}
|
|
||||||
|
|
||||||
if remote_dns_udp_server then
|
|
||||||
local server_port = tonumber(remote_dns_port) or 53
|
|
||||||
remote_server.address = "udp://" .. remote_dns_udp_server .. ":" .. server_port
|
|
||||||
end
|
|
||||||
|
|
||||||
if remote_dns_tcp_server then
|
|
||||||
remote_server.address = remote_dns_tcp_server
|
|
||||||
end
|
|
||||||
|
|
||||||
if remote_dns_doh_url and remote_dns_doh_host then
|
|
||||||
remote_server.address = remote_dns_doh_url
|
|
||||||
end
|
|
||||||
|
|
||||||
if remote_server.address then
|
|
||||||
table.insert(dns.servers, remote_server)
|
|
||||||
end
|
|
||||||
|
|
||||||
local fakedns_tag = "remote_fakeip"
|
local fakedns_tag = "remote_fakeip"
|
||||||
if remote_dns_fake then
|
|
||||||
dns.fakeip = {
|
|
||||||
enabled = true,
|
|
||||||
inet4_range = "198.18.0.0/15",
|
|
||||||
inet6_range = "fc00::/18",
|
|
||||||
}
|
|
||||||
|
|
||||||
table.insert(dns.servers, {
|
|
||||||
tag = fakedns_tag,
|
|
||||||
address = "fakeip",
|
|
||||||
strategy = remote_strategy,
|
|
||||||
})
|
|
||||||
|
|
||||||
if not experimental then
|
if not version_ge_1_12_0 then --Migrate to new DNS server formats
|
||||||
experimental = {}
|
remote_server = {
|
||||||
end
|
tag = "remote",
|
||||||
experimental.cache_file = {
|
address_strategy = "prefer_ipv4",
|
||||||
enabled = true,
|
strategy = remote_strategy,
|
||||||
store_fakeip = true,
|
address_resolver = "direct",
|
||||||
path = api.CACHE_PATH .. "/singbox_" .. flag .. ".db"
|
detour = default_outTag,
|
||||||
|
client_subnet = (remote_dns_client_ip and remote_dns_client_ip ~= "") and remote_dns_client_ip or nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if remote_dns_udp_server then
|
||||||
|
local server_port = tonumber(remote_dns_port) or 53
|
||||||
|
remote_server.address = "udp://" .. remote_dns_udp_server .. ":" .. server_port
|
||||||
|
end
|
||||||
|
|
||||||
|
if remote_dns_tcp_server then
|
||||||
|
remote_server.address = remote_dns_tcp_server
|
||||||
|
end
|
||||||
|
|
||||||
|
if remote_dns_doh_url and remote_dns_doh_host then
|
||||||
|
remote_server.address = remote_dns_doh_url
|
||||||
|
end
|
||||||
|
|
||||||
|
if remote_server.address then
|
||||||
|
table.insert(dns.servers, remote_server)
|
||||||
|
end
|
||||||
|
|
||||||
|
if remote_dns_fake then
|
||||||
|
dns.fakeip = {
|
||||||
|
enabled = true,
|
||||||
|
inet4_range = "198.18.0.0/15",
|
||||||
|
inet6_range = "fc00::/18",
|
||||||
|
}
|
||||||
|
|
||||||
|
table.insert(dns.servers, {
|
||||||
|
tag = fakedns_tag,
|
||||||
|
address = "fakeip",
|
||||||
|
strategy = remote_strategy,
|
||||||
|
})
|
||||||
|
|
||||||
|
if not experimental then
|
||||||
|
experimental = {}
|
||||||
|
end
|
||||||
|
experimental.cache_file = {
|
||||||
|
enabled = true,
|
||||||
|
store_fakeip = true,
|
||||||
|
path = api.CACHE_PATH .. "/singbox_" .. flag .. ".db"
|
||||||
|
}
|
||||||
|
end
|
||||||
|
else -- Migrate to 1.12 DNS
|
||||||
|
remote_server = {
|
||||||
|
tag = "remote",
|
||||||
|
domain_strategy = remote_strategy,
|
||||||
|
domain_resolver = "direct",
|
||||||
|
detour = default_outTag,
|
||||||
|
}
|
||||||
|
|
||||||
|
if remote_dns_udp_server then
|
||||||
|
local server_port = tonumber(remote_dns_port) or 53
|
||||||
|
remote_server.type = "udp"
|
||||||
|
remote_server.server = remote_dns_udp_server
|
||||||
|
remote_server.server_port = server_port
|
||||||
|
end
|
||||||
|
|
||||||
|
if remote_dns_tcp_server then
|
||||||
|
local server_port = tonumber(remote_dns_port) or 53
|
||||||
|
remote_server.type = "tcp"
|
||||||
|
remote_server.server = remote_dns_server
|
||||||
|
remote_server.server_port = server_port
|
||||||
|
end
|
||||||
|
|
||||||
|
if remote_dns_doh_url and remote_dns_doh_host then
|
||||||
|
local server_port = tonumber(remote_dns_port) or 443
|
||||||
|
remote_server.type = "https"
|
||||||
|
remote_server.server = remote_dns_doh_host
|
||||||
|
remote_server.server_port = server_port
|
||||||
|
end
|
||||||
|
|
||||||
|
if remote_server.server then
|
||||||
|
table.insert(dns.servers, remote_server)
|
||||||
|
end
|
||||||
|
|
||||||
|
if remote_dns_fake then
|
||||||
|
table.insert(dns.servers, {
|
||||||
|
tag = fakedns_tag,
|
||||||
|
type = "fakeip",
|
||||||
|
inet4_range = "198.18.0.0/15",
|
||||||
|
inet6_range = "fc00::/18",
|
||||||
|
})
|
||||||
|
|
||||||
|
if not experimental then
|
||||||
|
experimental = {}
|
||||||
|
end
|
||||||
|
experimental.cache_file = {
|
||||||
|
enabled = true,
|
||||||
|
store_fakeip = true,
|
||||||
|
path = api.CACHE_PATH .. "/singbox_" .. flag .. ".db"
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local direct_strategy = "prefer_ipv6"
|
||||||
if direct_dns_udp_server or direct_dns_tcp_server or direct_dns_dot_server then
|
if direct_dns_udp_server or direct_dns_tcp_server or direct_dns_dot_server then
|
||||||
|
if direct_dns_query_strategy == "UseIPv4" then
|
||||||
|
direct_strategy = "ipv4_only"
|
||||||
|
elseif direct_dns_query_strategy == "UseIPv6" then
|
||||||
|
direct_strategy = "ipv6_only"
|
||||||
|
end
|
||||||
|
|
||||||
local domain = {}
|
local domain = {}
|
||||||
local nodes_domain_text = sys.exec('uci show passwall | grep ".address=" | cut -d "\'" -f 2 | grep "[a-zA-Z]$" | sort -u')
|
local nodes_domain_text = sys.exec('uci show passwall | grep ".address=" | cut -d "\'" -f 2 | grep "[a-zA-Z]$" | sort -u')
|
||||||
string.gsub(nodes_domain_text, '[^' .. "\r\n" .. ']+', function(w)
|
string.gsub(nodes_domain_text, '[^' .. "\r\n" .. ']+', function(w)
|
||||||
@ -1503,40 +1580,61 @@ function gen_config(var)
|
|||||||
if #domain > 0 then
|
if #domain > 0 then
|
||||||
table.insert(dns_domain_rules, 1, {
|
table.insert(dns_domain_rules, 1, {
|
||||||
outboundTag = "direct",
|
outboundTag = "direct",
|
||||||
domain = domain
|
domain = domain,
|
||||||
|
strategy = version_ge_1_12_0 and direct_strategy or nil
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
local direct_strategy = "prefer_ipv6"
|
if not version_ge_1_12_0 then --Migrate to new DNS server formats
|
||||||
if direct_dns_query_strategy == "UseIPv4" then
|
local direct_dns_server, port
|
||||||
direct_strategy = "ipv4_only"
|
if direct_dns_udp_server then
|
||||||
elseif direct_dns_query_strategy == "UseIPv6" then
|
port = tonumber(direct_dns_port) or 53
|
||||||
direct_strategy = "ipv6_only"
|
direct_dns_server = "udp://" .. direct_dns_udp_server .. ":" .. port
|
||||||
|
elseif direct_dns_tcp_server then
|
||||||
|
port = tonumber(direct_dns_port) or 53
|
||||||
|
direct_dns_server = "tcp://" .. direct_dns_tcp_server .. ":" .. port
|
||||||
|
elseif direct_dns_dot_server then
|
||||||
|
port = tonumber(direct_dns_port) or 853
|
||||||
|
if direct_dns_dot_server:find(":") == nil then
|
||||||
|
direct_dns_server = "tls://" .. direct_dns_dot_server .. ":" .. port
|
||||||
|
else
|
||||||
|
direct_dns_server = "tls://[" .. direct_dns_dot_server .. "]:" .. port
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(dns.servers, {
|
||||||
|
tag = "direct",
|
||||||
|
address = direct_dns_server,
|
||||||
|
address_strategy = "prefer_ipv6",
|
||||||
|
strategy = direct_strategy,
|
||||||
|
detour = "direct",
|
||||||
|
})
|
||||||
|
else -- Migrate to 1.12 DNS
|
||||||
|
local direct_dns_server, port, type
|
||||||
|
if direct_dns_udp_server then
|
||||||
|
port = tonumber(direct_dns_port) or 53
|
||||||
|
direct_dns_server = direct_dns_udp_server
|
||||||
|
type = "udp"
|
||||||
|
elseif direct_dns_tcp_server then
|
||||||
|
port = tonumber(direct_dns_port) or 53
|
||||||
|
direct_dns_server = direct_dns_tcp_server
|
||||||
|
type = "tcp"
|
||||||
|
elseif direct_dns_dot_server then
|
||||||
|
port = tonumber(direct_dns_port) or 853
|
||||||
|
direct_dns_server = direct_dns_dot_server
|
||||||
|
type = "tls"
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(dns.servers, {
|
||||||
|
tag = "direct",
|
||||||
|
type = type,
|
||||||
|
server = direct_dns_server,
|
||||||
|
server_port = port,
|
||||||
|
domain_strategy = direct_strategy,
|
||||||
|
detour = "direct",
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
local direct_dns_server, port
|
|
||||||
if direct_dns_udp_server then
|
|
||||||
port = tonumber(direct_dns_port) or 53
|
|
||||||
direct_dns_server = "udp://" .. direct_dns_udp_server .. ":" .. port
|
|
||||||
elseif direct_dns_tcp_server then
|
|
||||||
port = tonumber(direct_dns_port) or 53
|
|
||||||
direct_dns_server = "tcp://" .. direct_dns_tcp_server .. ":" .. port
|
|
||||||
elseif direct_dns_dot_server then
|
|
||||||
port = tonumber(direct_dns_port) or 853
|
|
||||||
if direct_dns_dot_server:find(":") == nil then
|
|
||||||
direct_dns_server = "tls://" .. direct_dns_dot_server .. ":" .. port
|
|
||||||
else
|
|
||||||
direct_dns_server = "tls://[" .. direct_dns_dot_server .. "]:" .. port
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
table.insert(dns.servers, {
|
|
||||||
tag = "direct",
|
|
||||||
address = direct_dns_server,
|
|
||||||
address_strategy = "prefer_ipv6",
|
|
||||||
strategy = direct_strategy,
|
|
||||||
detour = "direct",
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local default_dns_flag = "remote"
|
local default_dns_flag = "remote"
|
||||||
@ -1561,6 +1659,9 @@ function gen_config(var)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
dns.final = default_dns_flag
|
dns.final = default_dns_flag
|
||||||
|
if version_ge_1_12_0 then -- Migrate to 1.12 DNS
|
||||||
|
dns.strategy = (default_dns_flag == "direct") and direct_strategy or remote_strategy
|
||||||
|
end
|
||||||
|
|
||||||
--按分流顺序DNS
|
--按分流顺序DNS
|
||||||
if dns_domain_rules and #dns_domain_rules > 0 then
|
if dns_domain_rules and #dns_domain_rules > 0 then
|
||||||
@ -1574,15 +1675,24 @@ function gen_config(var)
|
|||||||
domain_regex = (value.domain_regex and #value.domain_regex > 0) and value.domain_regex or nil,
|
domain_regex = (value.domain_regex and #value.domain_regex > 0) and value.domain_regex or nil,
|
||||||
rule_set = (value.rule_set and #value.rule_set > 0) and value.rule_set or nil, --适配srs
|
rule_set = (value.rule_set and #value.rule_set > 0) and value.rule_set or nil, --适配srs
|
||||||
disable_cache = false,
|
disable_cache = false,
|
||||||
|
strategy = (version_ge_1_12_0 and value.outboundTag == "direct") and direct_strategy or nil --Migrate to 1.12 DNS
|
||||||
}
|
}
|
||||||
|
if version_ge_1_12_0 and value.outboundTag == "block" then --Migrate to 1.12 DNS
|
||||||
|
dns_rule.action = "predefined"
|
||||||
|
dns_rule.rcode = "NOERROR"
|
||||||
|
dns_rule.server = nil
|
||||||
|
dns_rule.disable_cache = nil
|
||||||
|
end
|
||||||
if value.outboundTag ~= "block" and value.outboundTag ~= "direct" then
|
if value.outboundTag ~= "block" and value.outboundTag ~= "direct" then
|
||||||
dns_rule.server = "remote"
|
dns_rule.server = "remote"
|
||||||
if value.outboundTag ~= COMMON.default_outbound_tag and remote_server.address then
|
dns_rule.strategy = version_ge_1_12_0 and remote_strategy or nil --Migrate to 1.12 DNS
|
||||||
local remote_dns_server = api.clone(remote_server)
|
dns_rule.client_subnet = (version_ge_1_12_0 and remote_dns_client_ip and remote_dns_client_ip ~= "") and remote_dns_client_ip or nil --Migrate to 1.12 DNS
|
||||||
remote_dns_server.tag = value.outboundTag
|
if value.outboundTag ~= COMMON.default_outbound_tag and (remote_server.address or remote_server.server) then
|
||||||
remote_dns_server.detour = value.outboundTag
|
local remote_shunt_server = api.clone(remote_server)
|
||||||
table.insert(dns.servers, remote_dns_server)
|
remote_shunt_server.tag = value.outboundTag
|
||||||
dns_rule.server = remote_dns_server.tag
|
remote_shunt_server.detour = value.outboundTag
|
||||||
|
table.insert(dns.servers, remote_shunt_server)
|
||||||
|
dns_rule.server = remote_shunt_server.tag
|
||||||
end
|
end
|
||||||
if remote_dns_fake then
|
if remote_dns_fake then
|
||||||
local fakedns_dns_rule = api.clone(dns_rule)
|
local fakedns_dns_rule = api.clone(dns_rule)
|
||||||
@ -1638,12 +1748,23 @@ function gen_config(var)
|
|||||||
--实验性
|
--实验性
|
||||||
experimental = experimental,
|
experimental = experimental,
|
||||||
}
|
}
|
||||||
table.insert(outbounds, {
|
|
||||||
|
local direct_outbound = {
|
||||||
type = "direct",
|
type = "direct",
|
||||||
tag = "direct",
|
tag = "direct",
|
||||||
routing_mark = 255,
|
routing_mark = 255,
|
||||||
domain_strategy = "prefer_ipv6",
|
}
|
||||||
})
|
if not version_ge_1_12_0 then --Migrate to 1.12 DNS
|
||||||
|
direct_outbound.domain_strategy = "prefer_ipv6"
|
||||||
|
else
|
||||||
|
local domain_resolver = {
|
||||||
|
server = "direct",
|
||||||
|
strategy = "prefer_ipv6"
|
||||||
|
}
|
||||||
|
direct_outbound.domain_resolver = domain_resolver
|
||||||
|
end
|
||||||
|
table.insert(outbounds,direct_outbound)
|
||||||
|
|
||||||
table.insert(outbounds, {
|
table.insert(outbounds, {
|
||||||
type = "block",
|
type = "block",
|
||||||
tag = "block"
|
tag = "block"
|
||||||
|
Loading…
Reference in New Issue
Block a user