OpenClash: add trojan support

This commit is contained in:
CN_SZTL 2020-03-20 04:57:20 +08:00
parent 98e24f1af9
commit 90e84673e0
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
5 changed files with 110 additions and 7 deletions

View File

@ -169,6 +169,19 @@ Proxy: # 节点设置此部分与proxy-provider两者不能同时删除
# mode: http # or tls
# host: bing.com
# trojan
- name: "trojan"
type: trojan
server: server
port: 443
password: yourpsk
# udp: true
# sni: example.com # aka server name
# alpn:
# - h2
# - http/1.1
# skip-cert-verify: true
# Openclash 不会对下方策略组设置进行任何更改,请确保设置正确
Proxy Group: # 此参数必须保留,不能删除

View File

@ -80,6 +80,7 @@ end
o = s:option(ListValue, "type", translate("Server Node Type"))
o:value("ss", translate("Shadowsocks"))
o:value("vmess", translate("Vmess"))
o:value("trojan", translate("trojan"))
o:value("snell", translate("Snell"))
o:value("socks5", translate("Socks5"))
o:value("http", translate("HTTP(S)"))
@ -100,6 +101,7 @@ o = s:option(Value, "password", translate("Password"))
o.password = true
o.rmempty = false
o:depends("type", "ss")
o:depends("type", "trojan")
o = s:option(Value, "psk", translate("Psk"))
o.rmempty = false
@ -121,6 +123,9 @@ o.default = "false"
o:value("true")
o:value("false")
o:depends("type", "ss")
o:depends("type", "vmess")
o:depends("type", "socks5")
o:depends("type", "trojan")
o = s:option(ListValue, "obfs", translate("obfs-mode"))
o.rmempty = true
@ -201,6 +206,20 @@ o:value("true")
o:value("false")
o:depends("obfs", "websocket")
-- [[ sni ]]--
o = s:option(Value, "sni", translate("sni"))
o.datatype = "host"
o.placeholder = translate("example.com")
o.rmempty = true
o:depends("type", "trojan")
-- [[ alpn ]]--
o = s:option(DynamicList, "alpn", translate("alpn"))
o.rmempty = true
o:value("h2")
o:value("http/1.1")
o:depends("type", "trojan")
-- [[ skip-cert-verify ]]--
o = s:option(ListValue, "skip_cert_verify", translate("Skip-Cert-Verify"))
o.rmempty = true
@ -212,6 +231,7 @@ o:depends("obfs_vmess", "none")
o:depends("obfs_vmess", "websocket")
o:depends("type", "socks5")
o:depends("type", "http")
o:depends("type", "trojan")
-- [[ TLS ]]--
o = s:option(ListValue, "tls", translate("TLS"))

View File

@ -66,8 +66,8 @@ servers_if_update=$(uci get openclash.config.servers_if_update 2>/dev/null)
new_servers_group=$(uci get openclash.config.new_servers_group 2>/dev/null)
#proxy
line=$(sed -n '/^ \{0,\}-/=' $server_file 2>/dev/null)
num=$(grep -c "^ \{0,\}-" $server_file 2>/dev/null)
line=$(sed -n '/^ \{0,\}- name:/=' $server_file 2>/dev/null)
num=$(grep -c "^ \{0,\}- name:" $server_file 2>/dev/null)
count=1
#provider
@ -83,6 +83,11 @@ cfg_get()
echo "$(grep "$1" "$2" 2>/dev/null |awk -v tag=$1 'BEGIN{FS=tag} {print $2}' 2>/dev/null |sed 's/,.*//' 2>/dev/null |sed 's/\}.*//' 2>/dev/null |sed 's/^ \{0,\}//g' 2>/dev/null |sed 's/ \{0,\}$//g' 2>/dev/null)"
}
cfg_get_alpn()
{
echo "$(grep "$1" "$2" 2>/dev/null |grep -v "^ \{0,\}- name:" |awk -v tag=$1 'BEGIN{FS=tag} {print $2}' 2>/dev/null |sed 's/,.*//' 2>/dev/null |sed 's/\}.*//' 2>/dev/null |sed 's/^ \{0,\}//g' 2>/dev/null |sed 's/ \{0,\}$//g' 2>/dev/null)"
}
echo "开始更新【$CONFIG_NAME】的代理集配置..." >$START_LOG
[ "$servers_update" -eq "1" ] && {
@ -474,10 +479,14 @@ do
uuid="$(cfg_get "uuid:" "$single_server")"
#alterId:
alterId="$(cfg_get "alterId:" "$single_server")"
#network
#network:
network="$(cfg_get "network:" "$single_server")"
#username
#username:
username="$(cfg_get "username:" "$single_server")"
#sni:
sni="$(cfg_get "sni:" "$single_server")"
#alpn:
alpns="$(cfg_get_alpn "-" "$single_server")"
echo "正在读取【$CONFIG_NAME】-【$server_type】-【$server_name】服务器节点配置..." >$START_LOG
@ -525,6 +534,14 @@ do
else
${uci_set}password="$password"
fi
if [ "$server_type" = "trojan" ]; then
#trojan
${uci_set}sni="$sni"
for alpn in $alpns; do
${uci_add}alpn="$alpn" >/dev/null 2>&1
done
fi
else
#添加新节点
name=openclash
@ -584,6 +601,14 @@ do
else
${uci_set}password="$password"
fi
if [ "$server_type" = "trojan" ]; then
#trojan
${uci_set}sni="$sni"
for alpn in $alpns; do
${uci_add}alpn="$alpn" >/dev/null 2>&1
done
fi
#加入策略组
if [ "$servers_if_update" = "1" ] && [ ! -z "$new_servers_group" ] && [ ! -z "$(grep "config groups" "$CFG_FILE")" ]; then

View File

@ -97,6 +97,16 @@ EOF
}
set_alpn()
{
if [ -z "$1" ]; then
return
fi
cat >> "$SERVER_FILE" <<-EOF
- "$1"
EOF
}
#写入服务器节点到配置文件
yml_servers_set()
{
@ -126,6 +136,8 @@ yml_servers_set()
config_get "auth_pass" "$section" "auth_pass" ""
config_get "psk" "$section" "psk" ""
config_get "obfs_snell" "$section" "obfs_snell" ""
config_get "sni" "$section" "sni" ""
config_get "alpn" "$section" "alpn" ""
if [ ! -z "$if_game_proxy" ] && [ "$if_game_proxy" != "$name" ] && [ "$if_game_proxy_type" = "proxy" ]; then
return
@ -155,8 +167,10 @@ yml_servers_set()
return
fi
if [ -z "$password" ] && [ "$type" = "ss" ]; then
return
if [ -z "$password" ]; then
if [ "$type" = "ss" ] || [ "$type" = "trojan" ]; then
return
fi
fi
echo "正在写入【$type】-【$name】节点到配置文件【$CONFIG_NAME】..." >$START_LOG
@ -271,6 +285,37 @@ EOF
echo "- { name: \"$name\", type: $type, server: $server, port: $port, username: $auth_name, password: $auth_pass$skip_cert_verify$tls }" >>$SERVER_FILE
fi
if [ "$type" = "trojan" ]; then
cat >> "$SERVER_FILE" <<-EOF
- name: "$name"
type: $type
server: $server
port: $port
password: "$password"
EOF
if [ ! -z "$udp" ]; then
cat >> "$SERVER_FILE" <<-EOF
udp: $udp
EOF
fi
if [ ! -z "$sni" ]; then
cat >> "$SERVER_FILE" <<-EOF
sni: $sni
EOF
fi
if [ ! -z "$alpn" ]; then
cat >> "$SERVER_FILE" <<-EOF
alpn:
EOF
config_list_foreach "$section" "alpn" set_alpn
fi
if [ ! -z "$skip_cert_verify" ]; then
cat >> "$SERVER_FILE" <<-EOF
$skip_cert_verify
EOF
fi
fi
if [ "$type" = "snell" ]; then
cat >> "$SERVER_FILE" <<-EOF
- name: "$name"

View File

@ -6,7 +6,7 @@ msgid "OpenClash"
msgstr "OpenClash"
msgid "A Clash Client For OpenWrt"
msgstr "一个运行在OpenWrt上的Clash客户端兼容Shadowsocks、Vmess、Snell等协议根据灵活的规则配置实现策略代理"
msgstr "一个运行在OpenWrt上的Clash客户端兼容Shadowsocks、Vmess、trojan、Snell等协议根据灵活的规则配置实现策略代理"
msgid "Global Settings(Will Modify The Config File Or Subscribe According To The Settings On This Page)"
msgstr "全局设置(将按照本页设置自动修改配置文件和获取订阅)"