diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index 5923392eaa..8b05d02f0a 100644 --- a/package/lienol/luci-app-passwall/Makefile +++ b/package/lienol/luci-app-passwall/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=3.3 -PKG_RELEASE:=26-20200115 +PKG_RELEASE:=30-20200118 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) diff --git a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua index e289bf5179..b797a3208b 100644 --- a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua +++ b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua @@ -153,11 +153,11 @@ function status() for i = 1, socks5_node_num, 1 do local listen_port = luci.sys.exec( string.format( - "[ -f '/var/etc/passwall/port/Socks5_%s' ] && echo -n `cat /var/etc/passwall/port/Socks5_%s`", + "[ -f '/var/etc/passwall/port/SOCKS5_%s' ] && echo -n `cat /var/etc/passwall/port/SOCKS5_%s`", i, i)) e["socks5_node%s_status" % i] = luci.sys.call( string.format( - "ps -w | grep -v grep | grep -i -E '%s/Socks5_%s|brook client -l 0.0.0.0:%s' >/dev/null", + "ps -w | grep -v grep | grep -i -E '%s/SOCKS5_%s|brook client -l 0.0.0.0:%s' >/dev/null", appname, i, listen_port)) == 0 end luci.http.prepare_content("application/json") diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua index 5dc835637d..b97cc00c6a 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/acl.lua @@ -60,13 +60,17 @@ sys.net.mac_hints(function(e, t) o:value(e, "%s " % {e}) end) ---- TCP Node local tcp_node_num = api.uci_get_type("global_other", "tcp_node_num", 1) -o = s:option(ListValue, "tcp_node", translate("TCP Node")) -for i = 1, tcp_node_num, 1 do o:value(i, "TCP_" .. i) end +if tonumber(tcp_node_num) > 1 then + o = s:option(ListValue, "tcp_node", translate("TCP Node")) + for i = 1, tcp_node_num, 1 do o:value(i, "TCP_" .. i) end +end ---- UDP Node local udp_node_num = api.uci_get_type("global_other", "udp_node_num", 1) -o = s:option(ListValue, "udp_node", translate("UDP Node")) -for i = 1, udp_node_num, 1 do o:value(i, "UDP_" .. i) end +if tonumber(udp_node_num) > 1 then + o = s:option(ListValue, "udp_node", translate("UDP Node")) + for i = 1, udp_node_num, 1 do o:value(i, "UDP_" .. i) end +end ---- Proxy Mode o = s:option(ListValue, "proxy_mode", translate("Proxy Mode")) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua index ae1154d4e3..069d4cecbc 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/global.lua @@ -94,21 +94,6 @@ for i = 1, socks5_node_num, 1 do for _, key in pairs(key_table) do o:value(key, n[key]) end end ----- DNS Forward Mode -o = s:option(ListValue, "dns_mode", translate("DNS Mode"), translate( - "if has problem, please try another mode.
if you use no patterns are used, DNS of wan will be used by default as upstream of dnsmasq.")) -o.rmempty = false -o:reset_values() -if is_finded("chinadns-ng") then o:value("chinadns-ng", "ChinaDNS-NG") end -if is_finded("dns2socks") then - o:value("dns2socks", "dns2socks " .. translate("Need Socks5 server")) -end -if is_installed("pdnsd") or is_installed("pdnsd-alt") or is_finded("pdnsd") then - o:value("pdnsd", "pdnsd") -end -o:value("local_7913", translate("Use local port 7913 as DNS")) -o:value("nonuse", translate("No patterns are used")) - ---- China DNS Server o = s:option(Value, "up_china_dns", translate("China DNS Server") .. "(UDP)", translate( @@ -125,26 +110,48 @@ o:value("1.2.4.8", "1.2.4.8 (CNNIC DNS)") o:value("210.2.4.8", "210.2.4.8 (CNNIC DNS)") o:value("180.76.76.76", "180.76.76.76 (" .. translate("Baidu") .. "DNS)") +---- DNS Forward Mode +o = s:option(ListValue, "dns_mode", translate("DNS Mode"), translate( + "if has problem, please try another mode.
if you use no patterns are used, DNS of wan will be used by default as upstream of dnsmasq.")) +o.rmempty = false +o:reset_values() +if is_finded("chinadns-ng") then o:value("chinadns-ng", "ChinaDNS-NG") end +if is_finded("dns2socks") then + o:value("dns2socks", + "dns2socks + " .. translate("Use Socks5 Node Resolve DNS")) +end +if is_installed("pdnsd") or is_installed("pdnsd-alt") or is_finded("pdnsd") then + o:value("pdnsd", "pdnsd") +end +o:value("local_7913", translate("Use local port 7913 as DNS")) +o:value("nonuse", translate("No patterns are used")) + ---- Upstream trust DNS Server for ChinaDNS-NG o = s:option(Value, "up_trust_chinadns_ng_dns", translate("Upstream trust DNS Server for ChinaDNS-NG") .. "(UDP)", translate( "Example: 127.0.0.1#5353 ,such as dns2socks,dns-forwarder...
Only use two at most, english comma separation, If you do not fill in the # and the following port, you are using port 53.")) -o.default = "8.8.4.4,8.8.8.8" +o.default = "pdnsd" +if is_installed("pdnsd") or is_installed("pdnsd-alt") or is_finded("pdnsd") then + o:value("pdnsd", "pdnsd + " .. translate("Use TCP Node Resolve DNS")) +end +if is_finded("dns2socks") then + o:value("dns2socks", + "dns2socks + " .. translate("Use Socks5 Node Resolve DNS")) +end o:value("8.8.4.4,8.8.8.8", "8.8.4.4, 8.8.8.8 (Google DNS)") o:value("208.67.222.222,208.67.220.220", "208.67.222.222, 208.67.220.220 (Open DNS)") -if is_finded("dns2socks") then - o:value("dns2socks", "dns2socks " .. translate("Need Socks5 server")) -end o:depends("dns_mode", "chinadns-ng") ---- Use TCP Node Resolve DNS -o = s:option(Flag, "use_tcp_node_resolve_dns", - translate("Use TCP Node Resolve DNS"), - translate("If checked, DNS is resolved using the TCP node.")) -o.default = 1 -o:depends("dns_mode", "pdnsd") +if is_installed("pdnsd") or is_installed("pdnsd-alt") or is_finded("pdnsd") then + o = s:option(Flag, "use_tcp_node_resolve_dns", + translate("Use TCP Node Resolve DNS"), + translate("If checked, DNS is resolved using the TCP node.")) + o.default = 1 + o:depends("dns_mode", "pdnsd") +end ---- DNS Forward o = s:option(Value, "dns_forward", translate("DNS Address")) @@ -156,6 +163,7 @@ o:value("208.67.220.220", "208.67.220.220 (Open DNS)") o:depends("dns_mode", "dns2socks") o:depends("dns_mode", "pdnsd") o:depends("up_trust_chinadns_ng_dns", "dns2socks") +o:depends("up_trust_chinadns_ng_dns", "pdnsd") ---- DNS Hijack o = s:option(Flag, "dns_53", translate("DNS Hijack")) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua index 1d10aae432..8fcffa0ede 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/node_config.lua @@ -1,5 +1,6 @@ local d = require "luci.dispatcher" local ipkg = require("luci.model.ipkg") +local uci = require"luci.model.uci".cursor() local api = require "luci.model.cbi.passwall.api.api" local appname = "passwall" @@ -9,12 +10,23 @@ local function get_customed_path(e) end local function is_finded(e) - return luci.sys.exec("find /usr/*bin %s -iname %s -type f" % {get_customed_path(e), e}) ~= "" and - true or false + return luci.sys.exec("find /usr/*bin %s -iname %s -type f" % + {get_customed_path(e), e}) ~= "" and true or false end local function is_installed(e) return ipkg.installed(e) end +local n = {} +uci:foreach(appname, "nodes", function(e) + if e.type and e.type == "V2ray" and e.remarks and e.port then + n[e[".name"]] = "[%s] %s:%s" % {e.remarks, e.address, e.port} + end +end) + +local key_table = {} +for key, _ in pairs(n) do table.insert(key_table, key) end +table.sort(key_table) + local ss_encrypt_method_list = { "rc4-md5", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "bf-cfb", "camellia-128-cfb", @@ -69,6 +81,7 @@ if is_finded("ss-redir") then type:value("SS", translate("Shadowsocks")) end if is_finded("ssr-redir") then type:value("SSR", translate("ShadowsocksR")) end if is_installed("v2ray") or is_finded("v2ray") then type:value("V2ray", translate("V2ray")) + --type:value("V2ray_balancing", translate("V2ray Balancing")) end if is_installed("brook") or is_finded("brook") then type:value("Brook", translate("Brook")) @@ -77,20 +90,45 @@ if is_installed("trojan") or is_finded("trojan") then type:value("Trojan", translate("Trojan")) end -v2ray_protocol = s:option(ListValue, "v2ray_protocol", +--[[v2ray_protocol = s:option(ListValue, "v2ray_protocol", translate("V2ray Protocol")) v2ray_protocol:value("vmess", translate("Vmess")) v2ray_protocol:depends("type", "V2ray") +--]] + +v2ray_balancing_node = s:option(DynamicList, "v2ray_balancing_node", + translate("List of backup nodes"), translate( + "List of backup nodes, the first of which must be the primary node and the others the standby node.")) +for _, key in pairs(key_table) do v2ray_balancing_node:value(key, n[key]) end +v2ray_balancing_node:depends("type", "V2ray_balancing") address = s:option(Value, "address", translate("Address (Support Domain Name)")) address.rmempty = false +address:depends("type", "Socks5") +address:depends("type", "SS") +address:depends("type", "SSR") +address:depends("type", "V2ray") +address:depends("type", "Brook") +address:depends("type", "Trojan") use_ipv6 = s:option(Flag, "use_ipv6", translate("Use IPv6")) use_ipv6.default = 0 +use_ipv6:depends("type", "Socks5") +use_ipv6:depends("type", "SS") +use_ipv6:depends("type", "SSR") +use_ipv6:depends("type", "V2ray") +use_ipv6:depends("type", "Brook") +use_ipv6:depends("type", "Trojan") port = s:option(Value, "port", translate("Port")) port.datatype = "port" port.rmempty = false +port:depends("type", "Socks5") +port:depends("type", "SS") +port:depends("type", "SSR") +port:depends("type", "V2ray") +port:depends("type", "Brook") +port:depends("type", "Trojan") username = s:option(Value, "username", translate("Username")) username:depends("type", "Socks5") @@ -151,7 +189,8 @@ ss_plugin:value("none", translate("none")) if is_finded("v2ray-plugin") then ss_plugin:value("v2ray-plugin") end ss_plugin:depends("type", "SS") -ss_plugin_v2ray_opts = s:option(Value, "ss_plugin_v2ray_opts", translate("opts")) +ss_plugin_v2ray_opts = + s:option(Value, "ss_plugin_v2ray_opts", translate("opts")) ss_plugin_v2ray_opts:depends("ss_plugin", "v2ray-plugin") use_kcp = s:option(Flag, "use_kcp", translate("Use Kcptun"), @@ -184,11 +223,11 @@ kcp_opts:depends("use_kcp", "1") v2ray_VMess_id = s:option(Value, "v2ray_VMess_id", translate("ID")) v2ray_VMess_id.password = true -v2ray_VMess_id:depends("v2ray_protocol", "vmess") +v2ray_VMess_id:depends("type", "V2ray") v2ray_VMess_alterId = s:option(Value, "v2ray_VMess_alterId", translate("Alter ID")) -v2ray_VMess_alterId:depends("v2ray_protocol", "vmess") +v2ray_VMess_alterId:depends("type", "V2ray") v2ray_VMess_level = s:option(Value, "v2ray_VMess_level", translate("User Level")) @@ -202,6 +241,7 @@ v2ray_stream_security = s:option(ListValue, "v2ray_stream_security", v2ray_stream_security:value("none", "none") v2ray_stream_security:value("tls", "tls") v2ray_stream_security:depends("type", "V2ray") +v2ray_stream_security:depends("type", "V2ray_balancing") -- [[ TLS部分 ]] -- tls_serverName = s:option(Value, "tls_serverName", translate("Domain")) @@ -222,15 +262,16 @@ v2ray_transport:value("h2", "HTTP/2") v2ray_transport:value("ds", "DomainSocket") v2ray_transport:value("quic", "QUIC") v2ray_transport:depends("type", "V2ray") +v2ray_transport:depends("type", "V2ray_balancing") -- [[ TCP部分 ]]-- -- TCP伪装 v2ray_tcp_guise = s:option(ListValue, "v2ray_tcp_guise", translate("Camouflage Type")) -v2ray_tcp_guise:depends("v2ray_transport", "tcp") v2ray_tcp_guise:value("none", "none") v2ray_tcp_guise:value("http", "http") +v2ray_tcp_guise:depends("v2ray_transport", "tcp") -- HTTP域名 v2ray_tcp_guise_http_host = s:option(DynamicList, "v2ray_tcp_guise_http_host", @@ -319,6 +360,7 @@ v2ray_quic_guise:depends("v2ray_transport", "quic") v2ray_mux = s:option(Flag, "v2ray_mux", translate("Mux")) v2ray_mux:depends("type", "V2ray") +v2ray_mux:depends("type", "V2ray_balancing") v2ray_mux_concurrency = s:option(Value, "v2ray_mux_concurrency", translate("Mux Concurrency")) @@ -367,12 +409,15 @@ trojan_cert_path:depends("trojan_verify_cert", "1") -- v2ray_insecure = s:option(Flag, "v2ray_insecure", translate("allowInsecure")) -- v2ray_insecure:depends("type", "V2ray") +-- v2ray_insecure:depends("type", "V2ray_balancing") function rmempty_restore() + address.rmempty = true + port.rmempty = true password.rmempty = true timeout.rmempty = true tcp_fast_open.rmempty = true - v2ray_protocol.rmempty = true + --v2ray_protocol.rmempty = true v2ray_VMess_id.rmempty = true v2ray_VMess_alterId.rmempty = true end @@ -380,20 +425,31 @@ end type.validate = function(self, value) rmempty_restore() if value == "SS" then + address.rmempty = false + port.rmempty = false password.rmempty = false timeout.rmempty = false tcp_fast_open.rmempty = false elseif value == "SSR" then + address.rmempty = false + port.rmempty = false password.rmempty = false timeout.rmempty = false tcp_fast_open.rmempty = false elseif value == "V2ray" then - v2ray_protocol.rmempty = false + address.rmempty = false + port.rmempty = false + --v2ray_protocol.rmempty = false v2ray_VMess_id.rmempty = false v2ray_VMess_alterId.rmempty = false + elseif value == "V2ray_balancing" then elseif value == "Brook" then + address.rmempty = false + port.rmempty = false password.rmempty = false elseif value == "Trojan" then + address.rmempty = false + port.rmempty = false password.rmempty = false tcp_fast_open.rmempty = false end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua index 885cba6289..47c4254771 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/other.lua @@ -114,7 +114,7 @@ o.default = 0 -- [[ Other Settings ]]-- s = m:section(TypedSection, "global_other", translate("Other Settings"), translatef( - "You can only set up a maximum of %s nodes for the time being", + "You can only set up a maximum of %s nodes for the time being, Used for access control.", "3")) s.anonymous = true s.addremove = false @@ -149,7 +149,8 @@ o.default = "1" o.rmempty = false ---- 显示节点检测 -o = s:option(Flag, "status_show_check_port", translate("Status Show Check Port")) +o = + s:option(Flag, "status_show_check_port", translate("Status Show Check Port")) o.default = "0" o.rmempty = false diff --git a/package/lienol/luci-app-passwall/po/zh-cn/passwall.po b/package/lienol/luci-app-passwall/po/zh-cn/passwall.po index 1985911507..6026d9c0ef 100644 --- a/package/lienol/luci-app-passwall/po/zh-cn/passwall.po +++ b/package/lienol/luci-app-passwall/po/zh-cn/passwall.po @@ -223,8 +223,8 @@ msgstr "自定义" msgid "DNS Server" msgstr "DNS服务器" -msgid "Need Socks5 server" -msgstr "需要Socks5" +msgid "Use Socks5 Node Resolve DNS" +msgstr "使用Socks5节点解析DNS" msgid "Multi Process Option" msgstr "多进程并发" @@ -778,8 +778,8 @@ msgstr "账号密码" msgid "Node Number" msgstr "节点数量" -msgid "You can only set up a maximum of %s nodes for the time being" -msgstr "目前最多只能设置%s个节点" +msgid "You can only set up a maximum of %s nodes for the time being, Used for access control." +msgstr "目前最多只能设置%s个节点,用于给访问控制使用。" msgid "Status Use Big Icon" msgstr "状态信息使用大图标" diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh index 141786ff25..5dd8eabada 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/app.sh @@ -22,8 +22,11 @@ RULE_PATH=/etc/config/${CONFIG}_rule APP_PATH=/usr/share/$CONFIG TMP_DNSMASQ_PATH=/var/etc/dnsmasq-passwall.d DNSMASQ_PATH=/etc/dnsmasq.d +RESOLVFILE=/tmp/resolv.conf.d/resolv.conf.auto lanip=$(uci get network.lan.ipaddr) DNS_PORT=7913 +API_GEN_V2RAY=/usr/lib/lua/luci/model/cbi/passwall/api/gen_v2ray_client_config_file.lua +API_GEN_TROJAN=/usr/lib/lua/luci/model/cbi/passwall/api/gen_trojan_client_config_file.lua get_date() { echo "$(date "+%Y-%m-%d %H:%M:%S")" @@ -198,14 +201,15 @@ load_config() { fi LOCALHOST_PROXY_MODE=$(config_t_get global localhost_proxy_mode default) UP_CHINA_DNS=$(config_t_get global up_china_dns 223.5.5.5,114.114.114.114) + [ ! -f "$RESOLVFILE" ] && RESOLVFILE=/tmp/resolv.conf.auto [ "$UP_CHINA_DNS" == "dnsbyisp" ] && { - local dns1=$(cat /tmp/resolv.conf.auto 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 '1P') + local dns1=$(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 '1P') if [ -n "$dns1" ]; then UP_CHINA_DNS=$dns1 else UP_CHINA_DNS="223.5.5.5,114.114.114.114" fi - local dns2=$(cat /tmp/resolv.conf.auto 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') + local 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 "$dns1" -a -n "$dns2" ] && UP_CHINA_DNS="$dns1,$dns2" } TCP_REDIR_PORT1=$(config_t_get global_proxy tcp_redir_port 1041) @@ -263,12 +267,12 @@ gen_ss_ssr_config_file() { echo -e "}" >>$configfile } -gen_config_file() { - local node local_port redir_type config_file_path server_host server_ip port type use_ipv6 network_type +gen_start_config() { + local node local_port redir_type config_file server_host server_ip port type use_ipv6 network_type node=$1 local_port=$2 redir_type=$3 - config_file_path=$4 + config_file=$4 remarks=$(config_n_get $node remarks) server_host=$(config_n_get $node address) use_ipv6=$(config_n_get $node use_ipv6) @@ -279,21 +283,53 @@ gen_config_file() { type=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z') echolog "$redir_type节点:$remarks,节点地址端口:${server_ip}:${port}" - if [ "$redir_type" == "Socks5" ]; then + if [ "$redir_type" == "SOCKS5" ]; then if [ "$network_type" == "ipv6" ]; then eval SOCKS5_NODE${5}_IPV6=$server_ip else eval SOCKS5_NODE${5}_IP=$server_ip fi eval SOCKS5_NODE${5}_PORT=$port - if [ "$type" == "ss" -o "$type" == "ssr" ]; then - gen_ss_ssr_config_file $type $local_port 0 $node $config_file_path + if [ "$type" == "socks5" ]; then + echolog "Socks5节点不能使用Socks5代理节点!" elif [ "$type" == "v2ray" ]; then - lua /usr/lib/lua/luci/model/cbi/passwall/api/gen_v2ray_client_config_file.lua $node nil nil $local_port >$config_file_path + lua $API_GEN_V2RAY $node nil nil $local_port >$config_file + v2ray_path=$(config_t_get global_app v2ray_file $(find_bin v2ray)) + if [ -f "${v2ray_path}/v2ray" ]; then + ${v2ray_path}/v2ray -config=$config_file >/dev/null & + else + echolog "找不到V2ray客户端主程序,无法启用!" + fi + elif [ "$type" == "trojan" ]; then + lua $API_GEN_TROJAN $node client "0.0.0.0" $local_port >$config_file + trojan_bin=$(find_bin trojan) + [ -f "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & elif [ "$type" == "brook" ]; then BROOK_SOCKS5_CMD="client -l 0.0.0.0:$local_port -i 0.0.0.0 -s $server_ip:$port -p $(config_n_get $node password)" - elif [ "$type" == "trojan" ]; then - lua /usr/lib/lua/luci/model/cbi/passwall/api/gen_trojan_client_config_file.lua $node client "0.0.0.0" $local_port >$config_file_path + brook_bin=$(config_t_get global_app brook_file $(find_bin brook)) + if [ -f "$brook_bin" ]; then + $brook_bin $BROOK_SOCKS5_CMD &>/dev/null & + else + echolog "找不到Brook客户端主程序,无法启用!" + fi + elif [ "$type" == "ssr" ]; then + gen_ss_ssr_config_file ssr $local_port 0 $node $config_file + ssr_bin=$(find_bin ssr-local) + [ -n "$ssr_bin" ] && $ssr_bin -c $config_file -b 0.0.0.0 -u >/dev/null 2>&1 & + elif [ "$type" == "ss" ]; then + gen_ss_ssr_config_file ss $local_port 0 $node $config_file + ss_bin=$(find_bin ss-local) + [ -n "$ss_bin" ] && { + local plugin_params="" + local plugin=$(config_n_get $node ss_plugin) + if [ "$plugin" != "none" ]; then + [ "$plugin" == "v2ray-plugin" ] && { + local opts=$(config_n_get $node ss_plugin_v2ray_opts) + plugin_params="--plugin v2ray-plugin --plugin-opts $opts" + } + fi + $ss_bin -c $config_file -b 0.0.0.0 -u $plugin_params >/dev/null 2>&1 & + } fi fi @@ -304,17 +340,82 @@ gen_config_file() { eval UDP_NODE${5}_IP=$server_ip fi eval UDP_NODE${5}_PORT=$port - if [ "$type" == "ss" -o "$type" == "ssr" ]; then - gen_ss_ssr_config_file $type $local_port 0 $node $config_file_path + + if [ "$type" == "socks5" ]; then + local node_address=$(config_n_get $node address) + local node_port=$(config_n_get $node port) + local server_username=$(config_n_get $node username) + local server_password=$(config_n_get $node password) + eval port=\$UDP_REDIR_PORT$5 + ipt2socks_bin=$(find_bin ipt2socks) + [ -f "$ipt2socks_bin" ] && $ipt2socks_bin -U -l $port -b 0.0.0.0 -s $node_address -p $node_port -R >/dev/null & + + #redsocks_bin=$(find_bin redsocks2) + #[ -n "$redsocks_bin" ] && { + # local redsocks_config_file=$CONFIG_PATH/UDP_$i.conf + # gen_redsocks_config $redsocks_config_file udp $port $node_address $node_port $server_username $server_password + # $redsocks_bin -c $redsocks_config_file >/dev/null & + #} elif [ "$type" == "v2ray" ]; then - lua /usr/lib/lua/luci/model/cbi/passwall/api/gen_v2ray_client_config_file.lua $node udp $local_port nil >$config_file_path - elif [ "$type" == "brook" ]; then - BROOK_UDP_CMD="tproxy -l 0.0.0.0:$local_port -s $server_ip:$port -p $(config_n_get $node password)" + lua $API_GEN_V2RAY $node udp $local_port nil >$config_file + v2ray_path=$(config_t_get global_app v2ray_file $(find_bin v2ray)) + if [ -f "${v2ray_path}/v2ray" ]; then + ${v2ray_path}/v2ray -config=$config_file >/dev/null & + else + echolog "找不到V2ray客户端主程序,无法启用!" + fi elif [ "$type" == "trojan" ]; then SOCKS5_PROXY_PORT4=$(expr $SOCKS5_PROXY_PORT3 + 1) local_port=$(get_not_exists_port_after $SOCKS5_PROXY_PORT4 tcp) socks5_port=$local_port - lua /usr/lib/lua/luci/model/cbi/passwall/api/gen_trojan_client_config_file.lua $node client "127.0.0.1" $socks5_port >$config_file_path + lua $API_GEN_TROJAN $node client "127.0.0.1" $socks5_port >$config_file + trojan_bin=$(find_bin trojan) + [ -f "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & + + local node_address=$(config_n_get $node address) + local node_port=$(config_n_get $node port) + local server_username=$(config_n_get $node username) + local server_password=$(config_n_get $node password) + eval port=\$UDP_REDIR_PORT$5 + ipt2socks_bin=$(find_bin ipt2socks) + [ -f "$ipt2socks_bin" ] && $ipt2socks_bin -U -l $port -b 0.0.0.0 -s 127.0.0.1 -p $socks5_port -R >/dev/null & + + #redsocks_bin=$(find_bin redsocks2) + #[ -n "$redsocks_bin" ] && { + # local redsocks_config_file=$CONFIG_PATH/redsocks_UDP_$i.conf + # gen_redsocks_config $redsocks_config_file udp $port "127.0.0.1" $socks5_port + # $redsocks_bin -c $redsocks_config_file >/dev/null & + #} + elif [ "$type" == "brook" ]; then + BROOK_UDP_CMD="tproxy -l 0.0.0.0:$local_port -s $server_ip:$port -p $(config_n_get $node password)" + brook_bin=$(config_t_get global_app brook_file $(find_bin brook)) + if [ -f "$brook_bin" ]; then + $brook_bin $BROOK_UDP_CMD &>/dev/null & + else + echolog "找不到Brook客户端主程序,无法启用!" + fi + elif [ "$type" == "ssr" ]; then + gen_ss_ssr_config_file ssr $local_port 0 $node $config_file + ssr_bin=$(find_bin ssr-redir) + if [ -f "$ssr_bin" ]; then + $ssr_bin -c $config_file -f $RUN_PID_PATH/udp_ssr_1_$5 -U >/dev/null 2>&1 & + else + echolog "找不到ssr客户端主程序,无法启用!" + fi + elif [ "$type" == "ss" ]; then + gen_ss_ssr_config_file ss $local_port 0 $node $config_file + ss_bin=$(find_bin ss-redir) + [ -f "$ss_bin" ] && { + local plugin_params="" + local plugin=$(config_n_get $node ss_plugin) + if [ "$plugin" != "none" ]; then + [ "$plugin" == "v2ray-plugin" ] && { + local opts=$(config_n_get $node ss_plugin_v2ray_opts) + plugin_params="--plugin v2ray-plugin --plugin-opts $opts" + } + fi + $ss_bin -c $config_file -f $RUN_PID_PATH/udp_ss_1_$5 -U $plugin_params >/dev/null 2>&1 & + } fi fi @@ -326,13 +427,36 @@ gen_config_file() { fi eval TCP_NODE${5}_PORT=$port - if [ "$type" == "v2ray" ]; then - lua /usr/lib/lua/luci/model/cbi/passwall/api/gen_v2ray_client_config_file.lua $node tcp $local_port nil >$config_file_path + if [ "$type" == "socks5" ]; then + local node_address=$(config_n_get $node address) + local node_port=$(config_n_get $node port) + local server_username=$(config_n_get $node username) + local server_password=$(config_n_get $node password) + eval port=\$TCP_REDIR_PORT$5 + ipt2socks_bin=$(find_bin ipt2socks) + [ -f "$ipt2socks_bin" ] && $ipt2socks_bin -l $port -b 0.0.0.0 -s $node_address -p $socks5_port -R >/dev/null & + + #redsocks_bin=$(find_bin redsocks2) + #[ -n "$redsocks_bin" ] && { + # local redsocks_config_file=$CONFIG_PATH/TCP_$i.conf + # gen_redsocks_config $redsocks_config_file tcp $port $node_address $socks5_port $server_username $server_password + # $redsocks_bin -c $redsocks_config_file >/dev/null & + #} + elif [ "$type" == "v2ray" ]; then + lua $API_GEN_V2RAY $node tcp $local_port nil >$config_file + v2ray_path=$(config_t_get global_app v2ray_file $(find_bin v2ray)) + if [ -f "${v2ray_path}/v2ray" ]; then + ${v2ray_path}/v2ray -config=$config_file >/dev/null & + else + echolog "找不到V2ray客户端主程序,无法启用!" + fi elif [ "$type" == "trojan" ]; then - lua /usr/lib/lua/luci/model/cbi/passwall/api/gen_trojan_client_config_file.lua $node nat "0.0.0.0" $local_port >$config_file_path + lua $API_GEN_TROJAN $node nat "0.0.0.0" $local_port >$config_file + trojan_bin=$(find_bin trojan) + [ -f "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & else local kcptun_use kcptun_server_host kcptun_port kcptun_config - kcptun_use=$(config_n_get $node use_kcp) + kcptun_use=$(config_n_get $node use_kcp 0) kcptun_server_host=$(config_n_get $node kcp_server) kcptun_port=$(config_n_get $node kcp_port) kcptun_config=$(config_n_get $node kcp_opts) @@ -370,22 +494,48 @@ gen_config_file() { echolog "KCP节点IP地址:$kcptun_server_ip" fi if [ -z "$kcptun_path" ]; then - echolog "找不到Kcptun客户端主程序,无法启用!!!" + echolog "找不到Kcptun客户端主程序,无法启用!" else $kcptun_bin --log $CONFIG_PATH/kcptun -l 0.0.0.0:$KCPTUN_REDIR_PORT -r $run_kcptun_ip:$kcptun_port "$kcptun_config" >/dev/null 2>&1 & echolog "运行Kcptun..." fi - if [ "$type" == "ss" -o "$type" == "ssr" ]; then - gen_ss_ssr_config_file $type $local_port 1 $node $config_file_path - fi - if [ "$type" == "brook" ]; then - BROOK_TCP_CMD="tproxy -l 0.0.0.0:$local_port -s 127.0.0.1:$KCPTUN_REDIR_PORT -p $(config_n_get $node password)" - fi - else - if [ "$type" == "ss" -o "$type" == "ssr" ]; then - gen_ss_ssr_config_file $type $local_port 0 $node $config_file_path - elif [ "$type" == "brook" ]; then - BROOK_TCP_CMD="tproxy -l 0.0.0.0:$local_port -s $server_ip:$port -p $(config_n_get $node password)" + fi + + if [ "$type" == "ssr" ]; then + gen_ss_ssr_config_file ssr $local_port $kcptun_use $node $config_file + ssr_bin=$(find_bin ssr-redir) + [ -f "$ssr_bin" ] && { + for k in $(seq 1 $process); do + $ssr_bin -c $config_file -f $RUN_PID_PATH/tcp_ssr_${k}_${5} >/dev/null 2>&1 & + done + } + elif [ "$type" == "ss" ]; then + gen_ss_ssr_config_file ss $local_port $kcptun_use $node $config_file + ss_bin=$(find_bin ${type}-redir) + [ -f "$ss_bin" ] && { + local plugin_params="" + local plugin=$(config_n_get $node ss_plugin) + if [ "$plugin" != "none" ]; then + [ "$plugin" == "v2ray-plugin" ] && { + local opts=$(config_n_get $node ss_plugin_v2ray_opts) + plugin_params="--plugin v2ray-plugin --plugin-opts $opts" + } + fi + for k in $(seq 1 $process); do + $ss_bin -c $config_file -f $RUN_PID_PATH/tcp_ss_${k}_${5} $plugin_params >/dev/null 2>&1 & + done + } + elif [ "$type" == "brook" ]; then + [ "$kcptun_use" == "1" ] && { + server_ip=127.0.0.1 + port=$KCPTUN_REDIR_PORT + } + BROOK_TCP_CMD="tproxy -l 0.0.0.0:$local_port -s $server_ip:$port -p $(config_n_get $node password)" + brook_bin=$(config_t_get global_app brook_file $(find_bin brook)) + if [ -f "$brook_bin" ]; then + $brook_bin $BROOK_TCP_CMD &>/dev/null & + else + echolog "找不到Brook客户端主程序,无法启用!" fi fi fi @@ -393,222 +543,25 @@ gen_config_file() { return 0 } -start_tcp_redir() { - for i in $(seq 1 $TCP_NODE_NUM); do - eval temp_server=\$TCP_NODE$i - [ "$temp_server" != "nil" ] && { - TYPE=$(echo $(config_n_get $temp_server type) | tr 'A-Z' 'a-z') - local config_file=$CONFIG_PATH/TCP_$i.json - eval current_port=\$TCP_REDIR_PORT$i - local port=$(echo $(get_not_exists_port_after $current_port tcp)) - eval TCP_REDIR_PORT$i=$port - gen_config_file $temp_server $port TCP $config_file $i - if [ "$TYPE" == "v2ray" ]; then - v2ray_path=$(config_t_get global_app v2ray_file) - if [ -f "${v2ray_path}/v2ray" ]; then - ${v2ray_path}/v2ray -config=$config_file >/dev/null & - else - v2ray_bin=$(find_bin v2ray) - [ -n "$v2ray_bin" ] && $v2ray_bin -config=$config_file >/dev/null & - fi - elif [ "$TYPE" == "brook" ]; then - brook_bin=$(config_t_get global_app brook_file) - if [ -f "$brook_bin" ]; then - $brook_bin $BROOK_TCP_CMD &>/dev/null & - else - brook_bin=$(find_bin brook) - [ -n "$brook_bin" ] && $brook_bin $BROOK_TCP_CMD &>/dev/null & - fi - elif [ "$TYPE" == "trojan" ]; then - trojan_bin=$(find_bin trojan) - [ -n "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & - elif [ "$TYPE" == "socks5" ]; then - local node_address=$(config_n_get $temp_server address) - local node_port=$(config_n_get $temp_server port) - local server_username=$(config_n_get $temp_server username) - local server_password=$(config_n_get $temp_server password) - ipt2socks_bin=$(find_bin ipt2socks) - [ -n "$ipt2socks_bin" ] && { - $ipt2socks_bin -T -l $port -b 0.0.0.0 -s $node_address -p $socks5_port -R >/dev/null & - } - #redsocks_bin=$(find_bin redsocks2) - #[ -n "$redsocks_bin" ] && { - # local redsocks_config_file=$CONFIG_PATH/TCP_$i.conf - # gen_redsocks_config $redsocks_config_file tcp $port $node_address $socks5_port $server_username $server_password - # $redsocks_bin -c $redsocks_config_file >/dev/null & - #} - elif [ "$TYPE" == "ssr" ]; then - ssr_bin=$(find_bin ssr-redir) - [ -n "$ssr_bin" ] && { - for k in $(seq 1 $process); do - $ssr_bin -c $config_file -f $RUN_PID_PATH/tcp_${TYPE}_$k_$i >/dev/null 2>&1 & - done - } - elif [ "$TYPE" == "ss" ]; then - ss_bin=$(find_bin ss-redir) - [ -n "$ss_bin" ] && { - local plugin_params="" - local plugin=$(config_n_get $temp_server ss_plugin) - if [ "$plugin" != "none" ]; then - [ "$plugin" == "v2ray-plugin" ] && { - local opts=$(config_n_get $temp_server ss_plugin_v2ray_opts) - plugin_params="--plugin v2ray-plugin --plugin-opts $opts" - } - fi - for k in $(seq 1 $process); do - $ss_bin -c $config_file -f $RUN_PID_PATH/tcp_${TYPE}_$k_$i $plugin_params >/dev/null 2>&1 & - done - } - fi - echo $port > $RUN_PORT_PATH/TCP_${i} - eval ip=\$TCP_NODE${i}_IP - echo $ip > $RUN_IP_PATH/TCP_${i} - echo $temp_server > $RUN_ID_PATH/TCP_${i} +start_redir() { + eval num=\$${1}_NODE_NUM + for i in $(seq 1 $num); do + eval node=\$${1}_NODE$i + [ "$node" != "nil" ] && { + TYPE=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z') + local config_file=$CONFIG_PATH/${1}_${i}.json + eval current_port=\$${1}_${2}_PORT$i + local port=$(echo $(get_not_exists_port_after $current_port $3)) + eval ${1}_${2}$i=$port + gen_start_config $node $port $1 $config_file $i + echo $port > $RUN_PORT_PATH/${1}_${i} + eval ip=\$${1}_NODE${i}_IP + echo $ip > $RUN_IP_PATH/${1}_${i} + echo $node > $RUN_ID_PATH/${1}_${i} } done } -start_udp_redir() { - for i in $(seq 1 $UDP_NODE_NUM); do - eval temp_server=\$UDP_NODE$i - [ "$temp_server" != "nil" ] && { - TYPE=$(echo $(config_n_get $temp_server type) | tr 'A-Z' 'a-z') - local config_file=$CONFIG_PATH/UDP_$i.json - eval current_port=\$UDP_REDIR_PORT$i - local port=$(echo $(get_not_exists_port_after $current_port udp)) - eval UDP_REDIR_PORT$i=$port - gen_config_file $temp_server $port UDP $config_file $i - if [ "$TYPE" == "v2ray" ]; then - v2ray_path=$(config_t_get global_app v2ray_file) - if [ -f "${v2ray_path}/v2ray" ]; then - ${v2ray_path}/v2ray -config=$config_file >/dev/null & - else - v2ray_bin=$(find_bin v2ray) - [ -n "$v2ray_bin" ] && $v2ray_bin -config=$config_file >/dev/null & - fi - elif [ "$TYPE" == "brook" ]; then - brook_bin=$(config_t_get global_app brook_file) - if [ -f "$brook_bin" ]; then - $brook_bin $BROOK_UDP_CMD >/dev/null & - else - brook_bin=$(find_bin brook) - [ -n "$brook_bin" ] && $brook_bin $BROOK_UDP_CMD >/dev/null & - fi - elif [ "$TYPE" == "trojan" ]; then - trojan_bin=$(find_bin trojan) - [ -n "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & - local node_address=$(config_n_get $temp_server address) - local node_port=$(config_n_get $temp_server port) - local server_username=$(config_n_get $temp_server username) - local server_password=$(config_n_get $temp_server password) - ipt2socks_bin=$(find_bin ipt2socks) - [ -n "$ipt2socks_bin" ] && { - $ipt2socks_bin -U -l $port -b 0.0.0.0 -s 127.0.0.1 -p $socks5_port -R >/dev/null & - } - - #redsocks_bin=$(find_bin redsocks2) - #[ -n "$redsocks_bin" ] && { - # local redsocks_config_file=$CONFIG_PATH/redsocks_UDP_$i.conf - # gen_redsocks_config $redsocks_config_file udp $port "127.0.0.1" $socks5_port - # $redsocks_bin -c $redsocks_config_file >/dev/null & - #} - elif [ "$TYPE" == "socks5" ]; then - local node_address=$(config_n_get $temp_server address) - local node_port=$(config_n_get $temp_server port) - local server_username=$(config_n_get $temp_server username) - local server_password=$(config_n_get $temp_server password) - ipt2socks_bin=$(find_bin ipt2socks) - [ -n "$ipt2socks_bin" ] && { - $ipt2socks_bin -U -l $port -b 0.0.0.0 -s $node_address -p $node_port -R >/dev/null & - } - - #redsocks_bin=$(find_bin redsocks2) - #[ -n "$redsocks_bin" ] && { - # local redsocks_config_file=$CONFIG_PATH/UDP_$i.conf - # gen_redsocks_config $redsocks_config_file udp $port $node_address $node_port $server_username $server_password - # $redsocks_bin -c $redsocks_config_file >/dev/null & - #} - elif [ "$TYPE" == "ssr" ]; then - ssr_bin=$(find_bin ssr-redir) - [ -n "$ssr_bin" ] && $ssr_bin -c $config_file -f $RUN_PID_PATH/udp_${TYPE}_1_$i -U >/dev/null 2>&1 & - elif [ "$TYPE" == "ss" ]; then - ss_bin=$(find_bin ss-redir) - [ -n "$ss_bin" ] && { - local plugin_params="" - local plugin=$(config_n_get $temp_server ss_plugin) - if [ "$plugin" != "none" ]; then - [ "$plugin" == "v2ray-plugin" ] && { - local opts=$(config_n_get $temp_server ss_plugin_v2ray_opts) - plugin_params="--plugin v2ray-plugin --plugin-opts $opts" - } - fi - $ss_bin -c $config_file -f $RUN_PID_PATH/udp_${TYPE}_1_$i -U $plugin_params >/dev/null 2>&1 & - } - fi - echo $port > $RUN_PORT_PATH/UDP_${i} - eval ip=\$UDP_NODE${i}_IP - echo $ip > $RUN_IP_PATH/UDP_${i} - echo $temp_server > $RUN_ID_PATH/UDP_${i} - } - done -} - -start_socks5_proxy() { - for i in $(seq 1 $SOCKS5_NODE_NUM); do - eval temp_server=\$SOCKS5_NODE$i - if [ "$temp_server" != "nil" ]; then - TYPE=$(echo $(config_n_get $temp_server type) | tr 'A-Z' 'a-z') - local config_file=$CONFIG_PATH/Socks5_$i.json - eval current_port=\$SOCKS5_PROXY_PORT$i - local port=$(get_not_exists_port_after $current_port tcp) - eval SOCKS5_PROXY_PORT$i=$port - gen_config_file $temp_server $port Socks5 $config_file $i - if [ "$TYPE" == "v2ray" ]; then - v2ray_path=$(config_t_get global_app v2ray_file) - if [ -f "${v2ray_path}/v2ray" ]; then - ${v2ray_path}/v2ray -config=$config_file >/dev/null & - else - v2ray_bin=$(find_bin v2ray) - [ -n "$v2ray_bin" ] && $v2ray_bin -config=$config_file >/dev/null & - fi - elif [ "$TYPE" == "brook" ]; then - brook_bin=$(config_t_get global_app brook_file) - if [ -f "$brook_bin" ]; then - $brook_bin $BROOK_SOCKS5_CMD >/dev/null & - else - brook_bin=$(find_bin brook) - [ -n "$brook_bin" ] && $brook_bin $BROOK_SOCKS5_CMD >/dev/null & - fi - elif [ "$TYPE" == "trojan" ]; then - trojan_bin=$(find_bin trojan) - [ -n "$trojan_bin" ] && $trojan_bin -c $config_file >/dev/null 2>&1 & - elif [ "$TYPE" == "socks5" ]; then - echolog "Socks5节点不能使用Socks5代理节点!" - elif [ "$TYPE" == "ssr" ]; then - ssr_bin=$(find_bin ssr-local) - [ -n "$ssr_bin" ] && $ssr_bin -c $config_file -b 0.0.0.0 -u >/dev/null 2>&1 & - elif [ "$TYPE" == "ss" ]; then - ss_bin=$(find_bin ss-local) - [ -n "$ss_bin" ] && { - local plugin_params="" - local plugin=$(config_n_get $temp_server ss_plugin) - if [ "$plugin" != "none" ]; then - [ "$plugin" == "v2ray-plugin" ] && { - local opts=$(config_n_get $temp_server ss_plugin_v2ray_opts) - plugin_params="--plugin v2ray-plugin --plugin-opts $opts" - } - fi - $ss_bin -c $config_file -b 0.0.0.0 -u $plugin_params >/dev/null 2>&1 & - } - fi - echo $port > $RUN_PORT_PATH/Socks5_${i} - eval ip=\$SOCKS5_NODE${i}_IP - echo $ip > $RUN_IP_PATH/SOCKS5_${i} - echo $temp_server > $RUN_ID_PATH/SOCKS5_${i} - fi - done -} - clean_log() { logsnum=$(cat $LOG_FILE 2>/dev/null | wc -l) if [ "$logsnum" -gt 300 ]; then @@ -711,12 +664,13 @@ start_dns() { } else echolog "dns2socks模式需要使用Socks5代理节点,请开启!" + force_stop fi ;; pdnsd) pdnsd_bin=$(find_bin pdnsd) [ -n "$pdnsd_bin" ] && { - gen_pdnsd_config + gen_pdnsd_config $DNS_PORT "cache" nohup $pdnsd_bin --daemon -c $pdnsd_dir/pdnsd.conf -d >/dev/null 2>&1 & echolog "运行DNS转发模式:pdnsd..." } @@ -729,8 +683,22 @@ start_dns() { [ -f "$CONFIG_PATH/gfwlist_chinadns_ng.txt" ] && local gfwlist_param="-g $CONFIG_PATH/gfwlist_chinadns_ng.txt" [ -f "$RULE_PATH/chnlist" ] && local chnlist_param="-m $RULE_PATH/chnlist" - up_trust_chinadns_ng_dns=$(config_t_get global up_trust_chinadns_ng_dns "8.8.4.4,8.8.8.8") - if [ "$up_trust_chinadns_ng_dns" == "dns2socks" ]; then + up_trust_chinadns_ng_dns=$(config_t_get global up_trust_chinadns_ng_dns "pdnsd") + if [ "$up_trust_chinadns_ng_dns" == "pdnsd" ]; then + if [ -z "$TCP_NODE1" -o "$TCP_NODE1" == "nil" ]; then + echolog "ChinaDNS-NG + pdnsd 模式需要启用TCP节点!" + force_stop + else + use_tcp_node_resolve_dns=1 + gen_pdnsd_config $other_port + pdnsd_bin=$(find_bin pdnsd) + [ -n "$pdnsd_bin" ] && { + nohup $pdnsd_bin --daemon -c $pdnsd_dir/pdnsd.conf -d >/dev/null 2>&1 & + nohup $chinadns_ng_bin -l $DNS_PORT -c $UP_CHINA_DNS -t 127.0.0.1#$other_port $gfwlist_param $chnlist_param >/dev/null 2>&1 & + echolog "运行DNS转发模式:ChinaDNS-NG + pdnsd(${DNS_FORWARD}:53),国内DNS:$UP_CHINA_DNS" + } + fi + elif [ "$up_trust_chinadns_ng_dns" == "dns2socks" ]; then if [ -n "$SOCKS5_NODE1" -a "$SOCKS5_NODE1" != "nil" ]; then dns2socks_bin=$(find_bin dns2socks) [ -n "$dns2socks_bin" ] && { @@ -892,74 +860,76 @@ gen_pdnsd_config() { mkdir -p $pdnsd_dir touch $pdnsd_dir/pdnsd.cache chown -R root.nogroup $pdnsd_dir + [ "$2" == "cache" ] && cache_param="perm_cache = 1024;\ncache_dir = \"$pdnsd_dir\";" cat > $pdnsd_dir/pdnsd.conf <<-EOF global { - perm_cache = 1024; - cache_dir = "$pdnsd_dir"; - pid_file = "$RUN_PID_PATH/pdnsd.pid"; - run_as = "root"; - server_ip = 127.0.0.1; - server_port = $DNS_PORT; - status_ctl = on; - query_method = tcp_only; - min_ttl = 1d; - max_ttl = 1w; - timeout = 10; - tcp_qtimeout = 1; - par_queries = 2; - neg_domain_pol = on; - udpbufsize = 1024; + $(echo -e $cache_param) + pid_file = "$RUN_PID_PATH/pdnsd.pid"; + run_as = "root"; + server_ip = 127.0.0.1; + server_port = $1; + status_ctl = on; + query_method = tcp_only; + min_ttl = 1d; + max_ttl = 1w; + timeout = 10; + tcp_qtimeout = 1; + par_queries = 2; + neg_domain_pol = on; + udpbufsize = 1024; } - EOF - + EOF + [ "$use_tcp_node_resolve_dns" == 1 ] && { cat >> $pdnsd_dir/pdnsd.conf <<-EOF - server { - label = "node"; - ip = $DNS_FORWARD; - edns_query = on; - port = 53; - timeout = 4; - interval = 60; - uptest = none; - purge_cache = off; - caching = on; - } - + server { + label = "node"; + ip = $DNS_FORWARD; + edns_query = on; + port = 53; + timeout = 4; + interval = 60; + uptest = none; + purge_cache = off; + caching = on; + } + + EOF + } + + [ "$DNS_MODE" != "chinadns-ng" ] && { + cat >> $pdnsd_dir/pdnsd.conf <<-EOF + server { + label = "opendns"; + ip = 208.67.222.222, 208.67.220.220; + edns_query = on; + port = 443; + timeout = 4; + interval = 60; + uptest = none; + purge_cache = off; + caching = on; + } + server { + label = "opendns"; + ip = 208.67.222.222, 208.67.220.220; + edns_query = on; + port = 5353; + timeout = 4; + interval = 60; + uptest = none; + purge_cache = off; + caching = on; + } + source { + ttl = 86400; + owner = "localhost."; + serve_aliases = on; + file = "/etc/hosts"; + } EOF } - - cat >> $pdnsd_dir/pdnsd.conf <<-EOF - server { - label = "opendns"; - ip = 208.67.222.222, 208.67.220.220; - edns_query = on; - port = 443; - timeout = 4; - interval = 60; - uptest = none; - purge_cache = off; - caching = on; - } - server { - label = "opendns"; - ip = 208.67.222.222, 208.67.220.220; - edns_query = on; - port = 5353; - timeout = 4; - interval = 60; - uptest = none; - purge_cache = off; - caching = on; - } - source { - ttl = 86400; - owner = "localhost."; - serve_aliases = on; - file = "/etc/hosts"; - } - EOF } stop_dnsmasq() { @@ -1104,9 +1074,9 @@ start() { start_dns add_dnsmasq start_haproxy - start_socks5_proxy - start_tcp_redir - start_udp_redir + start_redir SOCKS5 PROXY tcp + start_redir TCP REDIR tcp + start_redir UDP REDIR udp source $APP_PATH/iptables.sh start /etc/init.d/dnsmasq restart >/dev/null 2>&1 & start_crontab diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh index 87826afcc3..cd48a4344f 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/iptables.sh @@ -127,6 +127,8 @@ load_acl() { [ -z "$proxy_mode" -o "$proxy_mode" = "default" ] && proxy_mode=$PROXY_MODE [ -z "$tcp_redir_ports" -o "$tcp_redir_ports" = "default" ] && tcp_redir_ports=$TCP_REDIR_PORTS [ -z "$udp_redir_ports" -o "$udp_redir_ports" = "default" ] && udp_redir_ports=$UDP_REDIR_PORTS + [ -z "$tcp_node" -o "$TCP_NODE_NUM" == "1" ] && tcp_node=1 + [ -z "$udp_node" -o "$UDP_NODE_NUM" == "1" ] && udp_node=1 eval TCP_NODE=\$TCP_NODE$tcp_node eval UDP_NODE=\$UDP_NODE$udp_node local ip_mark=$(get_ip_mark $ip) @@ -275,10 +277,10 @@ add_firewall_rule() { if [ "$SOCKS5_NODE_NUM" -ge 1 ]; then for i in $(seq 1 $SOCKS5_NODE_NUM); do local k=$i - eval temp_server=\$SOCKS5_NODE$k - if [ "$temp_server" != "nil" ]; then - local address=$(config_get $temp_server address) - local SOCKS5_NODE_PORT=$(config_get $temp_server port) + eval node=\$SOCKS5_NODE$k + if [ "$node" != "nil" ]; then + local address=$(config_get $node address) + local SOCKS5_NODE_PORT=$(config_get $node port) local SOCKS5_NODE_IP=$(get_host_ip "ipv4" $address) [ -n "$SOCKS5_NODE_IP" -a -n "$SOCKS5_NODE_PORT" ] && $iptables_nat -A PSW -p tcp -d $SOCKS5_NODE_IP -m multiport --dports $SOCKS5_NODE_PORT -j RETURN fi @@ -288,16 +290,15 @@ add_firewall_rule() { if [ "$TCP_NODE_NUM" -ge 1 ]; then for i in $(seq 1 $TCP_NODE_NUM); do local k=$i - local local_port=104$k local ttl=14$k - eval temp_server=\$TCP_NODE$k + eval node=\$TCP_NODE$k eval local_port=\$TCP_REDIR_PORT$k # 生成TCP转发规则 - if [ "$temp_server" != "nil" ]; then - local address=$(config_get $temp_server address) - local TCP_NODE_PORT=$(config_get $temp_server port) + if [ "$node" != "nil" ]; then + local address=$(config_get $node address) + local TCP_NODE_PORT=$(config_get $node port) local TCP_NODE_IP=$(get_host_ip "ipv4" $address) - local TCP_NODE_TYPE=$(echo $(config_get $temp_server type) | tr 'A-Z' 'a-z') + local TCP_NODE_TYPE=$(echo $(config_get $node type) | tr 'A-Z' 'a-z') [ -n "$TCP_NODE_IP" -a -n "$TCP_NODE_PORT" ] && $iptables_nat -A PSW -p tcp -d $TCP_NODE_IP -m multiport --dports $TCP_NODE_PORT -j RETURN if [ "$TCP_NODE_TYPE" == "brook" ]; then $iptables_mangle -A PSW_ACL -p tcp -m socket -j MARK --set-mark 1 @@ -422,15 +423,14 @@ add_firewall_rule() { if [ "$UDP_NODE_NUM" -ge 1 ]; then for i in $(seq 1 $UDP_NODE_NUM); do local k=$i - local local_port=104$k - eval temp_server=\$UDP_NODE$k + eval node=\$UDP_NODE$k eval local_port=\$UDP_REDIR_PORT$k # 生成UDP转发规则 - if [ "$temp_server" != "nil" ]; then - local address=$(config_get $temp_server address) - local UDP_NODE_PORT=$(config_get $temp_server port) + if [ "$node" != "nil" ]; then + local address=$(config_get $node address) + local UDP_NODE_PORT=$(config_get $node port) local UDP_NODE_IP=$(get_host_ip "ipv4" $address) - local UDP_NODE_TYPE=$(echo $(config_get $temp_server type) | tr 'A-Z' 'a-z') + local UDP_NODE_TYPE=$(echo $(config_get $node type) | tr 'A-Z' 'a-z') [ -n "$UDP_NODE_IP" -a -n "$UDP_NODE_PORT" ] && $iptables_mangle -A PSW -p udp -d $UDP_NODE_IP -m multiport --dports $UDP_NODE_PORT -j RETURN [ "$UDP_NODE_TYPE" == "brook" ] && $iptables_mangle -A PSW_ACL -p udp -m socket -j MARK --set-mark 1 # 全局模式 diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh index 16c2560465..6f8bc69ef6 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/monitor.sh @@ -75,8 +75,8 @@ done for i in $(seq 1 $SOCKS5_NODE_NUM); do eval temp_server=\$SOCKS5_NODE$i if [ "$temp_server" != "nil" ]; then - [ -f "/var/etc/passwall/port/Socks5_$i" ] && listen_port=$(echo -n `cat /var/etc/passwall/port/Socks5_$i`) - icount=$(ps -w | grep -v grep | grep -i -E "${CONFIG}/Socks5_${i}|brook client -l 0.0.0.0:${listen_port}" | wc -l) + [ -f "/var/etc/passwall/port/SOCKS5_$i" ] && listen_port=$(echo -n `cat /var/etc/passwall/port/SOCKS5_$i`) + icount=$(ps -w | grep -v grep | grep -i -E "${CONFIG}/SOCKS5_${i}|brook client -l 0.0.0.0:${listen_port}" | wc -l) if [ $icount = 0 ]; then /etc/init.d/passwall restart exit 0 diff --git a/package/lienol/luci-app-passwall/root/usr/share/passwall/subscription.sh b/package/lienol/luci-app-passwall/root/usr/share/passwall/subscription.sh index 0f6e5ac943..60a9721427 100755 --- a/package/lienol/luci-app-passwall/root/usr/share/passwall/subscription.sh +++ b/package/lienol/luci-app-passwall/root/usr/share/passwall/subscription.sh @@ -150,16 +150,15 @@ get_remote_config(){ add_mode="$subscrib_remark" [ -n "$3" ] && add_mode="导入" new_node_type=$(echo $1 | tr '[a-z]' '[A-Z]') - decode_link="$2" if [ "$1" == "ss" ]; then - decode_link=$(ss_decode $decode_link) + decode_link=$(ss_decode $2) ss_encrypt_method=$(echo "$decode_link" | awk -F ':' '{print $1}') password=$(echo "$decode_link" | awk -F ':' '{print $2}' | awk -F '@' '{print $1}') node_address=$(echo "$decode_link" | awk -F ':' '{print $2}' | awk -F '@' '{print $2}') node_port=$(echo "$decode_link" | awk -F '@' '{print $2}' | awk -F '#' '{print $1}' | awk -F ':' '{print $2}') remarks=$(urldecode $(echo "$decode_link" | awk -F '#' '{print $2}')) elif [ "$1" == "ssr" ]; then - decode_link=$(decode_url_link $decode_link 1) + decode_link=$(decode_url_link $2 1) node_address=$(echo "$decode_link" | awk -F ':' '{print $1}') node_port=$(echo "$decode_link" | awk -F ':' '{print $2}') protocol=$(echo "$decode_link" | awk -F ':' '{print $3}')