Merge Mainline

This commit is contained in:
CN_SZTL 2020-07-23 02:02:02 +08:00
commit 0b8a71d166
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
16 changed files with 303 additions and 118 deletions

View File

@ -59,3 +59,9 @@ config dns_servers
option type 'tls' option type 'tls'
option enabled '0' option enabled '0'
option group 'fallback' option group 'fallback'
config dns_servers
option ip 'doh.rixcloud.dev/dns-query'
option type 'https'
option enabled '0'
option group 'fallback'

View File

@ -275,7 +275,9 @@ yml_dns_check()
sed -i '/^Proxy:/i\ nameserver:' "$CONFIG_FILE" 2>/dev/null sed -i '/^Proxy:/i\ nameserver:' "$CONFIG_FILE" 2>/dev/null
fi 2>/dev/null fi 2>/dev/null
sed -i "/^ \{0,\}nameserver:/a\ - tls://8.8.8.8:853" "$CONFIG_FILE" 2>/dev/null sed -i "/^ \{0,\}nameserver:/a\ - tls://8.8.8.8:853" "$CONFIG_FILE" 2>/dev/null
sed -i "/^ \{0,\}nameserver:/a\ - https://doh.rixcloud.dev/dns-query" "$CONFIG_FILE" 2>/dev/null
sed -i "/^ \{0,\}nameserver:/a\ fallback:" "$CONFIG_FILE" 2>/dev/null sed -i "/^ \{0,\}nameserver:/a\ fallback:" "$CONFIG_FILE" 2>/dev/null
sed -i "/^ \{0,\}nameserver:/a\ - 223.5.5.5" "$CONFIG_FILE" 2>/dev/null
sed -i "/^ \{0,\}nameserver:/a\ - 114.114.114.114" "$CONFIG_FILE" 2>/dev/null sed -i "/^ \{0,\}nameserver:/a\ - 114.114.114.114" "$CONFIG_FILE" 2>/dev/null
fi fi
@ -656,8 +658,6 @@ sed -i '/OpenClash-Game-Rules-End/d' "$RULE_FILE" 2>/dev/null
sed -i '1,/^ \{0,\}- GEOIP,/{/^ \{0,\}- GEOIP,/s/^ \{0,\}- GEOIP,/#===================== OpenClash-Game-Rules =====================#\n&/}' "$RULE_FILE" 2>/dev/null sed -i '1,/^ \{0,\}- GEOIP,/{/^ \{0,\}- GEOIP,/s/^ \{0,\}- GEOIP,/#===================== OpenClash-Game-Rules =====================#\n&/}' "$RULE_FILE" 2>/dev/null
elif [ -n "$(grep "^ \{0,\}- MATCH," "$RULE_FILE")" ]; then elif [ -n "$(grep "^ \{0,\}- MATCH," "$RULE_FILE")" ]; then
sed -i '1,/^ \{0,\}- MATCH,/{/^ \{0,\}- MATCH,/s/^ \{0,\}- MATCH,/#===================== OpenClash-Game-Rules =====================#\n&/}' "$RULE_FILE" 2>/dev/null sed -i '1,/^ \{0,\}- MATCH,/{/^ \{0,\}- MATCH,/s/^ \{0,\}- MATCH,/#===================== OpenClash-Game-Rules =====================#\n&/}' "$RULE_FILE" 2>/dev/null
elif [ -n "$(grep "^ \{0,\}- FINAL," "$RULE_FILE")" ]; then
sed -i '1,/^ \{0,\}- FINAL,/{/^ \{0,\}- FINAL,/s/^ \{0,\}- FINAL,/#===================== OpenClash-Game-Rules =====================#\n&/}' "$RULE_FILE" 2>/dev/null
else else
echo "#===================== OpenClash-Game-Rules =====================#" >> "$RULE_FILE" 2>/dev/null echo "#===================== OpenClash-Game-Rules =====================#" >> "$RULE_FILE" 2>/dev/null
fi fi
@ -705,9 +705,6 @@ yml_rule_set_add()
elif [ -n "$(grep "^ \{0,\}- MATCH," "$RULE_FILE")" ]; then elif [ -n "$(grep "^ \{0,\}- MATCH," "$RULE_FILE")" ]; then
sed -i '1,/^ \{0,\}- MATCH,/{/^ \{0,\}- MATCH,/s/^ \{0,\}- MATCH,/#===================== OpenClash-Rule-Set-Extended-End =====================#\n&/}' "$RULE_FILE" 2>/dev/null sed -i '1,/^ \{0,\}- MATCH,/{/^ \{0,\}- MATCH,/s/^ \{0,\}- MATCH,/#===================== OpenClash-Rule-Set-Extended-End =====================#\n&/}' "$RULE_FILE" 2>/dev/null
sed -i "/OpenClash-Rule-Set-Extended-End/i\#===================== OpenClash-Rule-Set-Extended =====================#" "$RULE_FILE" 2>/dev/null sed -i "/OpenClash-Rule-Set-Extended-End/i\#===================== OpenClash-Rule-Set-Extended =====================#" "$RULE_FILE" 2>/dev/null
elif [ -n "$(grep "^ \{0,\}- FINAL," "$RULE_FILE")" ]; then
sed -i '1,/^ \{0,\}- FINAL,/{/^ \{0,\}- FINAL,/s/^ \{0,\}- FINAL,/#===================== OpenClash-Rule-Set-Extended-End =====================#\n&/}' "$RULE_FILE" 2>/dev/null
sed -i "/OpenClash-Rule-Set-Extended-End/i\#===================== OpenClash-Rule-Set-Extended =====================#" "$RULE_FILE" 2>/dev/null
else else
echo "#===================== OpenClash-Rule-Set-Extended =====================#" >> "$RULE_FILE" 2>/dev/null echo "#===================== OpenClash-Rule-Set-Extended =====================#" >> "$RULE_FILE" 2>/dev/null
echo "#===================== OpenClash-Rule-Set-Extended-End =====================#" >> "$RULE_FILE" 2>/dev/null echo "#===================== OpenClash-Rule-Set-Extended-End =====================#" >> "$RULE_FILE" 2>/dev/null

View File

@ -28,6 +28,7 @@
curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Global.yaml -o /tmp/rules.yaml >/dev/null 2>&1 curl -sL --connect-timeout 10 --retry 2 https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/Global.yaml -o /tmp/rules.yaml >/dev/null 2>&1
fi fi
sed -i -n '/^rule-providers:/,$p' /tmp/rules.yaml 2>/dev/null sed -i -n '/^rule-providers:/,$p' /tmp/rules.yaml 2>/dev/null
sed -i "s/# - RULE-SET,ChinaIP,DIRECT/- RULE-SET,ChinaIP,DIRECT/g" /tmp/rules.yaml 2>/dev/null
elif [ "$RUlE_SOURCE" = "ConnersHua_return" ]; then elif [ "$RUlE_SOURCE" = "ConnersHua_return" ]; then
if pidof clash >/dev/null; then if pidof clash >/dev/null; then
curl -sL --connect-timeout 10 --retry 2 -x http://$PROXY_ADDR:$HTTP_PORT -U "$PROXY_AUTH" https://raw.githubusercontent.com/ConnersHua/Profiles/master/Clash/China.yaml -o /tmp/rules.yaml >/dev/null 2>&1 curl -sL --connect-timeout 10 --retry 2 -x http://$PROXY_ADDR:$HTTP_PORT -U "$PROXY_AUTH" https://raw.githubusercontent.com/ConnersHua/Profiles/master/Clash/China.yaml -o /tmp/rules.yaml >/dev/null 2>&1

View File

@ -265,10 +265,10 @@ if [ "$2" != 0 ]; then
sed -i "/rules:/a\##Proxy:${Proxy}" "/tmp/other_rule.yaml" 2>/dev/null sed -i "/rules:/a\##Proxy:${Proxy}" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "s/,China,DIRECT$/,China,${Domestic}#d/g" "/tmp/other_rule.yaml" 2>/dev/null sed -i "s/,China,DIRECT$/,China,${Domestic}#d/g" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "s/,China,DIRECT,no-resolve$/,China,${Domestic},no-resolve#d/g" "/tmp/other_rule.yaml" 2>/dev/null sed -i "s/,China,DIRECT,no-resolve$/,China,${Domestic},no-resolve#d/g" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "s/,ChinaIP,DIRECT$/,China,${Domestic}#d/g" "/tmp/other_rule.yaml" 2>/dev/null sed -i "s/,ChinaIP,DIRECT$/,ChinaIP,${Domestic}#d/g" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "s/,ChinaIP,DIRECT,no-resolve$/,China,${Domestic},no-resolve#d/g" "/tmp/other_rule.yaml" 2>/dev/null sed -i "s/,ChinaIP,DIRECT,no-resolve$/,ChinaIP,${Domestic},no-resolve#d/g" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "s/,CN,DIRECT$/,China,${Domestic}#d/g" "/tmp/other_rule.yaml" 2>/dev/null sed -i "s/,CN,DIRECT$/,CN,${Domestic}#d/g" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "s/,CN,DIRECT,no-resolve$/,China,${Domestic},no-resolve#d/g" "/tmp/other_rule.yaml" 2>/dev/null sed -i "s/,CN,DIRECT,no-resolve$/,CN,${Domestic},no-resolve#d/g" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "/rules:/a\##Domestic:${Domestic}" "/tmp/other_rule.yaml" 2>/dev/null sed -i "/rules:/a\##Domestic:${Domestic}" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "s/,MATCH$/,${Others}#d/g" "/tmp/other_rule.yaml" 2>/dev/null sed -i "s/,MATCH$/,${Others}#d/g" "/tmp/other_rule.yaml" 2>/dev/null
sed -i "s/,MATCH,no-resolve$/,${Others},no-resolve#d/g" "/tmp/other_rule.yaml" 2>/dev/null sed -i "s/,MATCH,no-resolve$/,${Others},no-resolve#d/g" "/tmp/other_rule.yaml" 2>/dev/null

View File

@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall PKG_NAME:=luci-app-passwall
PKG_VERSION:=3.9 PKG_VERSION:=3.9
PKG_RELEASE:=19 PKG_RELEASE:=20
PKG_DATE:=20200717 PKG_DATE:=20200719
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)

View File

@ -58,13 +58,13 @@ if node.type == "Trojan-Go" then
} or nil } or nil
trojan.websocket = node.trojan_transport and node.trojan_transport:find('ws') and { trojan.websocket = node.trojan_transport and node.trojan_transport:find('ws') and {
enabled = true, enabled = true,
path = (node.ws_path ~= nil) and node.ws_path or "/", path = node.ws_path or "/",
host = (node.ws_host ~= nil) and node.ws_host or (node.tls_serverName ~= nil and node.tls_serverName or node.address) host = node.ws_host or (node.tls_serverName or node.address)
} or nil } or nil
trojan.shadowsocks = (node.ss_aead == "1") and { trojan.shadowsocks = (node.ss_aead == "1") and {
enabled = true, enabled = true,
method = (node.ss_aead_method ~= nil) and node.ss_aead_method or "aead_aes_128_gcm", method = node.ss_aead_method or "aead_aes_128_gcm",
password = (node.ss_aead_pwd ~= nil) and node.ss_aead_pwd or "" password = node.ss_aead_pwd or ""
} or nil } or nil
end end
print(json.stringify(trojan, 1)) print(json.stringify(trojan, 1))

View File

@ -72,7 +72,7 @@ s = m:section(NamedSection, arg[1], "nodes", "")
s.addremove = false s.addremove = false
s.dynamic = false s.dynamic = false
share = s:option(DummyValue, "share_url", translate("Share Current")) share = s:option(DummyValue, "passwall", translate("Share Current"))
share.rawhtml = true share.rawhtml = true
share.template = "passwall/node_list/link_share_man" share.template = "passwall/node_list/link_share_man"
share.value = arg[1] share.value = arg[1]
@ -484,7 +484,7 @@ ss_aead:depends("type", "Trojan-Go")
ss_aead.default = "0" ss_aead.default = "0"
ss_aead_method = s:option(ListValue, "ss_aead_method", translate("Encrypt Method")) ss_aead_method = s:option(ListValue, "ss_aead_method", translate("Encrypt Method"))
for _, v in ipairs(encrypt_methods_ss_aead) do ss_aead_method:value(v, v:upper()) end for _, v in ipairs(encrypt_methods_ss_aead) do ss_aead_method:value(v, v) end
ss_aead_method.default = "aead_aes_128_gcm" ss_aead_method.default = "aead_aes_128_gcm"
ss_aead_method:depends("ss_aead", "1") ss_aead_method:depends("ss_aead", "1")

View File

@ -82,6 +82,9 @@ local function start()
elseif type == "Trojan" then elseif type == "Trojan" then
config = require("luci.model.cbi.passwall.server.api.trojan").gen_config(user) config = require("luci.model.cbi.passwall.server.api.trojan").gen_config(user)
bin = ln_start("/usr/sbin/trojan-plus", "trojan-plus", "-c " .. config_file) bin = ln_start("/usr/sbin/trojan-plus", "trojan-plus", "-c " .. config_file)
elseif type == "Trojan-Go" then
config = require("luci.model.cbi.passwall.server.api.trojan").gen_config(user)
bin = ln_start(_api.get_trojan_go_path(), "trojan-go", "-config " .. config_file)
elseif type == "Brook" then elseif type == "Brook" then
local brook_protocol = user.brook_protocol local brook_protocol = user.brook_protocol
local brook_password = user.password local brook_password = user.password

View File

@ -8,16 +8,16 @@ function gen_config(user)
local_port = tonumber(user.port), local_port = tonumber(user.port),
remote_addr = (user.remote_enable == "1" and user.remote_address) and user.remote_address or nil, remote_addr = (user.remote_enable == "1" and user.remote_address) and user.remote_address or nil,
remote_port = (user.remote_enable == "1" and user.remote_port) and user.remote_port or nil, remote_port = (user.remote_enable == "1" and user.remote_port) and user.remote_port or nil,
password = { user.password }, password = user.type == "Trojan-Go" and user.passwords or { user.password },
log_level = 1, log_level = 1,
(user.stream_security == nil or user.stream_security == "tls") and ssl = { ssl = (user.stream_security == nil or user.stream_security == "tls") and {
cert = user.tls_certificateFile, cert = user.tls_certificateFile,
key = user.tls_keyFile, key = user.tls_keyFile,
key_password = "", key_password = "",
cipher = user.fingerprint == nil and cipher or (user.fingerprint == "disable" and cipher13 .. ":" .. cipher or ""), cipher = user.fingerprint == nil and cipher or (user.fingerprint == "disable" and cipher13 .. ":" .. cipher or ""),
cipher_tls13 = user.fingerprint == nil and cipher13 or nil, cipher_tls13 = user.fingerprint == nil and cipher13 or nil,
sni = "", sni = user.tls_serverName,
verify = false, verify = (user.tls_allowInsecure ~= "1") and true or false,
verify_hostname = false, verify_hostname = false,
reuse_session = true, reuse_session = true,
session_ticket = (user.tls_sessionTicket == "1") and true or false, session_ticket = (user.tls_sessionTicket == "1") and true or false,
@ -29,7 +29,6 @@ function gen_config(user)
} or nil, } or nil,
udp_timeout = 60, udp_timeout = 60,
disable_http_check = true, disable_http_check = true,
tcp = {
transport_plugin = user.stream_security == "none" and user.trojan_transport == "original" and { transport_plugin = user.stream_security == "none" and user.trojan_transport == "original" and {
enabled = user.plugin_type ~= nil, enabled = user.plugin_type ~= nil,
type = user.plugin_type or "plaintext", type = user.plugin_type or "plaintext",
@ -40,13 +39,13 @@ function gen_config(user)
} or nil, } or nil,
websocket = user.trojan_transport and user.trojan_transport:find('ws') and { websocket = user.trojan_transport and user.trojan_transport:find('ws') and {
enabled = true, enabled = true,
path = (user.ws_path ~= nil) and user.ws_path or "/", path = user.ws_path or "/",
hostname = (user.ws_host ~= nil) and user.ws_host or (user.tls_serverName ~= nil and user.tls_serverName or user.address) host = user.ws_host or (user.tls_serverName or user.address)
} or nil, } or nil,
shadowsocks = (user.ss_aead == "1") and { shadowsocks = (user.ss_aead == "1") and {
enabled = true, enabled = true,
method = (user.ss_aead_method ~= nil) and user.ss_aead_method or "aead_aes_128_gcm", method = user.ss_aead_method or "aead_aes_128_gcm",
password = (user.ss_aead_pwd ~= nil) and user.ss_aead_pwd or "" password = user.ss_aead_pwd or ""
} or nil, } or nil,
tcp = { tcp = {
prefer_ipv4 = false, prefer_ipv4 = false,

View File

@ -56,6 +56,11 @@ s = map:section(NamedSection, arg[1], "user", "")
s.addremove = false s.addremove = false
s.dynamic = false s.dynamic = false
share = s:option(DummyValue, "passwall_server", translate("Share Current"))
share.rawhtml = true
share.template = "passwall/node_list/link_share_man"
share.value = arg[1]
enable = s:option(Flag, "enable", translate("Enable")) enable = s:option(Flag, "enable", translate("Enable"))
enable.default = "1" enable.default = "1"
enable.rmempty = false enable.rmempty = false
@ -111,12 +116,18 @@ password.password = true
password:depends("type", "SSR") password:depends("type", "SSR")
password:depends("type", "Brook") password:depends("type", "Brook")
password:depends("type", "Trojan") password:depends("type", "Trojan")
password:depends("type", "Trojan-Go")
password:depends({ type = "V2ray", protocol = "http" }) password:depends({ type = "V2ray", protocol = "http" })
password:depends({ type = "V2ray", protocol = "socks" }) password:depends({ type = "V2ray", protocol = "socks" })
password:depends({ type = "V2ray", protocol = "shadowsocks" }) password:depends({ type = "V2ray", protocol = "shadowsocks" })
password:depends({ type = "V2ray", protocol = "mtproto" }) password:depends({ type = "V2ray", protocol = "mtproto" })
passwords = s:option(DynamicList, "passwords", translate("Password"))
for i = 1, 3 do
local uuid = luci.sys.exec("echo -n $(cat /proc/sys/kernel/random/uuid)")
passwords:value(uuid)
end
passwords:depends("type", "Trojan-Go")
ssr_encrypt_method = s:option(ListValue, "ssr_encrypt_method", translate("Encrypt Method")) ssr_encrypt_method = s:option(ListValue, "ssr_encrypt_method", translate("Encrypt Method"))
for a, t in ipairs(ssr_encrypt_method_list) do ssr_encrypt_method:value(t) end for a, t in ipairs(ssr_encrypt_method_list) do ssr_encrypt_method:value(t) end
ssr_encrypt_method:depends("type", "SSR") ssr_encrypt_method:depends("type", "SSR")
@ -192,14 +203,27 @@ stream_security:depends({ type = "V2ray", protocol = "vmess", transport = "ws" }
stream_security:depends({ type = "V2ray", protocol = "vmess", transport = "h2" }) stream_security:depends({ type = "V2ray", protocol = "vmess", transport = "h2" })
stream_security:depends({ type = "V2ray", protocol = "socks" }) stream_security:depends({ type = "V2ray", protocol = "socks" })
stream_security:depends({ type = "V2ray", protocol = "shadowsocks" }) stream_security:depends({ type = "V2ray", protocol = "shadowsocks" })
stream_security:depends("type", "Trojan")
stream_security:depends("type", "Trojan-Go") stream_security:depends("type", "Trojan-Go")
stream_security.validate = function(self, value)
if value == "none" and type:formvalue(arg[1]) == "Trojan" then
return nil, translate("'none' not supported for original Trojan.")
end
return value
end
-- [[ TLS部分 ]] -- -- [[ TLS部分 ]] --
tls_sessionTicket = s:option(Flag, "tls_sessionTicket", translate("Session Ticket")) tls_sessionTicket = s:option(Flag, "tls_sessionTicket", translate("Session Ticket"))
tls_sessionTicket.default = "0" tls_sessionTicket.default = "0"
tls_sessionTicket:depends("stream_security", "tls") tls_sessionTicket:depends("stream_security", "tls")
tls_serverName = s:option(Value, "tls_serverName", translate("Domain"))
tls_serverName:depends("stream_security", "tls")
tls_allowInsecure = s:option(Flag, "tls_allowInsecure", translate("allowInsecure"), translate("Whether unsafe connections are allowed. When checked, V2Ray does not check the validity of the TLS certificate provided by the remote host."))
tls_allowInsecure.default = "0"
tls_allowInsecure:depends("stream_security", "tls")
tls_certificateFile = s:option(Value, "tls_certificateFile", translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem") tls_certificateFile = s:option(Value, "tls_certificateFile", translate("Public key absolute path"), translate("as:") .. "/etc/ssl/fullchain.pem")
tls_certificateFile:depends("stream_security", "tls") tls_certificateFile:depends("stream_security", "tls")
@ -213,9 +237,9 @@ transport:value("ws", "WebSocket")
transport:value("h2", "HTTP/2") transport:value("h2", "HTTP/2")
transport:value("ds", "DomainSocket") transport:value("ds", "DomainSocket")
transport:value("quic", "QUIC") transport:value("quic", "QUIC")
stream_security:depends({ type = "V2ray", protocol = "vmess" }) transport:depends({ type = "V2ray", protocol = "vmess" })
stream_security:depends({ type = "V2ray", protocol = "socks" }) transport:depends({ type = "V2ray", protocol = "socks" })
stream_security:depends({ type = "V2ray", protocol = "shadowsocks" }) transport:depends({ type = "V2ray", protocol = "shadowsocks" })
trojan_transport = s:option(ListValue, "trojan_transport", translate("Transport")) trojan_transport = s:option(ListValue, "trojan_transport", translate("Transport"))
trojan_transport:value("original", "Original") trojan_transport:value("original", "Original")
@ -341,6 +365,7 @@ remote_enable = s:option(Flag, "remote_enable", translate("Enable Remote"), tran
remote_enable.default = "1" remote_enable.default = "1"
remote_enable.rmempty = false remote_enable.rmempty = false
remote_enable:depends("type", "Trojan") remote_enable:depends("type", "Trojan")
remote_enable:depends("type", "Trojan-Go")
remote_address = s:option(Value, "remote_address", translate("Remote Address")) remote_address = s:option(Value, "remote_address", translate("Remote Address"))
remote_address.default = "127.0.0.1" remote_address.default = "127.0.0.1"
@ -356,7 +381,7 @@ ss_aead:depends("type", "Trojan-Go")
ss_aead.default = "0" ss_aead.default = "0"
ss_aead_method = s:option(ListValue, "ss_aead_method", translate("Encrypt Method")) ss_aead_method = s:option(ListValue, "ss_aead_method", translate("Encrypt Method"))
for _, v in ipairs(encrypt_methods_ss_aead) do ss_aead_method:value(v, v:upper()) end for _, v in ipairs(encrypt_methods_ss_aead) do ss_aead_method:value(v, v) end
ss_aead_method.default = "aead_aes_128_gcm" ss_aead_method.default = "aead_aes_128_gcm"
ss_aead_method.rmempty = false ss_aead_method.rmempty = false
ss_aead_method:depends("ss_aead", "1") ss_aead_method:depends("ss_aead", "1")

View File

@ -100,16 +100,19 @@ local dsp = require "luci.dispatcher"
function buildUrl(btn, urlname, sid) { function buildUrl(btn, urlname, sid) {
var opt = { var opt = {
base: "cbid.passwall", base: "cbid.passwall",
client : true,
fallback: "dummy", fallback: "dummy",
get: function(opt) { get: function(opt) {
var id = this.base + "." + opt; var id = this.base + "." + opt;
var obj = document.getElementsByName(id) || document.getElementById(id); var obj = document.getElementsByName(id)[0] || document.getElementsByClassName(id)[0] || document.getElementById(id)
if (obj) { if (obj) {
if (obj.length === 1) obj = obj[0];
return obj; return obj;
} else { } else {
alert("<%:Faltal on get option, please help in debug: %>" + opt); obj = document.getElementById(this.fallback);
return document.getElementById(this.fallback); if (opt === "address") obj.value = "0.0.0.0";
else if (opt === "mux") obj.value = "0";
if (this.client || (opt !== "address" && opt !== "mux")) alert("<%:Faltal on get option, please help in debug: %>" + opt);
return obj;
} }
}, },
getlist: function(opt) { getlist: function(opt) {
@ -144,7 +147,8 @@ local dsp = require "luci.dispatcher"
alert("Never"); alert("Never");
return false; return false;
} }
opt.base = "cbid.passwall." + sid; opt.base = "cbid." + urlname + "." + sid;
opt.client = urlname.indexOf("server") === -1;
opt.fallback = urlname + "-dummy"; opt.fallback = urlname + "-dummy";
var v_type = opt.get("type").value; var v_type = opt.get("type").value;
var v_alias = opt.get("remarks"); var v_alias = opt.get("remarks");
@ -169,7 +173,7 @@ local dsp = require "luci.dispatcher"
"&remarks=" + b64encutf8safe(v_alias.value); "&remarks=" + b64encutf8safe(v_alias.value);
url = b64encsafe(ssr_str); url = b64encsafe(ssr_str);
} else if (v_type === "Trojan" || v_type === "Trojan-Go") { } else if (v_type === "Trojan" || v_type === "Trojan-Go") {
var v_password = opt.get("password"); var v_password = opt.get(!opt.client && v_type === "Trojan-Go" ? "passwords" : "password");
var v_server = opt.get("address"); var v_server = opt.get("address");
var v_port = opt.get("port"); var v_port = opt.get("port");
url = encodeURIComponent(v_password.value) + url = encodeURIComponent(v_password.value) +
@ -239,6 +243,7 @@ local dsp = require "luci.dispatcher"
function fromUrl(btn, urlname, sid) { function fromUrl(btn, urlname, sid) {
var opt = { var opt = {
base: 'cbid.passwall', base: 'cbid.passwall',
client : true,
fallback: 'dummy', fallback: 'dummy',
get: function(opt) { get: function(opt) {
var obj; var obj;
@ -247,7 +252,7 @@ local dsp = require "luci.dispatcher"
if (obj) { if (obj) {
return obj; return obj;
} else { } else {
alert('<%:Faltal on get option, please help in debug: %>' + opt); if (this.client || (opt !== "address" && opt !== "mux")) alert('<%:Faltal on get option, please help in debug: %>' + opt);
return document.getElementById(this.fallback); return document.getElementById(this.fallback);
} }
}, },
@ -287,7 +292,8 @@ local dsp = require "luci.dispatcher"
alert("Never"); alert("Never");
return false; return false;
} }
opt.base = 'cbid.passwall.' + sid opt.base = "cbid." + urlname + "." + sid;
opt.client = urlname.indexOf("server") === -1;
opt.fallback = urlname + '-dummy'; opt.fallback = urlname + '-dummy';
var ssrurl = prompt('<%:Paste Share URL Here%>', ''); var ssrurl = prompt('<%:Paste Share URL Here%>', '');
if (ssrurl === null || ssrurl === "") { if (ssrurl === null || ssrurl === "") {
@ -333,7 +339,7 @@ local dsp = require "luci.dispatcher"
opt.set('protocol_param', dictvalue(pdict, 'protoparam')); opt.set('protocol_param', dictvalue(pdict, 'protoparam'));
var rem = pdict['remarks']; var rem = pdict['remarks'];
if (typeof(rem) !== 'undefined' && rem !== '' && rem.length > 0) if (typeof(rem) !== 'undefined' && rem !== '' && rem.length > 0)
opt.set('remark', b64decutf8safe(rem)); opt.set('remarks', b64decutf8safe(rem));
} else if (ssu[0] === "ss") { } else if (ssu[0] === "ss") {
var url0 = "", param = ""; var url0 = "", param = "";
var sipIndex = ssu[1].indexOf("@"); var sipIndex = ssu[1].indexOf("@");
@ -374,7 +380,7 @@ local dsp = require "luci.dispatcher"
opt.set('ss_plugin', plugin || ""); opt.set('ss_plugin', plugin || "");
opt.set('ss_plugin_opts', pluginOpts || ""); opt.set('ss_plugin_opts', pluginOpts || "");
if (param !== undefined) { if (param !== undefined) {
opt.set('remark', decodeURI(param)); opt.set('remarks', decodeURI(param));
} }
} else { } else {
var sstr = b64decsafe(url0); var sstr = b64decsafe(url0);
@ -390,7 +396,7 @@ local dsp = require "luci.dispatcher"
opt.set('ss_plugin', ""); opt.set('ss_plugin', "");
opt.set('ss_plugin_opts', ""); opt.set('ss_plugin_opts', "");
if (param !== undefined) { if (param !== undefined) {
opt.set('remark', decodeURI(param)); opt.set('remarks', decodeURI(param));
} }
} }
} else if (ssu[0] === "trojan") { } else if (ssu[0] === "trojan") {
@ -420,7 +426,7 @@ local dsp = require "luci.dispatcher"
opt.get('type').dispatchEvent(event); opt.get('type').dispatchEvent(event);
opt.set('address', m.hostname); opt.set('address', m.hostname);
opt.set('port', m.port || "443"); opt.set('port', m.port || "443");
opt.set('password', decodeURIComponent(password)); opt.set(!opt.client && stype === "Trojan-Go" ? 'passwords' : 'password', decodeURIComponent(password));
var tls = true; var tls = true;
if (stype === "Trojan-Go") { if (stype === "Trojan-Go") {
tls = queryParam.plugin === undefined; tls = queryParam.plugin === undefined;
@ -454,12 +460,12 @@ local dsp = require "luci.dispatcher"
var ss = queryParam.ss === '1'; var ss = queryParam.ss === '1';
opt.set('ss_aead', ss); opt.set('ss_aead', ss);
if (ss) { if (ss) {
opt.set('ss_aead_method', queryParam.ssmethod.toUpperCase() || ''); opt.set('ss_aead_method', queryParam.ssmethod.toLowerCase() || '');
opt.set('ss_aead_pwd', queryParam.sspasswd || ''); opt.set('ss_aead_pwd', queryParam.sspasswd || '');
} }
opt.set('mux', queryParam.mux === '1'); opt.set('mux', queryParam.mux === '1');
if (m.hash) { if (m.hash) {
opt.set('remark', decodeURI(m.hash.substr(1))); opt.set('remarks', decodeURI(m.hash.substr(1)));
} }
} else if (ssu[0] === "trojan-go") { } else if (ssu[0] === "trojan-go") {
var m = parseNodeUrl(ssrurl); var m = parseNodeUrl(ssrurl);
@ -483,7 +489,7 @@ local dsp = require "luci.dispatcher"
opt.get('type').dispatchEvent(event); opt.get('type').dispatchEvent(event);
opt.set('address', m.hostname); opt.set('address', m.hostname);
opt.set('port', m.port || "443"); opt.set('port', m.port || "443");
opt.set('password', decodeURIComponent(password)); opt.set(opt.client ? 'password' : 'passwords', decodeURIComponent(password));
opt.set('stream_security', (queryParam.tls && queryParam.tls === '1') ? 'tls' : 'none'); opt.set('stream_security', (queryParam.tls && queryParam.tls === '1') ? 'tls' : 'none');
opt.get('stream_security').dispatchEvent(event); opt.get('stream_security').dispatchEvent(event);
var plugin = queryParam.plugin !== undefined; var plugin = queryParam.plugin !== undefined;
@ -538,12 +544,12 @@ local dsp = require "luci.dispatcher"
ss = enc.type === 'ss'; ss = enc.type === 'ss';
opt.set('ss_aead', ss); opt.set('ss_aead', ss);
if (ss) { if (ss) {
opt.set('ss_aead_method', enc.method.toUpperCase() || ''); opt.set('ss_aead_method', enc.method.toLowerCase() || '');
opt.set('ss_aead_pwd', enc.password || ''); opt.set('ss_aead_pwd', enc.password || '');
} }
opt.set('mux', queryParam.mux === '1'); opt.set('mux', queryParam.mux === '1');
if (m.hash) { if (m.hash) {
opt.set('remark', decodeURI(m.hash)); opt.set('remarks', decodeURI(m.hash.substr(1)));
} }
} else if (ssu[0] === "vmess") { } else if (ssu[0] === "vmess") {
var sstr = b64DecodeUnicode(ssu[1]); var sstr = b64DecodeUnicode(ssu[1]);
@ -556,7 +562,7 @@ local dsp = require "luci.dispatcher"
param = sstr.substr(ploc + 2); param = sstr.substr(ploc + 2);
} }
var ssm = JSON.parse(sstr); var ssm = JSON.parse(sstr);
opt.set('remark', ssm.ps); opt.set('remarks', ssm.ps);
opt.set('address', ssm.add); opt.set('address', ssm.add);
opt.set('port', ssm.port); opt.set('port', ssm.port);
opt.set('alter_id', ssm.aid); opt.set('alter_id', ssm.aid);
@ -597,7 +603,7 @@ local dsp = require "luci.dispatcher"
} }
//]]></script> //]]></script>
<input type="test" class="hidden" id='<%=self.option%>-dummy' value="-dummy-" /> <input type="text" class="hidden" id='<%=self.option%>-dummy' value="0.0.0.0" />
<input type="button" class="cbi-button cbi-button-apply" value='<%:From Share URL%>' onclick="return fromUrl(this, '<%=self.option%>', '<%=self.value%>')" /> <input type="button" class="cbi-button cbi-button-apply" value='<%:From Share URL%>' onclick="return fromUrl(this, '<%=self.option%>', '<%=self.value%>')" />
<input type="button" class="cbi-button cbi-button-apply" value='<%:Build Share URL%>' onclick="return buildUrl(this, '<%=self.option%>', '<%=self.value%>')" /> <input type="button" class="cbi-button cbi-button-apply" value='<%:Build Share URL%>' onclick="return buildUrl(this, '<%=self.option%>', '<%=self.value%>')" />
<span id="<%=self.option%>-status"></span> <span id="<%=self.option%>-status"></span>

View File

@ -11,6 +11,7 @@ config global
option udp_proxy_mode 'chnroute' option udp_proxy_mode 'chnroute'
option localhost_tcp_proxy_mode 'gfwlist' option localhost_tcp_proxy_mode 'gfwlist'
option localhost_udp_proxy_mode 'gfwlist' option localhost_udp_proxy_mode 'gfwlist'
option socks_server '0.0.0.0:1080'
config global_haproxy config global_haproxy
option balancing_enable '0' option balancing_enable '0'

View File

@ -20,7 +20,6 @@ LUA_API_PATH=/usr/lib/lua/luci/model/cbi/$CONFIG/api
API_GEN_SS=$LUA_API_PATH/gen_shadowsocks.lua API_GEN_SS=$LUA_API_PATH/gen_shadowsocks.lua
API_GEN_V2RAY=$LUA_API_PATH/gen_v2ray.lua API_GEN_V2RAY=$LUA_API_PATH/gen_v2ray.lua
API_GEN_TROJAN=$LUA_API_PATH/gen_trojan.lua API_GEN_TROJAN=$LUA_API_PATH/gen_trojan.lua
echolog() { echolog() {
local d="$(date "+%Y-%m-%d %H:%M:%S")" local d="$(date "+%Y-%m-%d %H:%M:%S")"
echo -e "$d: $1" >>$LOG_FILE echo -e "$d: $1" >>$LOG_FILE
@ -85,6 +84,46 @@ get_node_host_ip() {
echo $ip echo $ip
} }
hosts_foreach() {
local __hosts
eval "__hosts=\$${1}"; shift 1
local __func=${1}; shift 1
local __default_port=${1}; shift 1
local __ret=1
[ -z "${__hosts}" ] && return 0
local __ip __port
for __host in $(echo $__hosts | sed 's/[ ,]/\n/g'); do
__ip=$(echo $__host | sed -n 's/\(^[^:#]*\).*$/\1/p')
[ -n "${__default_port}" ] && __port=$(echo $__host | sed -n 's/^[^:#]*[:#]\([0-9]*\).*$/\1/p')
eval "$__func \"${__host}\" \"\${__ip}\" \"\${__port:-${__default_port}}\" $@"
__ret=$?
[ ${__ret} -ge ${ERROR_NO_CATCH:-1} ] && return ${__ret}
done
}
get_first_dns() {
local __hosts_val=${1}; shift 1
__first() {
[ -z "${2}" ] && return 0
echo "${2}#${3}"
return 1
}
eval "hosts_foreach \"${__hosts_val}\" __first $@"
}
get_last_dns() {
local __hosts_val=${1}; shift 1
local __first __last
__every() {
[ -z "${2}" ] && return 0
__last="${2}#${3}"
__first=${__first:-${__last}}
}
eval "hosts_foreach \"${__hosts_val}\" __every $@"
[ "${__first}" == "${__last}" ] || echo "${__last}"
}
check_port_exists() { check_port_exists() {
port=$1 port=$1
protocol=$2 protocol=$2
@ -123,13 +162,13 @@ ln_start_bin() {
local file=$1 local file=$1
[ "$file" != "null" ] && { [ "$file" != "null" ] && {
local bin=$2 local bin=$2
local cmd=$3 shift 2
if [ -n "${TMP_BIN_PATH}/$bin" -a -f "${TMP_BIN_PATH}/$bin" ];then if [ -n "${TMP_BIN_PATH}/$bin" -a -f "${TMP_BIN_PATH}/$bin" ];then
${TMP_BIN_PATH}/$bin $cmd >/dev/null 2>&1 & ${TMP_BIN_PATH}/$bin $@ >/dev/null 2>&1 &
else else
if [ -n "$file" -a -f "$file" ];then if [ -n "$file" -a -f "$file" ];then
ln -s $file ${TMP_BIN_PATH}/$bin ln -s $file ${TMP_BIN_PATH}/$bin
${TMP_BIN_PATH}/$bin $cmd >/dev/null 2>&1 & ${TMP_BIN_PATH}/$bin $@ >/dev/null 2>&1 &
else else
echolog "找不到$bin主程序,无法启动!" echolog "找不到$bin主程序,无法启动!"
fi fi
@ -192,7 +231,7 @@ load_config() {
} }
DNS_MODE=$(config_t_get global dns_mode pdnsd) DNS_MODE=$(config_t_get global dns_mode pdnsd)
DNS_FORWARD=$(config_t_get global dns_forward 8.8.4.4) DNS_FORWARD=$(config_t_get global dns_forward 8.8.4.4:53)
DNS_CACHE=$(config_t_get global dns_cache 1) DNS_CACHE=$(config_t_get global dns_cache 1)
use_tcp_node_resolve_dns=0 use_tcp_node_resolve_dns=0
use_udp_node_resolve_dns=0 use_udp_node_resolve_dns=0
@ -213,9 +252,9 @@ load_config() {
UP_CHINA_DNS2=$(cat $RESOLVFILE 2>/dev/null | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | grep -v 0.0.0.0 | grep -v 127.0.0.1 | sed -n '2P') UP_CHINA_DNS2=$(cat $RESOLVFILE 2>/dev/null | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | grep -v 0.0.0.0 | grep -v 127.0.0.1 | sed -n '2P')
[ -n "$UP_CHINA_DNS1" -a -n "$UP_CHINA_DNS2" ] && UP_CHINA_DNS="$UP_CHINA_DNS1,$UP_CHINA_DNS2" [ -n "$UP_CHINA_DNS1" -a -n "$UP_CHINA_DNS2" ] && UP_CHINA_DNS="$UP_CHINA_DNS1,$UP_CHINA_DNS2"
else else
UP_CHINA_DNS1=$(echo $UP_CHINA_DNS | sed "s/:/#/g" | awk -F ',' '{print $1}') UP_CHINA_DNS1=$(get_first_dns UP_CHINA_DNS 53)
if [ -n "$UP_CHINA_DNS1" ]; then if [ -n "$UP_CHINA_DNS1" ]; then
UP_CHINA_DNS2=$(echo $UP_CHINA_DNS | sed "s/:/#/g" | awk -F ',' '{print $2}') UP_CHINA_DNS2=$(get_last_dns UP_CHINA_DNS 53)
[ -n "$UP_CHINA_DNS2" ] && UP_CHINA_DNS="${UP_CHINA_DNS1},${UP_CHINA_DNS2}" [ -n "$UP_CHINA_DNS2" ] && UP_CHINA_DNS="${UP_CHINA_DNS1},${UP_CHINA_DNS2}"
else else
UP_CHINA_DNS1="119.29.29.29" UP_CHINA_DNS1="119.29.29.29"
@ -522,6 +561,8 @@ stop_crontab() {
} }
start_dns() { start_dns() {
DNS2SOCKS_SOCKS_SERVER=$(echo $(config_t_get global socks_server nil) | sed "s/#/:/g")
DNS2SOCKS_FORWARD=$(get_first_dns DNS_FORWARD 53 | sed 's/#/:/g')
case "$DNS_MODE" in case "$DNS_MODE" in
nonuse) nonuse)
echolog "DNS不使用将会直接使用上级DNS" echolog "DNS不使用将会直接使用上级DNS"
@ -530,13 +571,10 @@ start_dns() {
echolog "DNS使用本机7913端口DNS服务器解析域名..." echolog "DNS使用本机7913端口DNS服务器解析域名..."
;; ;;
dns2socks) dns2socks)
DNS2SOCKS_SOCKS_SERVER=$(echo $(config_t_get global socks_server nil) | sed "s/#/:/g")
[ "$DNS2SOCKS_SOCKS_SERVER" != "nil" ] && { [ "$DNS2SOCKS_SOCKS_SERVER" != "nil" ] && {
DNS2SOCKS_FORWARD=$(echo $DNS_FORWARD | awk -F ',' '{print $1}')
[ -z "$DNS2SOCKS_FORWARD" ] && DNS2SOCKS_FORWARD="8.8.4.4"
[ "$DNS_CACHE" == "0" ] && local _cache="/d" [ "$DNS_CACHE" == "0" ] && local _cache="/d"
ln_start_bin $(find_bin dns2socks) dns2socks "$DNS2SOCKS_SOCKS_SERVER $DNS2SOCKS_FORWARD 127.0.0.1:$DNS_PORT $_cache" ln_start_bin $(find_bin dns2socks) dns2socks "$DNS2SOCKS_SOCKS_SERVER $DNS2SOCKS_FORWARD 127.0.0.1:$DNS_PORT $_cache"
echolog "DNSdns2socks($DNS2SOCKS_FORWARD)..." echolog "DNSdns2socks(${DNS2SOCKS_FORWARD-D46.182.19.48:53})..."
} }
;; ;;
pdnsd) pdnsd)
@ -546,11 +584,12 @@ start_dns() {
else else
gen_pdnsd_config $DNS_PORT gen_pdnsd_config $DNS_PORT
ln_start_bin $(find_bin pdnsd) pdnsd "--daemon -c $pdnsd_dir/pdnsd.conf -d" ln_start_bin $(find_bin pdnsd) pdnsd "--daemon -c $pdnsd_dir/pdnsd.conf -d"
echolog "DNSpdnsd + 使用TCP节点解析DNS$DNS_FORWARD..." echolog "DNSpdnsd + 使用TCP节点解析DNS..."
DNS_FORWARD=$(echo $DNS_FORWARD | sed 's/,/ /g')
fi fi
;; ;;
chinadns-ng) chinadns-ng)
local china_ng_chn=$(echo $UP_CHINA_DNS | sed 's/:/#/g')
local china_ng_gfw=$(echo $DNS_FORWARD | sed 's/:/#/g')
other_port=$(expr $DNS_PORT + 1) other_port=$(expr $DNS_PORT + 1)
[ -f "$RULES_PATH/gfwlist.conf" ] && cat $RULES_PATH/gfwlist.conf | sort | uniq | sed -e '/127.0.0.1/d' | sed 's/ipset=\/.//g' | sed 's/\/gfwlist//g' > $TMP_PATH/gfwlist.txt [ -f "$RULES_PATH/gfwlist.conf" ] && cat $RULES_PATH/gfwlist.conf | sort | uniq | sed -e '/127.0.0.1/d' | sed 's/ipset=\/.//g' | sed 's/\/gfwlist//g' > $TMP_PATH/gfwlist.txt
[ -f "$TMP_PATH/gfwlist.txt" ] && { [ -f "$TMP_PATH/gfwlist.txt" ] && {
@ -578,25 +617,20 @@ start_dns() {
else else
gen_pdnsd_config $other_port gen_pdnsd_config $other_port
ln_start_bin $(find_bin pdnsd) pdnsd "--daemon -c $pdnsd_dir/pdnsd.conf -d" ln_start_bin $(find_bin pdnsd) pdnsd "--daemon -c $pdnsd_dir/pdnsd.conf -d"
ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $UP_CHINA_DNS -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param $fair_mode" ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $china_ng_chn -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param $fair_mode"
echolog "DNSChinaDNS-NG + pdnsd($DNS_FORWARD)国内DNS$UP_CHINA_DNS" echolog "DNSChinaDNS-NG + pdnsd($china_ng_gfw)国内DNS$china_ng_chn"
DNS_FORWARD=$(echo $DNS_FORWARD | sed 's/,/ /g')
fi fi
elif [ "$up_trust_chinadns_ng_dns" == "dns2socks" ]; then elif [ "$up_trust_chinadns_ng_dns" == "dns2socks" ]; then
DNS2SOCKS_SOCKS_SERVER=$(echo $(config_t_get global socks_server nil) | sed "s/#/:/g")
[ "$DNS2SOCKS_SOCKS_SERVER" != "nil" ] && { [ "$DNS2SOCKS_SOCKS_SERVER" != "nil" ] && {
DNS2SOCKS_FORWARD=$(echo $DNS_FORWARD | awk -F ',' '{print $1}')
[ -z "$DNS2SOCKS_FORWARD" ] && DNS2SOCKS_FORWARD="8.8.4.4"
[ "$DNS_CACHE" == "0" ] && local _cache="/d" [ "$DNS_CACHE" == "0" ] && local _cache="/d"
ln_start_bin $(find_bin dns2socks) dns2socks "$DNS2SOCKS_SOCKS_SERVER $DNS2SOCKS_FORWARD 127.0.0.1:$other_port $_cache" ln_start_bin $(find_bin dns2socks) dns2socks "$DNS2SOCKS_SOCKS_SERVER $DNS2SOCKS_FORWARD 127.0.0.1:$other_port $_cache"
ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $UP_CHINA_DNS -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param $fair_mode" ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $china_ng_chn -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param $fair_mode"
echolog "DNSChinaDNS-NG + dns2socks($DNS2SOCKS_FORWARD)国内DNS$UP_CHINA_DNS" echolog "DNSChinaDNS-NG + dns2socks(${DNS2SOCKS_FORWARD:-D46.182.19.48:53})国内DNS$china_ng_chn"
} }
elif [ "$up_trust_chinadns_ng_dns" == "udp" ]; then elif [ "$up_trust_chinadns_ng_dns" == "udp" ]; then
use_udp_node_resolve_dns=1 use_udp_node_resolve_dns=1
ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $UP_CHINA_DNS -t $DNS_FORWARD $gfwlist_param $chnlist_param $fair_mode" ln_start_bin $(find_bin chinadns-ng) chinadns-ng "-l $DNS_PORT -c $china_ng_chn -t $china_ng_gfw $gfwlist_param $chnlist_param $fair_mode"
echolog "DNSChinaDNS-NG国内DNS$UP_CHINA_DNS可信DNS$up_trust_chinadns_ng_dns如果不能使用请确保UDP节点已打开并且支持UDP转发。" echolog "DNSChinaDNS-NG国内DNS$china_ng_chn可信DNS$up_trust_chinadns_ng_dns[$china_ng_gfw]如果不能使用请确保UDP节点已打开并且支持UDP转发。"
DNS_FORWARD=$(echo $DNS_FORWARD | sed 's/,/ /g')
fi fi
;; ;;
esac esac
@ -707,22 +741,26 @@ gen_pdnsd_config() {
} }
EOF EOF
cat >> $pdnsd_dir/pdnsd.conf <<-EOF append_pdnsd_updns() {
server { [ -z "${2}" ] && echolog "略过错误配置的 DNS : [${1}]" && return 0
label = "node"; echolog "配置 pdnsd 的上游DNS[${2}:${3}]"
ip = $DNS_FORWARD; cat >> $pdnsd_dir/pdnsd.conf <<-EOF
edns_query = on; server {
port = 53; label = "node-${2}_${3}";
timeout = 4; ip = ${2};
interval = 10m; edns_query = on;
uptest = none; port = ${3};
purge_cache = off; timeout = 4;
caching = $_cache; interval = 10m;
} uptest = none;
purge_cache = off;
EOF caching = $_cache;
}
EOF
}
hosts_foreach DNS_FORWARD append_pdnsd_updns 53
use_tcp_node_resolve_dns=1 use_tcp_node_resolve_dns=1
} }

View File

@ -347,17 +347,14 @@ add_firewall_rule() {
blist_r=$(REDIRECT 1 MARK) blist_r=$(REDIRECT 1 MARK)
p_r=$(get_redirect_ipt $LOCALHOST_TCP_PROXY_MODE 1 MARK) p_r=$(get_redirect_ipt $LOCALHOST_TCP_PROXY_MODE 1 MARK)
fi fi
[ "$use_tcp_node_resolve_dns" == 1 -a -n "$DNS_FORWARD" ] && { _proxy_tcp_access() {
for dns in $DNS_FORWARD ; do [ -n "${2}" ] && return 0
local dns_ip=$(echo $dns | sed "s/:/#/g" | awk -F "#" '{print $1}') ipset test $IPSET_LANIPLIST ${2} 2>/dev/null
ipset test $IPSET_LANIPLIST $dns_ip 2>/dev/null [ $? == 0 ] && return 0
[ $? == 0 ] && continue $ipt_tmp -I $dns_l 2 -p tcp -d ${2} --dport ${3} $dns_r
local dns_port=$(echo $dns | sed "s/:/#/g" | awk -F "#" '{print $2}') [ "$ipt_tmp" == "$ipt_m" ] && $ipt_tmp -I PSW_OUTPUT 2 -p tcp -d ${2} --dport ${3} $(REDIRECT 1 MARK)
[ -z "$dns_port" ] && dns_port=53
$ipt_tmp -I $dns_l 2 -p tcp -d $dns_ip --dport $dns_port $dns_r
[ "$ipt_tmp" == "$ipt_m" ] && $ipt_tmp -I PSW_OUTPUT 2 -p tcp -d $dns_ip --dport $dns_port $(REDIRECT 1 MARK)
done
} }
[ "$use_tcp_node_resolve_dns" == 1 ] && hosts_foreach DNS_FORWARD _proxy_tcp_access 53
$ipt_tmp -A OUTPUT -p tcp -j PSW_OUTPUT $ipt_tmp -A OUTPUT -p tcp -j PSW_OUTPUT
[ "$TCP_NO_REDIR_PORTS" != "disable" ] && $ipt_tmp -A PSW_OUTPUT -p tcp -m multiport --dport $TCP_NO_REDIR_PORTS -j RETURN [ "$TCP_NO_REDIR_PORTS" != "disable" ] && $ipt_tmp -A PSW_OUTPUT -p tcp -m multiport --dport $TCP_NO_REDIR_PORTS -j RETURN
$ipt_tmp -A PSW_OUTPUT -p tcp $(factor $TCP_REDIR_PORTS "-m multiport --dport") $(dst $IPSET_BLACKLIST) $blist_r $ipt_tmp -A PSW_OUTPUT -p tcp $(factor $TCP_REDIR_PORTS "-m multiport --dport") $(dst $IPSET_BLACKLIST) $blist_r
@ -402,18 +399,15 @@ add_firewall_rule() {
# 加载路由器自身代理 UDP # 加载路由器自身代理 UDP
if [ "$UDP_NODE1" != "nil" ]; then if [ "$UDP_NODE1" != "nil" ]; then
local UDP_NODE1_TYPE=$(echo $(config_n_get $UDP_NODE1 type) | tr 'A-Z' 'a-z') local UDP_NODE1_TYPE=$(echo $(config_n_get $UDP_NODE1 type) | tr 'A-Z' 'a-z')
[ "$use_udp_node_resolve_dns" == 1 -a -n "$DNS_FORWARD" ] && { _proxy_udp_access() {
for dns in $DNS_FORWARD ; do [ -n "${2}" ] && return 0
local dns_ip=$(echo $dns | sed "s/:/#/g" | awk -F "#" '{print $1}') ipset test $IPSET_LANIPLIST ${2} 2>/dev/null
ipset test $IPSET_LANIPLIST $dns_ip 2>/dev/null [ $? == 0 ] && return 0
[ $? == 0 ] && continue local ADD_INDEX=2
local dns_port=$(echo $dns | sed "s/:/#/g" | awk -F "#" '{print $2}') $ipt_m -I PSW $ADD_INDEX -p udp -d ${2} --dport ${3} $(REDIRECT $UDP_REDIR_PORT1 TPROXY)
[ -z "$dns_port" ] && dns_port=53 $ipt_m -I PSW_OUTPUT $ADD_INDEX -p udp -d ${2} --dport ${3} $(REDIRECT 1 MARK)
local ADD_INDEX=2
$ipt_m -I PSW $ADD_INDEX -p udp -d $dns_ip --dport $dns_port $(REDIRECT $UDP_REDIR_PORT1 TPROXY)
$ipt_m -I PSW_OUTPUT $ADD_INDEX -p udp -d $dns_ip --dport $dns_port $(REDIRECT 1 MARK)
done
} }
[ "$use_udp_node_resolve_dns" == 1 ] && hosts_foreach DNS_FORWARD _proxy_udp_access 53
$ipt_m -A OUTPUT -p udp -j PSW_OUTPUT $ipt_m -A OUTPUT -p udp -j PSW_OUTPUT
[ "$UDP_NO_REDIR_PORTS" != "disable" ] && $ipt_m -A PSW_OUTPUT -p udp -m multiport --dport $UDP_NO_REDIR_PORTS -j RETURN [ "$UDP_NO_REDIR_PORTS" != "disable" ] && $ipt_m -A PSW_OUTPUT -p udp -m multiport --dport $UDP_NO_REDIR_PORTS -j RETURN
$ipt_m -A PSW_OUTPUT -p udp $(factor $UDP_REDIR_PORTS "-m multiport --dport") $(dst $IPSET_BLACKLIST) $(REDIRECT 1 MARK) $ipt_m -A PSW_OUTPUT -p udp $(factor $UDP_REDIR_PORTS "-m multiport --dport") $(dst $IPSET_BLACKLIST) $(REDIRECT 1 MARK)

View File

@ -1,10 +1,124 @@
abc.com
abema.tv
acast.com
adblockplus.org
adswizz.com
agkn.com
akadns.net
akam.net
akamai.com
akamai.net
akamaiedge.net
akamaihd.net
akamaistream.net
akamaitech.net
akamaitechnologies.com
akamaitechnologies.fr
akamaized.net
amazon-adsystem.com
amazon.co.jp
amazon.co.uk
amazon.com
amazon.de
amazonvideo.com
amctv.com
bahamut.com.tw
beinsportsconnect.net
beinsportsconnect.tv
blinkbox.com
brightcove.com
caddyserver.com
cbs.com
cloudfront.net
conviva.com
crackle.com
crunchyroll.com
crwdcntrl.net
cwtv.com
disney.com
disneyjunior.com
easylist-downloads.adblockplus.org
edgecastcdn.net
edgekey.net
edgesuite.net
fast.com
fig.bbc.co.uk
footprint.net
formyip.com formyip.com
msi.com fox.com
gamer.com.tw
ggpht.com
github-production-release-asset-2e65be.s3.amazonaws.com
github.com github.com
github.io github.io
githubusercontent.com githubusercontent.com
github-production-release-asset-2e65be.s3.amazonaws.com go.com
googleapis.com
googletagmanager.com
googleusercontent.com
googlevideo.com
gstatic.com
happyon.jp
hbo.com
hbogo.com
hbonow.com
hinet.net
hulu.com
hulu.jp
huluad.com
huluim.com
hulustream.com
ifconfig.co
imrworldwide.com
ip2location.com
level3.net
line.me
llnwd.net
lovefilm.com
maxmind.com
mog.com
movetv.com
msi.com
mtv.com
mtvnservices.com
naver.com
naver.jp
nbc.com
nbcuni.com
netflix.com
netflix.net
nflxext.com
nflximg.net
nflxso.net
nflxvideo.net
omtrdc.net
open.live.bbc.co.uk
openwrt.proxy.ustclug.org openwrt.proxy.ustclug.org
easylist-downloads.adblockplus.org openx.net
adblockplus.org optus.com.au
caddyserver.com optusnet.com.au
pandora.com
pbs.org
playstation.net
primevideo.com
pubmatic.com
radiotime.com
sa.bbc.co.uk
sho.com
sling.com
southpark.cc.com
spike.com
srip.net
theplatform.com
ttvnw.net
turner.com
turnin.com
twitch.tv
uplynk.com
vudu.com
warnerbros.com
wdtvlive.com
www.bbc.co.uk
xboxlive.com
youtube.com
ytimg.com

View File

@ -1,3 +1,4 @@
apple.com apple.com
microsoft.com microsoft.com
dyndns.com dyndns.com
rrys.tv