diff --git a/package/lean/luci-app-ssr-plus/Makefile b/package/lean/luci-app-ssr-plus/Makefile index ea8c7ff06b..5ec9f1c173 100644 --- a/package/lean/luci-app-ssr-plus/Makefile +++ b/package/lean/luci-app-ssr-plus/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-ssr-plus PKG_VERSION:=1 -PKG_RELEASE:=126 +PKG_RELEASE:=127 PKG_CONFIG_DEPENDS:= CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray \ diff --git a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua index 5b7dc7fe32..abe8cf90ca 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua +++ b/package/lean/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua @@ -114,7 +114,7 @@ s = m:section(NamedSection, sid, "servers") s.anonymous = true s.addremove = false -o = s:option(DummyValue,"ssr_url","SS/SSR/V2RAY URL") +o = s:option(DummyValue,"ssr_url","SS/SSR/V2RAY/TROJAN URL") o.rawhtml = true o.template = "shadowsocksr/ssrurl" o.value =sid @@ -127,6 +127,9 @@ end if nixio.fs.access("/usr/bin/v2ray/v2ray") then o:value("v2ray", translate("V2Ray")) end +if nixio.fs.access("/usr/sbin/trojan") then +o:value("trojan", translate("Trojan")) +end o.description = translate("Using incorrect encryption mothod may causes service fail to start") o = s:option(Value, "alias", translate("Alias(optional)")) @@ -149,6 +152,7 @@ o.password = true o.rmempty = true o:depends("type", "ssr") o:depends("type", "ss") +o:depends("type", "trojan") o = s:option(ListValue, "encrypt_method", translate("Encrypt Method")) for _, v in ipairs(encrypt_methods) do o:value(v) end @@ -327,18 +331,26 @@ o.rmempty = true o = s:option(Flag, "insecure", translate("allowInsecure")) o.rmempty = true o:depends("type", "v2ray") +o:depends("type", "trojan") -- [[ TLS ]]-- o = s:option(Flag, "tls", translate("TLS")) o.rmempty = true o.default = "0" o:depends("type", "v2ray") +o:depends("type", "trojan") + +o = s:option(Value, "tls_host", translate("TLS Host")) +o:depends("tls", "1") +o.rmempty = true +o:depends("type", "trojan") -- [[ Mux ]]-- o = s:option(Flag, "mux", translate("Mux")) o.rmempty = true o.default = "0" o:depends("type", "v2ray") +o:depends("type", "trojan") o = s:option(Value, "concurrency", translate("Concurrency")) o.datatype = "uinteger" diff --git a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm index 639ef70271..bc7f287172 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm +++ b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm @@ -88,7 +88,7 @@ var s = document.getElementById(urlname + '-status'); if (!s) return false; - var ssrurl = prompt("在这里黏贴配置链接 ssr:// | ss:// | vmess://", ""); + var ssrurl = prompt("在这里黏贴配置链接 ssr:// | ss:// | vmess:// | trojan://", ""); if (ssrurl == null || ssrurl == "") { s.innerHTML = "用户取消"; return false; @@ -97,7 +97,7 @@ //var ssu = ssrurl.match(/ssr:\/\/([A-Za-z0-9_-]+)/i); var ssu = ssrurl.split('://'); console.log(ssu.length); - if ((ssu[0] != "ssr" && ssu[0] != "ss" && ssu[0] != "vmess") || ssu[1] == "") { + if ((ssu[0] != "ssr" && ssu[0] != "ss" && ssu[0] != "vmess" && ssu[0] != "trojan") || ssu[1] == "") { s.innerHTML = "无效格式"; return false; } @@ -170,6 +170,29 @@ s.innerHTML = "导入Shadowsocks配置信息成功"; return false; + } else if (ssu[0] == "trojan") { + var ploc = ssu[1].indexOf("#"); + if (ploc > 0) { + url0 = ssu[1].substr(0, ploc); + param = ssu[1].substr(ploc + 1); + } else { + url0 = ssu[1] + } + var sstr = b64decsafe(url0); + document.getElementById('cbid.shadowsocksr.' + sid + '.type').value = "trojan"; + document.getElementById('cbid.shadowsocksr.' + sid + '.type').dispatchEvent(event); + var team = sstr.split('@'); + console.log(param); + var part1 = team[0].split(':'); + var part2 = team[1].split(':'); + document.getElementById('cbid.shadowsocksr.' + sid + '.server').value = part2[0]; + document.getElementById('cbid.shadowsocksr.' + sid + '.server_port').value = part2[1]; + document.getElementById('cbid.shadowsocksr.' + sid + '.password').value = part1[1]; + if (param != undefined) { + document.getElementById('cbid.shadowsocksr.' + sid + '.alias').value = decodeURI(param); + } + s.innerHTML = "导入Trojan配置信息成功"; + return false; } else if (ssu[0] == "vmess") { var sstr = b64DecodeUnicode(ssu[1]); var ploc = sstr.indexOf("/?"); diff --git a/package/lean/luci-app-ssr-plus/po/zh-cn/ssr-plus.po b/package/lean/luci-app-ssr-plus/po/zh-cn/ssr-plus.po index 2d4c528587..b98c755ec1 100644 --- a/package/lean/luci-app-ssr-plus/po/zh-cn/ssr-plus.po +++ b/package/lean/luci-app-ssr-plus/po/zh-cn/ssr-plus.po @@ -378,7 +378,7 @@ msgid "GFW List" msgstr "GFW列表" msgid "ShadowSocksR Plus+ Settings" -msgstr "ShadowSocksR Plus+ 设置(支持SS/SSR/V2RAY)" +msgstr "ShadowSocksR Plus+ 设置(支持SS/SSR/V2RAY/TROJAN)" msgid "Main Server" msgstr "主服务器" diff --git a/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr index 6e962106af..196728bd1a 100755 --- a/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr +++ b/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr @@ -67,7 +67,7 @@ gen_config_file() { elif [ "$host" != "${host#*:[0-9a-fA-F]}" ] ;then hostip=${host} else - hostip=`nslookup ${host} | grep 'Address 1' | sed 's/Address 1: //g'` + hostip=`ping ${host} -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1` if echo $hostip|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null; then hostip=${hostip} else @@ -125,6 +125,9 @@ EOF elif [ "$stype" == "v2ray" ] ;then lua /usr/share/shadowsocksr/genv2config.lua $GLOBAL_SERVER tcp $(uci_get_by_name $1 local_port) > /var/etc/v2-ssr-retcp.json sed -i 's/\\//g' /var/etc/v2-ssr-retcp.json + elif [ "$stype" == "trojan" ] ;then + lua /usr/share/shadowsocksr/gentrojanconfig.lua $GLOBAL_SERVER $stype $usr_dns $usr_port $local_port > $config_file + sed -i 's/\\//g' $config_file fi } @@ -143,7 +146,7 @@ start_rules() { elif [ "$server" != "${server#*:[0-9a-fA-F]}" ] ;then server=${server} else - server=`nslookup ${server} | grep 'Address 1' | sed 's/Address 1: //g'` + server=`ping ${server} -s 1 -c 1 | grep PING | cut -d'(' -f 2 | cut -d')' -f1` if echo $server|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null; then echo $server >/etc/ssr_ip else @@ -301,6 +304,8 @@ start_redir() { sscmd="/usr/bin/ssr-redir" elif [ "$stype" == "v2ray" ] ;then sscmd="/usr/bin/v2ray/v2ray" + elif [ "$stype" == "trojan" ] ;then + sscmd="/usr/sbin/trojan" fi local utype=$(uci_get_by_name $UDP_RELAY_SERVER type) @@ -310,6 +315,8 @@ start_redir() { ucmd="/usr/bin/ssr-redir" elif [ "$utype" == "v2ray" ] ;then ucmd="/usr/bin/v2ray/v2ray" + elif [ "$utype" == "trojan" ] ;then + ucmd="/usr/sbin/trojan" fi if [ "$(uci_get_by_type global threads 0)" = "0" ] ;then @@ -330,6 +337,9 @@ start_redir() { elif [ "$stype" == "v2ray" ] ;then $sscmd -config /var/etc/v2-ssr-retcp.json >/dev/null 2>&1 & echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd -version | head -1) Started!" >> /tmp/ssrplus.log + elif [ "$stype" == "trojan" ] ;then + $sscmd --config $CONFIG_FILE >> /tmp/ssrplus.log 2>&1 & + echo "$(date "+%Y-%m-%d %H:%M:%S") $($sscmd --version 2>&1 | head -1) Started!" >> /tmp/ssrplus.log fi if [ -n "$UDP_RELAY_SERVER" ] ;then @@ -346,7 +356,10 @@ start_redir() { elif [ "$utype" == "v2ray" ] ; then lua /usr/share/shadowsocksr/genv2config.lua $UDP_RELAY_SERVER udp $(uci_get_by_name $UDP_RELAY_SERVER local_port) > /var/etc/v2-ssr-reudp.json sed -i 's/\\//g' /var/etc/v2-ssr-reudp.json - $ucmd -config /var/etc/v2-ssr-reudp.json >/dev/null 2>&1 & + $ucmd -config /var/etc/v2-ssr-reudp.json >/dev/null 2>&1 & + elif [ "$stype" == "trojan" ] ;then + gen_config_file $UDP_RELAY_SERVER 1 + $ucmd --config $CONFIG_UDP_FILE >> /tmp/ssrplus.log 2>&1 & fi fi @@ -539,6 +552,7 @@ stop() { killall -q -9 ss-redir killall -q -9 ssr-redir killall -q -9 v2ray + killall -q -9 trojan killall -q -9 ssr-server killall -q -9 kcptun-client killall -q -9 ssr-local diff --git a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua new file mode 100644 index 0000000000..bca0cd41e2 --- /dev/null +++ b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua @@ -0,0 +1,43 @@ +local ucursor = require "luci.model.uci".cursor() +local json = require "luci.jsonc" +local server_section = arg[1] +local proto = arg[2] +local usr_dns = arg[3] +local usr_port = arg[4] +local local_port = arg[5] + +local server = ucursor:get_all("shadowsocksr", server_section) + +local trojan = { + -- error = "/var/ssrplus.log", + log_level = 3, + run_type = proto, + local_addr = "0.0.0.0", + local_port = tonumber(local_port), + remote_addr = server.server, + remote_port = tonumber(server.server_port), + target_addr = usr_dns, + target_port = tonumber(usr_port), + udp_timeout = 60, + -- 传入连接 + password = {server.password}, + -- 传出连接 + ssl = (server.tls) and { + verify = (server.insecure == "1") and false or true, + verify_hostname = (server.insecure == "1") and false or true, + cert = "", + ciper = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:RSA-AES128-GCM-SHA256:RSA-AES256-GCM-SHA384:RSA-AES128-SHA:RSA-AES256-SHA:RSA-3DES-EDE-SHA", + sni = server.tls_host, + alpn = {"h2", "http/1.1"}, + curve = "", + reuse_session = true, + session_ticket = false, + }, + tcp = { + no_delay = true, + keep_alive = true, + fast_open = (server.fast_open == "1") and true or false, + fast_open_qlen = 20 + } +} +print(json.stringify(trojan, 1))