From 35da61aec38f73eae2b591675dc78e779dcd37df Mon Sep 17 00:00:00 2001 From: Samuel Huang Date: Sat, 2 Jul 2022 17:18:01 +1000 Subject: [PATCH] Add --ltpg --ltpw --mtpw --ttpw support --- Dockerfile.amd64 | 4 ++++ Dockerfile.arm | 4 ++++ Dockerfile.arm64 | 4 ++++ README.md | 44 ++++++++++++++++++++---------------- proxy-ltpg.sh | 56 +++++++++++++++++++++++++++++++++++++++++++++ proxy-ltpw.sh | 56 +++++++++++++++++++++++++++++++++++++++++++++ proxy-mtpw.sh | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ proxy-ttpw.sh | 58 +++++++++++++++++++++++++++++++++++++++++++++++ run.sh | 54 ++++++++++++++++++++++++-------------------- 9 files changed, 294 insertions(+), 45 deletions(-) create mode 100755 proxy-ltpg.sh create mode 100755 proxy-ltpw.sh create mode 100755 proxy-mtpw.sh create mode 100755 proxy-ttpw.sh diff --git a/Dockerfile.amd64 b/Dockerfile.amd64 index a39eae1..90cb73b 100644 --- a/Dockerfile.amd64 +++ b/Dockerfile.amd64 @@ -40,11 +40,15 @@ RUN sed -i "s/^socks4.*/socks5\t127.0.0.1 1080/g" /etc/proxychains/proxychains.c ADD proxy-ltx.sh /proxy-ltx.sh ADD proxy-ltt.sh /proxy-ltt.sh +ADD proxy-ltpw.sh /proxy-ltpw.sh ADD proxy-lttw.sh /proxy-lttw.sh +ADD proxy-ltpg.sh /proxy-ltpg.sh ADD proxy-lttg.sh /proxy-lttg.sh ADD proxy-mtt.sh /proxy-mtt.sh +ADD proxy-mtpw.sh /proxy-mtpw.sh ADD proxy-mttw.sh /proxy-mttw.sh ADD proxy-ttt.sh /proxy-ttt.sh +ADD proxy-ttpw.sh /proxy-ttpw.sh ADD proxy-tttw.sh /proxy-tttw.sh ADD status.sh /status.sh ADD run.sh /run.sh diff --git a/Dockerfile.arm b/Dockerfile.arm index ffc7805..cf973f2 100644 --- a/Dockerfile.arm +++ b/Dockerfile.arm @@ -40,11 +40,15 @@ RUN sed -i "s/^socks4.*/socks5\t127.0.0.1 1080/g" /etc/proxychains/proxychains.c ADD proxy-ltx.sh /proxy-ltx.sh ADD proxy-ltt.sh /proxy-ltt.sh +ADD proxy-ltpw.sh /proxy-ltpw.sh ADD proxy-lttw.sh /proxy-lttw.sh +ADD proxy-ltpg.sh /proxy-ltpg.sh ADD proxy-lttg.sh /proxy-lttg.sh ADD proxy-mtt.sh /proxy-mtt.sh +ADD proxy-mtpw.sh /proxy-mtpw.sh ADD proxy-mttw.sh /proxy-mttw.sh ADD proxy-ttt.sh /proxy-ttt.sh +ADD proxy-ttpw.sh /proxy-ttpw.sh ADD proxy-tttw.sh /proxy-tttw.sh ADD status.sh /status.sh ADD run.sh /run.sh diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 index 2fe56fa..bafec5a 100644 --- a/Dockerfile.arm64 +++ b/Dockerfile.arm64 @@ -40,11 +40,15 @@ RUN sed -i "s/^socks4.*/socks5\t127.0.0.1 1080/g" /etc/proxychains/proxychains.c ADD proxy-ltx.sh /proxy-ltx.sh ADD proxy-ltt.sh /proxy-ltt.sh +ADD proxy-ltpw.sh /proxy-ltpw.sh ADD proxy-lttw.sh /proxy-lttw.sh +ADD proxy-ltpg.sh /proxy-ltpg.sh ADD proxy-lttg.sh /proxy-lttg.sh ADD proxy-mtt.sh /proxy-mtt.sh +ADD proxy-mtpw.sh /proxy-mtpw.sh ADD proxy-mttw.sh /proxy-mttw.sh ADD proxy-ttt.sh /proxy-ttt.sh +ADD proxy-ttpw.sh /proxy-ttpw.sh ADD proxy-tttw.sh /proxy-tttw.sh ADD status.sh /status.sh ADD run.sh /run.sh diff --git a/README.md b/README.md index 019665c..7599098 100644 --- a/README.md +++ b/README.md @@ -75,26 +75,30 @@ Xray-URL: vless://myid@mydomain.duckdns.org:443?security=xtls&type=tcp&flow=xtls ```shell $ docker run --rm samuelhbne/proxy-xray proxy-xray - --ltx id@host:port[,s=sniname.org] - --ltt id@host:port[,s=sniname.org] - --lttw id@host:port:/webpath[,s=sniname.org] - --lttg id@host:port:svcname[,s=sniname.org] - --mtt id@host:port[,s=sniname.org] - --mttw id@host:port:/webpath[,s=sniname.org] - --ttt password@host:port[,s=sniname.org] - --tttw password@host:port:/webpath[,s=sniname.org] - -d|--debug [Optional] Start in debug mode with verbose output - -i|--stdin [Optional] Read config from stdin instead of auto generation - --dns [Optional] Designated upstream DNS server IP, 1.1.1.1 will be applied by default - --dns-local-cn [Optional] Enable China-accessible domains to be resolved in China - --domain-direct [Optional] Add a domain rule for direct routing, likegeosite:geosite:geolocation-cn - --domain-proxy [Optional] Add a domain rule for proxy routing, like twitter.com or geosite:google-cn - --domain-block [Optional] Add a domain rule for block routing, like geosite:category-ads-all - --ip-direct [Optional] Add a ip-addr rule for direct routing, like 114.114.114.114/32 or geoip:cn - --ip-proxy [Optional] Add a ip-addr rule for proxy routing, like 1.1.1.1/32 or geoip:netflix - --ip-block [Optional] Add a ip-addr rule for block routing, like geoip:private - --cn-direct [Optional] Add routing rules to avoid domains and IPs located in China being proxied - --rules-path [Optional] Folder path contents geoip.dat, geosite.dat and other rule files + --ltx id@host:port[,s=sniname.org] + --ltt id@host:port[,s=sniname.org] + --ltpw id@host:port:/webpath + --lttw id@host:port:/webpath[,s=sniname.org] + --ltpg id@host:port:svcname + --lttg id@host:port:svcname[,s=sniname.org] + --mtt id@host:port[,s=sniname.org] + --mtpw id@host:port:/webpath + --mttw id@host:port:/webpath[,s=sniname.org] + --ttt password@host:port[,s=sniname.org] + --ttpw password@host:port:/webpath + --tttw password@host:port:/webpath[,s=sniname.org] + -d|--debug [Optional] Start in debug mode with verbose output + -i|--stdin [Optional] Read config from stdin instead of auto generation + --dns [Optional] Designated upstream DNS server IP, 1.1.1.1 will be applied by default + --dns-local-cn [Optional] Enable China-accessible domains to be resolved in China + --domain-direct [Optional] Add a domain rule for direct routing, likegeosite:geosite:geolocation-cn + --domain-proxy [Optional] Add a domain rule for proxy routing, like twitter.com or geosite:google-cn + --domain-block [Optional] Add a domain rule for block routing, like geosite:category-ads-all + --ip-direct [Optional] Add a ip-addr rule for direct routing, like 114.114.114.114/32 or geoip:cn + --ip-proxy [Optional] Add a ip-addr rule for proxy routing, like 1.1.1.1/32 or geoip:netflix + --ip-block [Optional] Add a ip-addr rule for block routing, like geoip:private + --cn-direct [Optional] Add routing rules to avoid domains and IPs located in China being proxied + --rules-path [Optional] Folder path contents geoip.dat, geosite.dat and other rule files ``` ## How to stop and remove the running container diff --git a/proxy-ltpg.sh b/proxy-ltpg.sh new file mode 100755 index 0000000..7c2efff --- /dev/null +++ b/proxy-ltpg.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +usage() { + >&2 echo "Usage: proxy-ltpg " +} + +if [ -z "$1" ]; then + >&2 echo "Missing options" + usage + exit 1 +fi + +# id@domain.com:80:/svcpath +options=(`echo $1 |tr '@' ' '`) +id="${options[0]}" +options=(`echo ${options[1]} |tr ':' ' '`) +host="${options[0]}" +port="${options[1]}" +path="${options[2]}" + +if [ -z "${id}" ]; then + >&2 echo "Error: uuid undefined." + usage + exit 1 +fi + +if [ -z "${host}" ]; then + >&2 echo "Error: destination host undefined." + usage + exit 1 +fi + +if [ -z "${port}" ]; then + port=80 +fi + +if ! [ "${port}" -eq "${port}" ] 2>/dev/null; then >&2 echo "Port number must be numeric"; exit 1; fi + +Jusers=`echo '{}' |jq --arg uuid "${id}" '. += {"id":$uuid, "encryption":"none", "level":0}'` + +Jvnext=`echo '{}' | jq --arg host "${host}" --arg port "${port}" --argjson juser "${Jusers}" \ +'. += {"address":$host, "port":($port | tonumber), "users":[$juser]}' ` + +JstreamSettings=`echo '{}' | jq --arg serverName "${serverName}" --arg fingerprint "${fingerprint}" --arg path "${path}" \ +'. += {"network":"grpc", "security":"none", "grpcSettings":{"serviceName":$path}}' ` + +Jproxy=`echo '{}' | jq --arg host "${host}" --argjson jvnext "${Jvnext}" --argjson jstreamSettings "${JstreamSettings}" \ +'. += { "tag": "proxy", "protocol":"vless", "settings":{"vnext":[$jvnext]}, "streamSettings":$jstreamSettings }' ` +Jdirect='{"tag": "direct", "protocol": "freedom", "settings": {}}' +Jblocked='{"tag": "blocked", "protocol": "blackhole", "settings": {}}' + +jroot=`echo '{}' | jq --argjson jproxy "${Jproxy}" --argjson jdirect "${Jdirect}" --argjson jblocked "${Jblocked}" \ +'. += {"log":{"loglevel":"warning"}, "outbounds":[$jproxy, $jdirect, $jblocked]}' ` + +echo "$jroot" +exit 0 diff --git a/proxy-ltpw.sh b/proxy-ltpw.sh new file mode 100755 index 0000000..cbc4c20 --- /dev/null +++ b/proxy-ltpw.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +usage() { + >&2 echo "Usage: proxy-ltpw " +} + +if [ -z "$1" ]; then + >&2 echo "Missing options" + usage + exit 1 +fi + +# id@domain.com:443:/websocket +options=(`echo $1 |tr '@' ' '`) +id="${options[0]}" +options=(`echo ${options[1]} |tr ':' ' '`) +host="${options[0]}" +port="${options[1]}" +path="${options[2]}" + +if [ -z "${id}" ]; then + >&2 echo "Error: uuid undefined." + usage + exit 1 +fi + +if [ -z "${host}" ]; then + >&2 echo "Error: destination host undefined." + usage + exit 1 +fi + +if [ -z "${port}" ]; then + port=80 +fi + +if ! [ "${port}" -eq "${port}" ] 2>/dev/null; then >&2 echo "Port number must be numeric"; exit 1; fi + +Jusers=`echo '{}' |jq --arg uuid "${id}" '. += {"id":$uuid, "encryption":"none", "level":0}'` + +Jvnext=`echo '{}' | jq --arg host "${host}" --arg port "${port}" --argjson juser "${Jusers}" \ +'. += {"address":$host, "port":($port | tonumber), "users":[$juser]}' ` + +JstreamSettings=`echo '{}' | jq --arg serverName "${serverName}" --arg fingerprint "${fingerprint}" --arg path "${path}" \ +'. += {"network":"ws", "security":"none", "wsSettings":{"path":$path}}' ` + +Jproxy=`echo '{}' | jq --arg host "${host}" --argjson jvnext "${Jvnext}" --argjson jstreamSettings "${JstreamSettings}" \ +'. += { "tag": "proxy", "protocol":"vless", "settings":{"vnext":[$jvnext]}, "streamSettings":$jstreamSettings }' ` +Jdirect='{"tag": "direct", "protocol": "freedom", "settings": {}}' +Jblocked='{"tag": "blocked", "protocol": "blackhole", "settings": {}}' + +jroot=`echo '{}' | jq --argjson jproxy "${Jproxy}" --argjson jdirect "${Jdirect}" --argjson jblocked "${Jblocked}" \ +'. += {"log":{"loglevel":"warning"}, "outbounds":[$jproxy, $jdirect, $jblocked]}' ` + +echo "$jroot" +exit 0 diff --git a/proxy-mtpw.sh b/proxy-mtpw.sh new file mode 100755 index 0000000..1d94c7a --- /dev/null +++ b/proxy-mtpw.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +usage() { + >&2 echo "Usage: proxy-mtpw " +} + +if [ -z "$1" ]; then + >&2 echo "Missing options" + usage + exit 1 +fi + +# id@domain.com:443:/websocket +options=(`echo $1 |tr '@' ' '`) +id="${options[0]}" +options=(`echo ${options[1]} |tr ':' ' '`) +host="${options[0]}" +port="${options[1]}" +path="${options[2]}" + +if [ -z "${serverName}" ]; then serverName=${host}; fi +if [ -z "${fingerprint}" ]; then fingerprint="safari"; fi + +if [ -z "${id}" ]; then + >&2 echo "Error: uuid undefined." + usage + exit 1 +fi + +if [ -z "${host}" ]; then + >&2 echo "Error: destination host undefined." + usage + exit 1 +fi + +if [ -z "${port}" ]; then + port=443 +fi + +if ! [ "${port}" -eq "${port}" ] 2>/dev/null; then >&2 echo "Port number must be numeric"; exit 1; fi + +Jusers=`echo '{}' |jq --arg uuid "${id}" '. += {"id":$uuid, "encryption":"none", "level":0}'` + +Jvnext=`echo '{}' | jq --arg host "${host}" --arg port "${port}" --argjson juser "${Jusers}" \ +'. += {"address":$host, "port":($port | tonumber), "users":[$juser]}' ` + +JstreamSettings=`echo '{}' | jq --arg serverName "${serverName}" --arg fingerprint "${fingerprint}" --arg path "${path}" \ +'. += {"network":"ws", "security":"none", "wsSettings":{"path":$path}}' ` + +Jproxy=`echo '{}' | jq --arg host "${host}" --argjson jvnext "${Jvnext}" --argjson jstreamSettings "${JstreamSettings}" \ +'. += { "tag": "proxy", "protocol":"vmess", "settings":{"vnext":[$jvnext]}, "streamSettings":$jstreamSettings }' ` +Jdirect='{"tag": "direct", "protocol": "freedom", "settings": {}}' +Jblocked='{"tag": "blocked", "protocol": "blackhole", "settings": {}}' + +jroot=`echo '{}' | jq --argjson jproxy "${Jproxy}" --argjson jdirect "${Jdirect}" --argjson jblocked "${Jblocked}" \ +'. += {"log":{"loglevel":"warning"}, "outbounds":[$jproxy, $jdirect, $jblocked]}' ` + +echo "$jroot" +exit 0 diff --git a/proxy-ttpw.sh b/proxy-ttpw.sh new file mode 100755 index 0000000..d9a00cd --- /dev/null +++ b/proxy-ttpw.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +usage() { + >&2 echo "Usage: proxy-ttpw " +} + +if [ -z "$1" ]; then + >&2 echo "Missing options" + usage + exit 1 +fi + +# password@domain.com:443:/websocket +options=(`echo $1 |tr '@' ' '`) +id="${options[0]}" +options=(`echo ${options[1]} |tr ':' ' '`) +host="${options[0]}" +port="${options[1]}" +path="${options[2]}" +passwd="${id}" + +if [ -z "${serverName}" ]; then serverName=${host}; fi +if [ -z "${fingerprint}" ]; then fingerprint="safari"; fi + +if [ -z "${passwd}" ]; then + >&2 echo "Error: password undefined." + usage + exit 1 +fi + +if [ -z "${host}" ]; then + >&2 echo "Error: destination host undefined." + usage + exit 1 +fi + +if [ -z "${port}" ]; then + port=443 +fi + +if ! [ "${port}" -eq "${port}" ] 2>/dev/null; then >&2 echo "Port number must be numeric"; exit 1; fi + +Jservers=`echo '{}' | jq --arg host "${host}" --arg port "${port}" --arg passwd "${passwd}" \ +'. += {"address":$host, "port":($port | tonumber), "password":$passwd}' ` + +JstreamSettings=`echo '{}' | jq --arg serverName "${serverName}" --arg fingerprint "${fingerprint}" --arg path "${path}" \ +'. += {"network":"ws", "security":"none", "wsSettings":{"path":$path}}' ` + +Jproxy=`echo '{}' | jq --arg host "${host}" --argjson jservers "${Jservers}" --argjson jstreamSettings "${JstreamSettings}" \ +'. += { "tag": "proxy", "protocol":"trojan", "settings":{"servers":[$jservers]}, "streamSettings":$jstreamSettings }' ` +Jdirect='{"tag": "direct", "protocol": "freedom", "settings": {}}' +Jblocked='{"tag": "blocked", "protocol": "blackhole", "settings": {}}' + +jroot=`echo '{}' | jq --argjson jproxy "${Jproxy}" --argjson jdirect "${Jdirect}" --argjson jblocked "${Jblocked}" \ +'. += {"log":{"loglevel":"warning"}, "outbounds":[$jproxy, $jdirect, $jblocked]}' ` + +echo "$jroot" +exit 0 diff --git a/run.sh b/run.sh index 09f4b02..0b11dd2 100755 --- a/run.sh +++ b/run.sh @@ -6,40 +6,44 @@ XCONF=/tmp/proxy-xray.json usage() { echo "proxy-xray " - echo " --ltx id@host:port[,s=sniname.org]" - echo " --ltt id@host:port[,s=sniname.org]" - echo " --lttw id@host:port:/webpath[,s=sniname.org]" - echo " --lttg id@host:port:svcname[,s=sniname.org]" - echo " --mtt id@host:port[,s=sniname.org]" - echo " --mttw id@host:port:/webpath[,s=sniname.org]" - echo " --ttt password@host:port[,s=sniname.org]" - echo " --tttw password@host:port:/webpath[,s=sniname.org]" -# echo " --ssa password:method@host:port" -# echo " --sst password:method@host:port" - echo " -d|--debug [Optional] Start in debug mode with verbose output" - echo " -i|--stdin [Optional] Read config from stdin instead of auto generation" - echo " --dns [Optional] Designated upstream DNS server IP, 1.1.1.1 will be applied by default" -# echo " --dns-local [Optional] Enable designated domain conf file. Like apple.china.conf" - echo " --dns-local-cn [Optional] Enable China-accessible domains to be resolved in China" - echo " --domain-direct [Optional] Add a domain rule for direct routing, likegeosite:geosite:geolocation-cn" - echo " --domain-proxy [Optional] Add a domain rule for proxy routing, like twitter.com or geosite:google-cn" - echo " --domain-block [Optional] Add a domain rule for block routing, like geosite:category-ads-all" - echo " --ip-direct [Optional] Add a ip-addr rule for direct routing, like 114.114.114.114/32 or geoip:cn" - echo " --ip-proxy [Optional] Add a ip-addr rule for proxy routing, like 1.1.1.1/32 or geoip:netflix" - echo " --ip-block [Optional] Add a ip-addr rule for block routing, like geoip:private" - echo " --cn-direct [Optional] Add routing rules to avoid domains and IPs located in China being proxied" - echo " --rules-path [Optional] Folder path contents geoip.dat, geosite.dat and other rule files" + echo " --ltx id@host:port[,s=sniname.org]" + echo " --ltt id@host:port[,s=sniname.org]" + echo " --ltpw id@host:port:/webpath" + echo " --lttw id@host:port:/webpath[,s=sniname.org]" + echo " --ltpg id@host:port:svcname" + echo " --lttg id@host:port:svcname[,s=sniname.org]" + echo " --mtt id@host:port[,s=sniname.org]" + echo " --mtpw id@host:port:/webpath" + echo " --mttw id@host:port:/webpath[,s=sniname.org]" + echo " --ttt password@host:port[,s=sniname.org]" + echo " --ttpw password@host:port:/webpath" + echo " --tttw password@host:port:/webpath[,s=sniname.org]" +# echo " --ssa password:method@host:port" +# echo " --sst password:method@host:port" + echo " -d|--debug [Optional] Start in debug mode with verbose output" + echo " -i|--stdin [Optional] Read config from stdin instead of auto generation" + echo " --dns [Optional] Designated upstream DNS server IP, 1.1.1.1 will be applied by default" +# echo " --dns-local [Optional] Enable designated domain conf file. Like apple.china.conf" + echo " --dns-local-cn [Optional] Enable China-accessible domains to be resolved in China" + echo " --domain-direct [Optional] Add a domain rule for direct routing, likegeosite:geosite:geolocation-cn" + echo " --domain-proxy [Optional] Add a domain rule for proxy routing, like twitter.com or geosite:google-cn" + echo " --domain-block [Optional] Add a domain rule for block routing, like geosite:category-ads-all" + echo " --ip-direct [Optional] Add a ip-addr rule for direct routing, like 114.114.114.114/32 or geoip:cn" + echo " --ip-proxy [Optional] Add a ip-addr rule for proxy routing, like 1.1.1.1/32 or geoip:netflix" + echo " --ip-block [Optional] Add a ip-addr rule for block routing, like geoip:private" + echo " --cn-direct [Optional] Add routing rules to avoid domains and IPs located in China being proxied" + echo " --rules-path [Optional] Folder path contents geoip.dat, geosite.dat and other rule files" } Jrules='{"rules":[]}' -TEMP=`getopt -o di --long ltx:,ltt:,lttw:,lttg:,mtt:,mttw:,ttt:,tttw:,ssa:,sst:,stdin,debug,dns:,dns-local:,dns-local-cn,domain-direct:,domain-proxy:,domain-block:,ip-direct:,ip-proxy:,ip-block:,cn-direct,rules-path: -n "$0" -- $@` +TEMP=`getopt -o di --long ltx:,ltt:,ltpw:,lttw:,ltpg:,lttg:,mtt:,mtpw:,mttw:,ttt:,ttpw:,tttw:,ssa:,sst:,stdin,debug,dns:,dns-local:,dns-local-cn,domain-direct:,domain-proxy:,domain-block:,ip-direct:,ip-proxy:,ip-block:,cn-direct,rules-path: -n "$0" -- $@` if [ $? != 0 ] ; then usage; exit 1 ; fi eval set -- "$TEMP" while true ; do case "$1" in - --ltx|--ltt|--lttw|--lttg|--mtt|--mttw|--ttt|--tttw|--ssa|--sst) + --ltx|--ltt|--ltpw|--lttw|--ltpg|--lttg|--mtt|--mtpw|--mttw|--ttt|--ttpw|--tttw|--ssa|--sst) subcmd=`echo "$1"|tr -d "\-\-"` $DIR/proxy-${subcmd}.sh $2 >$XCONF if [ $? != 0 ]; then