Giter Site home page Giter Site logo

shuttle's Introduction

Shuttle

Shuttle is a cross-platform network proxy tool based on Go. Feel free to join our Slack or Telegram. (logo created by @不二

Shuttle

(Translated by wao1201, reviewed by Joe Hill.)

Introduction

Shuttle is a cross-platform network proxy tool based on Go.

  • SOCKS5SOCKS5 over TLSshadowsocks protocols supported.
  • Proxying via rules: domain, IP CIDR and GEO-IP.
  • Customized policy: direct, reject and proxy.
  • Multiple proxy servers selection and grouping management. The policy of servers selection can be RTT(Round-trip time) or manual select.
  • HTTP/HTTPS traffic capture, reverse proxy, request head modification, response head modification and fake return value supported.
  • DNS parsing types: static, direct, remote.

Module Structure:

shuttle_architecture

Screenshots:

Introduction

Features

  • Proxy type
    • TCP(HTTP/HTTPS)
    • UDP
  • HTTP/HTTPS request extension
    • Traffic capture (MITM supported)
    • URL rewrite
    • Request/response modification
    • Request mapping
  • Remote servers management
    • Server grouping
    • Protocols supported
      • shadowsocks
      • SOCKS5
      • SOCKS5 over TLS
    • Grouping server selection policy
      • RTT
      • Manual select
  • Outbound Mode
    • Global, direct and reject
    • Rules
      • DOMAIN: full name match
      • DOMAIN-SUFFIX: suffix match
      • DOMAIN-KEYWORD: keyword match
      • IP-CIDR: IP range match
      • GEO-IP: GEO-IP route supported
  • DNS parsing type
    • static:static address mapping
    • direct:local DNS resolve
    • remote:remote server DNS resolve (prevent DNS Cache Poisoning)
  • External module
    • API ( see API document for details)
    • Web UI
      • Web UI (angular6 + ant design)

Installation & Launch

macOS

Preparation

Download the zip file from release and unzip it. The Folder structure is shown below.

shuttle
   ├── RespFiles/ #mock file directory
   ├── shuttle  #shuttle main executable
   ├── shuttle.yaml #config file
   └── start.sh #launch script

Open the config file, shuttle.yaml. Make sure all the ports are all configured correctly before launching. The default ports in config file are 8080, 8081 and 8082.

General:
  http-port: "8080"  #http/https port
  socks-port: "8081" #socks port
  controller-port: "8082" #dashboard port

Launch

Go to the shuttle directory and enter the command below in terminal/CMD to launch the app.

./start.sh #no output

Open your browser and visit http://localhost:8082 (For example, use the default settings controller-port: "8082"). The application has already run successfully if you can visit the dashboard on your browser. Otherwise check the shuttle.log for more details and new issues anytime.

System Configuration

If you can visit http://c.sipt.top on your browser, you can skip the following steps directly.

Open System Preference => Network => Advanced => Proxy,there are 3 main options:

  • Web Proxy(HTTP) set to 127.0.0.1:8080 (for example, http-port: "8080")
  • Web Proxy(HTTPS) set to 127.0.0.1:8080(for example, http-port: "8080"
  • SOCKS Proxy set to 127.0.0.1:8080(for example, socks-port: "8081"

Press OK and click Apply. The proxy settings are working if you can see the dashboard by visiting http://c.sipt.top on browser.

Enter the following commands to make Terminal.app go through proxies:

export https_proxy="http://127.0.0.1:8080"
export http_proxy="http://127.0.0.1:8080"
export all_proxy="socks5://127.0.0.1:8081"

Windows

Preparation

Download the zip file from release and unzip it. The Folder structure is shown below.

shuttle
   ├── RespFiles/ #mock file directory
   ├── shuttle  #shuttle main executable
   ├── shuttle.yaml #config file
   └── startup.bat #launch script

Open the config file, shuttle.yaml. Make sure all the ports are all configured correctly before launching. The default ports in config file are 8080, 8081 and 8082.

General:
  http-port: "8080"  #http/https port
  socks-port: "8081" #socks port
  controller-port: "8082" #dashboard port

Launch

Double-click startup.bat, there will be no output on screen. Open your browser and visit http://localhost:8082 (For example, use the default settings controller-port: "8082"). The application has already run successfully if you can visit the dashboard on your browser. Otherwise check the shuttle.log for more details and new issues anytime.

System Configuration

If you could open http://c.sipt.top in your browser, you can skip the following steps directly.

Open System Preference => Network => Proxy, set to 127.0.0.1:8080(for example: http-port: "8080"). The proxy settings are working if you can see the dashboard by visiting http://c.sipt.top on browser.

Linux

Preparation

Download the zip file from release and unzip it. The Folder structure is shown below.

shuttle
   ├── RespFiles/ #mock file directory
   ├── shuttle  #shuttle main executable
   ├── shuttle.yaml #config file
   └── start.sh #launch script

Open the config file, shuttle.yaml. Make sure all the ports are all configured correctly before launching. The default ports in config file are 8080, 8081 and 8082.

General:
  http-port: "8080"  #http/https port
  socks-port: "8081" #socks port
  controller-port: "8082" #dashboard port

Launch

Go to the shuttle directory and enter the command below in terminal/CMD to launch the app.

./start.sh #no output

Open your browser and visit http://localhost:8082 (For example, use the default settings controller-port: "8082"). The application has already run successfully if you can visit the dashboard on your browser. Otherwise check the shuttle.log for more details and new issues anytime.

Configuration

Version

ver: v1.0.1

Current config file only supports v1.0.1. Don't edit yourself.

General Settings

General:
  loglevel: "info"
  dns-server:
  - "114.114.114.114"
  - "223.5.5.5"
  http-port: "8080"
  http-interface: "0.0.0.0"
  socks-port: "8081"
  socks-interface: "0.0.0.0"
  controller-port: "8082"
  controller-interface: "0.0.0.0"
Name Description Value
loglevel Log output level, better use level: info or error trace,debug,info,error
dns-server DNS server address IP address
http-port HTTP/HTTPS port
http-interface HTTP/HTTPS port
socks-port SOCKS port
socks-interface SOCKS control
controller-port dashboard port
controller-interface dashboard control

Proxy Settings

Server name and server group name should not be repeating. DIRECT, REJECT and GLOBAL are reserved name.

Server

Proxy:
  "🇯🇵JP_a": ["ss", "jp.a.example.com", "12345", "rc4-md5", "123456"]
  "🇯🇵JP_b": ["ss", "jp.b.example.com", "12345", "rc4-md5", "123456"]
  "🇯🇵JP_c": ["ss", "jp.c.example.com", "12345", "rc4-md5", "123456"]
  "🇭🇰HK_a": ["ss", "hk.a.example.com", "12345", "rc4-md5", "123456"]
  "🇭🇰HK_b": ["ss", "hk.b.example.com", "12345", "rc4-md5", "123456"]
  "🇭🇰HK_c": ["ss", "hk.c.example.com", "12345", "rc4-md5", "123456"]
  "🇺🇸US_a": ["ss", "us.a.example.com", "12345", "rc4-md5", "123456"]
  "🇺🇸US_b": ["ss", "us.b.example.com", "12345", "rc4-md5", "123456"]
  "🇺🇸US_c": ["ss", "hk.c.example.com", "12345", "rc4-md5", "123456"]
  "socks": ["socks", "localhost", "12345"]
  "socks-tls": ["socks-tls", "localhost", "12345", "skip-verify"]
  "socks-auth": ["socks", "localhost", "12345", "user", "password"]
  "socks-tls-auth": ["socks-tls", "localhost", "12345", "skip-verify", "user", "password"]
  ...

Server protocols:

  • ss: shadowsocks;

    format:

    "server name": ["ss", "domain/IP", "port", "cipher", "password"]

    Current supported encryption methods:

    • aes-128-cfb
    • aes-192-cfb
    • aes-256-cfb
    • aes-128-ctr
    • aes-192-ctr
    • aes-256-ctr
    • des-cfb
    • bf-cfb
    • cast5-cfb
    • rc4-md5
    • chacha20
    • chacha20-ietf
    • salsa20
    • aes-256-gcm
    • aes-192-gcm
    • aes-128-gcm
    • chacha20-ietf-poly1305
  • socks: SOCKS5;

    Support username/password authentication.

    "server name": ["socks", "domain/IP", "port"] 
    "server name": ["socks", "domain/IP", "port", "username", "password"]
  • socks-tls: SOCKS5 over TLS;

    Support username/password authentication. Use: skip-verify or verify for checking server's certificate.

    "server name": ["socks-tls", "domain/IP", "ca check or not", "port"] 
    "server name": ["socks-tls", "domain/IP", "ca check or not", "port", "username", "password"]

Server Group

Proxy-Group:
  "Auto": ["rtt", "🇭🇰HK_a", "🇭🇰HK_b", "🇭🇰HK_c", "🇯🇵JP_a", "🇯🇵JP_b", "🇯🇵JP_c", "🇺🇸US_a", "🇺🇸US_b", "🇺🇸US_c"]
  "HK": ["select", "🇭🇰HK_a", "🇭🇰HK_b", "🇭🇰HK_c"]
  "JP": ["select", "🇯🇵JP_a", "🇯🇵JP_b", "🇯🇵JP_c"]
  "US": ["select", "🇺🇸US_a", "🇺🇸US_b", "🇺🇸US_c"]
  "Proxy": ["select", "Auto", "HK", "JP", "US"]
  "nProxy": ["select", "DIRECT"]

Format

"group name": ["option", "server name/server group name", ... ]
Option Description
select manual select
rtt select the server that has the shortest transaction time between local(through remote server) to www.gstatic.com

DNS

Local-DNS:
- ["DOMAIN", "localhost", "static", "127.0.0.1"]
- ["DOMAIN-KEYWORD", "google", "remote", ""]
- ["DOMAIN-SUFFIX", "baidu.com", "direct", "114.114.114.114"]

Format

- ["match option", "value", "resolve method", "parameter"]
Match Option Description Value
DOMAIN-SUFFIX match domain suffix domain suffix
DOMAIN match domain domain
DOMAIN-KEYWORD match domain keyword keyword
Resolve Option Description Parameter
static static resolve corresponding IP adress
direct use DNS to resolve DNS address
remote use remote server to resolve N/A

Request/Response Modification & URL Rewrite

HTTPS(turn the MitM on)

Http-Map:
  Req-Map: #request modification config
    - url-rex: "^http://www.zhihu.com"
      type: "UPDATE"
      items:
        - ["HEADER", "Scheme", "http"]
  Resp-Map: #response modification config
      - url-rex: "^http://www.zhihu.com"
      type: "UPDATE"
      items:
         - ["STATUS", "", "301"]
         - ["HEADER", "Location", "http://www.jianshu.com"]
Name Description
url-rex Use regex to match requested URL
type UPDATE(modification)and MOCK(local data return),(Resp-Maponly supportsUPDATE)
items An array: ["modify type", "Key", "Value"] (details on the following table)
Modify Type Description Condition
HEADER Add/modify header (Example) (Req-MaporResp-Map) type:(UPDATEorMOCK)
STATUS Modify return status code (Example) (Resp-Map) type:(UPDATEorMOCK)
BODY Response Body(Example)
(HTTPS domain must exists and supports HTTPS)
(Resp-Map) type:(MOCK)
URL Use url-rex to replace URL
Currently, HTTPS is not supported (URL Rewrite)
(Req-Map) type:(UPDATE)

Examples:

Header Modify

Add Scheme: http to every request that matches ^http://www.zhihu.com

Http-Map:
  Req-Map:
      - url-rex: "^http://www.zhihu.com"
      type: "UPDATE"
      items:
        - ["HEADER", "Scheme", "http"]
Request Mapping

If the type is MOCK, all HTTP domains are good to go but HTTPS domains must exist and support HTTPS

For every request that matches ^http://www.baidu.com/$, return directly.

{
  "name": "Shuttle",
  "github-link": "https://github.com/sipt/shuttle",
  "data": "response mock"
}

Create a file called mocks.json to write in the data above under RespFiles directory.

Config:

Http-Map:
  Req-Map:
    - url-rex: "^http://www.wogaoxing.abcascb" #all HTTP domains are good to go
      type: "MOCK"
      items:
        - ["STATUS", "", "200"] #return status code:200 OK
        - ["HEADER", "Content-Type", "application/json"] #add header
        - ["BODY", "", "mock.json"] #return data matches RespFiles/mock.json
    - url-rex: "^https://www.baidu.com" #For HTTPS, domains must exist and support HTTPS
      type: "MOCK"
      items:
        - ["STATUS", "", "200"] #return status code:200 OK
        - ["HEADER", "Content-Type", "application/json"] #add header
        - ["BODY", "", "mock.json"] #return data matches RespFiles/mock.json
URL Rewrite

HTTPS is not supported currently

For every request that matches ^http://www.baidu.com, use reverse proxy to redirect to http://www.zhihu.com

Http-Map:
  Req-Map:
    - url-rex: "^http://www.baidu.com"
      type: "UPDATE"
      items:
       - ["URL", "", "http://www.zhihu.com"]

MitM

MITM: 
  rules: ["*.baidu.com", "*.zhihu.com"] #Domains allowed for MitM
  ca: (base64) # CA certificate and private key, no need for configuration, Shuttle will generate them automatically and store here
  key: (base64)

Rule Configuration

Rule: # Proxy rules
- ["DOMAIN-SUFFIX", "gitlab.anjian.com", "DIRECT", ""]
# - [Match full domain,domain,go through Proxy group,]
- ["DOMAIN", "sipt.top", "Proxy", ""]
# - [keyword match,keyword,connection reject,]
- ["DOMAIN-KEYWORD", "zjtoolbar", "REJECT", ""]
# - [IP range match,IP range,direct connection,]
- ["IP-CIDR", "127.0.0.0/8", "DIRECT", ""]
# - [GEOIP match,China, go through nProxy group,]
- ["GEOIP", "CN", "nProxy", ""]
# - [match none of above,, go through Proxy group,]
- ["FINAL", "", "Proxy", ""]

Format.

- ["match option","value","connection type","memo"]
Match Option Description Value
DOMAIN-SUFFIX match domain suffix domain suffix
DOMAIN match full domain name domain
DOMAIN-KEYWORD match domain keyword keyword
IP-CIDR match IP range IP range
GEOIP GEOIP match country code
FINAL match none of above N/A
Connection Type Description
DIRECT connect designated server directly
REJECT connection rejected
Server name
Server group name

Web Dashboard

http://c.sipt.top

Servers

Servers

  1. GLOBAL group was created by Shuttle. It will be selected in "Remote Mode".
  2. Refresh RTT-Time.
  3. Check new.
  4. Up/Down speed.
  5. Outbound Mode: Rule Mode, Remote Mode, Direct Mode, Reject Mode.
  6. Dump: Capturing HTTP requests; MitM: Man-in-the-MiddleAttack.
  7. Reload the config file. Shutdown the Shuttle.

DNS Cache

dns-cache Check all DNS records The Refresh button and Clear button is on the left-hand corner. The Refresh button currently only support all records refresh.

Records

Records Check all request, and the corresponding rule. Currently, only the latest 500 entries will be stored, and keyword filter is supported

Traffic Capture

You can enable Dump for HTTP traffic capture. All the Dumped Data would show the DOWNLOAD icon the every records. You can click and see for more detail.

It's a little bit complicated for HTTPS traffic capture. You can follow the steps to try it out.

Cert

  1. Generate a certificate. A new CA would be generated and stored in the config file when you click the GENERATE button each time.
  2. Click DOWNLOAD button to download the CA.
  3. Add the CA to system and trust the CA.
  4. The table above will list all HTTPS traffic that could be captured based on rules. You can add yourt own rules. Shuttle will not capture the HTTPS traffic matched no rules..
  5. You should enable both Dump and MitM to make HTTPS traffic capture available.

Large file download

large_dump

Enter the file name in the input filed, then click download.

The dumped data just shows "The file is too large" instead of data detail for the better webpage performance when the file data size is over 2MB. You can download it for more details.

Build from source

go get -d github.com/sipt/shuttle
cd $GOPATH/src/github.com/sipt/shuttle/assets
go generate # package html and GeoLite2-Country.mmdb resources into assets/assets.go
cd $GOPATH/src/github.com/sipt/shuttle/cmd
go build -tags release

shuttle's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

shuttle's Issues

在 Raspbian 下无法运行

在配置好端口后运行 ./start.sh 会出现以下错误。

./shuttle: 2: ./shuttle: Syntax error: "(" unexpected
./shuttle: 2: ./shuttle: Syntax error: "(" unexpected

这错误不知道从哪里排查起来。
请问是什么具体的错误导致的?

rule规则更新提交

大佬好。您git里自带的规则其实有一些疏漏,举例来说:

  • ["DOMAIN-SUFFIX", "netflix.com", "nProxy", ""]
  • ["DOMAIN-SUFFIX", "netflix.net", "nProxy", ""]
    实际上应该是Proxy才对,因为大陆不能看NF,得代理才行。
    我结合我目前使用的所有机场订阅的surge规则,制作了一版新的rule,完全匹配您的软件,并且规则最全面,亲测匹配99%的场景。
    share给大佬。
    https://transfer.sh/Fr8OP/shuttle.yaml

在Docker中难以运行

使用Alpine镜像启动会提示

panic: user: Current not implemented on linux/amd64

goroutine 1 [running]:
github.com/sipt/shuttle/extension/config.init.0()
	/Users/sipt/Documents/GOPATH/src/github.com/sipt/shuttle/extension/config/config_path.go:17 +0x20f

经查,

u, err := user.Current()

user.Current() 依赖 "$USER" 环境变量,一般docker环境并无这个环境变量,所以会报错;

如果ShuttleHomeDir变量仅在upgrade的时候使用,能否在upgrade的时候再手动调用相关函数,不写在init() 中?

同时给出一个临时的解决方法:
在Docker container 中添加一个环境变量USER=root

Raspbian 下运行报错

在配置好端口后运行 ./start.sh 会出现以下错误。

./shuttle: 2: ./shuttle: Syntax error: "(" unexpected
./shuttle: 2: ./shuttle: Syntax error: "(" unexpected

这错误不知道从哪里排查起来。
请问是什么具体的错误导致的?

强烈建议改进一下排错功能

我修改了,可是 log 也好,yaml 写了 debug 也好,都没有看到有错误,
可是 shuttle 就是启动不了,很让人头大...

另外我发现每次删改已有的那些 JP HK 服务器,shuttle 必然启动不了是啥情况?

Debug 下面啥都没显示,

2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-cfb] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-cfb] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-cfb] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-ctr] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-ctr] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-ctr] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [bf-cfb] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [cast5-cfb] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [des-cfb] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [rc4-md5] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [salsa20] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-gcm] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-gcm] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-gcm] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf-poly1305] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks-tls] 2018-09-21 13:29:16 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [ss] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-cfb] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-cfb] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-cfb] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-ctr] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-ctr] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-ctr] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [bf-cfb] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [cast5-cfb] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [des-cfb] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [rc4-md5] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [salsa20] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-gcm] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-gcm] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-gcm] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf-poly1305] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks-tls] 2018-09-21 13:32:12 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [ss] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-cfb] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-cfb] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-cfb] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-ctr] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-ctr] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-ctr] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [bf-cfb] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [cast5-cfb] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [des-cfb] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [rc4-md5] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [salsa20] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-gcm] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-gcm] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-gcm] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf-poly1305] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks-tls] 2018-09-21 13:32:37 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [ss] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-cfb] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-cfb] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-cfb] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-ctr] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-ctr] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-ctr] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [bf-cfb] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [cast5-cfb] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [des-cfb] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [rc4-md5] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [salsa20] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-gcm] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-gcm] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-gcm] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf-poly1305] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks-tls] 2018-09-21 13:33:09 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [ss] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-cfb] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-cfb] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-cfb] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-ctr] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-ctr] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-ctr] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [bf-cfb] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [cast5-cfb] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [des-cfb] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [rc4-md5] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [salsa20] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-256-gcm] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-192-gcm] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [aes-128-gcm] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m [SS Ciphers] register cipher [chacha20-ietf-poly1305] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [socks-tls] 2018-09-21 13:39:37 �[1;0;32m[INFO]�[0m Support Proxy Protocol: [ss]

Raspbian 下无法运行

在配置好端口后运行 ./start.sh 会出现以下错误。

./shuttle: 2: ./shuttle: Syntax error: "(" unexpected
./shuttle: 2: ./shuttle: Syntax error: "(" unexpected

这错误不知道从哪里排查起来。
请问是什么具体的错误导致的?

shuttle出现闪退

系统:win10专业版最新版
配置:2组rtt节点,每组约10个。
使用情景:系统代理情况下看Netflix时,出现闪退

希望增加一个全局测速开关

目前测速办法是把同类型节点放在同一个rtt分组,测速后,手动再在select分组选定节点,然后proxy分组才会生效。
结果是,如果是分得很细的人的话,分组可能会非常多,因为要测速。
如果所有组都有一个测速开关的话,不需要自动测速转移的人就不需要建立那么多rtt分组了。

【bug】提交2个bug

1、web panel编辑rule后点done,无法生效,也无法编辑成功
2、- ["IP-CIDR", "192.168.18.0/24", "DIRECT", ""] 这样的CIDR策略不生效,配置后代理状态下浏览器依然无法打开路由器web控制界面(192.168.18.1)
提示:该网页无法正常运作 192.168.18.1 未发送任何数据。
ERR_EMPTY_RESPONSE

源码运行报 Unsupported flag "2quoted"

运行了 master 的最新代码,但是报错了,报下面这个错误:

panic: Unsupported flag "2quoted" in tag "Proxy,[flow],2quoted" of type shuttle.Config [recovered] 	panic: Unsupported flag "2quoted" in tag "Proxy,[flow],2quoted" of type shuttle.Config

看了一下代码,下面这段

// config.go:24
type Config struct {
	Ver        string              `yaml:"ver"`
	General    *General            `yaml:"General"`
	Proxy      map[string][]string `yaml:"Proxy,[flow],2quoted"`
	ProxyGroup map[string][]string `yaml:"Proxy-Group,[flow],2quoted"`
	LocalDNSs  [][]string          `yaml:"Local-DNS,[flow],2quoted"`
	Mitm       *Mitm               `yaml:"MITM"`
	Rule       [][]string          `yaml:"Rule,[flow],2quoted"`
	HttpMap    *HttpMap            `yaml:"Http-Map"`
}

看 golang 的 yaml 解析器文档里面,并没有对 2quoted 这个 tag 进行支持啊。搞不懂这个代码的来历,删掉后,是可以正常运行的。

比较好奇,求楼主解释一二。

兼容surge的配置文件

我注意到shuttle和surge的很多功能重叠,proxy group等concept也是一样的,是否可以直接兼容surge的配置文件?方便surge用户直接迁移。或者做一个surge config的转换工具,这个工具可以去除不兼容的部分,生成shuttle可读的配置。

远程Linux下安装shuttle无法打开Control panel

系统版本:CentOS Linux release 7.4.1708 (Core)
按照readme安装后,8082端口监听正常,telnet可以连接。
但是本地浏览器输入:http://<public_ip>:8082后,等待了一些时间无任何显示,亦无任何报错。
尝试使用caddy进行反代之后用于域名访问。caddy反代配置如下:
http://zeptovm.lqdflying.tk {
redir https://zeptovm.lqdflying.tk{url}
}

https://zeptovm.lqdflying.tk {
proxy / http://localhost:8082
}
依然无法开

加载配置文件报错

加载配置文件报错,错误信息如下:

panic: Unsupported flag "2quoted" in tag "Proxy,[flow],2quoted" of type shuttle.Config [recovered]
        panic: Unsupported flag "2quoted" in tag "Proxy,[flow],2quoted" of type shuttle.Config

goroutine 1 [running]:
github.com/sipt/yaml.handleErr(0xc0001f7900)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/yaml/yaml.go:249 +0x9a
panic(0xae89a0, 0xc000383aa0)
        /usr/local/go/src/runtime/panic.go:513 +0x1b9
github.com/sipt/yaml.(*decoder).mappingStruct(0xc0001a49c0, 0xc0001a16c0, 0xb69500, 0xc0001a15e0, 0x199, 0x16)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/yaml/decode.go:685 +0x107c
github.com/sipt/yaml.(*decoder).mapping(0xc0001a49c0, 0xc0001a16c0, 0xb69500, 0xc0001a15e0, 0x199, 0xb69500)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/yaml/decode.go:584 +0xb81
github.com/sipt/yaml.(*decoder).unmarshal(0xc0001a49c0, 0xc0001a16c0, 0xb69500, 0xc0001a15e0, 0x199, 0x1)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/yaml/decode.go:332 +0x137
github.com/sipt/yaml.(*decoder).document(0xc0001a49c0, 0xc0001a1650, 0xb69500, 0xc0001a15e0, 0x199, 0xc0001f7630)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/yaml/decode.go:344 +0x7a
github.com/sipt/yaml.(*decoder).unmarshal(0xc0001a49c0, 0xc0001a1650, 0xb69500, 0xc0001a15e0, 0x199, 0x199)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/yaml/decode.go:320 +0x1d3
github.com/sipt/yaml.unmarshal(0xc000214000, 0x17562, 0x17762, 0xa97a40, 0xc0001a15e0, 0xb69500, 0x0, 0x0)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/yaml/yaml.go:148 +0x3a1
github.com/sipt/yaml.Unmarshal(0xc000214000, 0x17562, 0x17762, 0xa97a40, 0xc0001a15e0, 0x0, 0x0)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/yaml/yaml.go:81 +0x58
github.com/sipt/shuttle.InitConfig(0xbcf726, 0xc, 0xc0001f7e80, 0x4549f0, 0x40b51f)
        /Users/XXXX/Code/GoApp/src/github.com/sipt/shuttle/config.go:105 +0x199
main.main()
        /Users/XXXX/Code/GoApp/src/github.com/sipt/shuttle/cmd/main.go:29 +0x4b

我用的develop分支代码,MAC和Linux版本都报错,Window版本测试 。

一个奇怪的会串网站的问题?

不知道应该如何描述这个问题,
大概就是设置好以后,打开 https://www.google.com
然后在相同地址栏打开一个 HTTP 链接,如 http://example.com
然后就立刻显示网页 404 不存在,以为 https://www.google.com 上面没有相关的资源

打开其他 HTTPS 网站以后再在地址栏打开 HTTP 网站也会出现类似问题

好像 HTTP 网站都会出现问题,例如打开 http://httpd.apache.org/ 直接显示 Cloudflare 的 403 Error

打开 mail.qq.com 的时候会跳转到 https,然后过一会就跳转到 http,结果也显示 The requested URL '/cgi-bin/frame_html' was not found on this server.

另外有时候 shuttle 会卡住一会,打不开网页。

无法打开Jupyter

加载Edit页面的时候就卡在了一个叫做
[W 16:21:02.201 NotebookApp] 404 GET /static/components/preact/preact.min.js.map (***.***.*.***) 2.46ms referer=None
[W 16:21:02.250 NotebookApp] 404 GET /static/components/preact-compat/preact-compat.min.js.map (***.***.*.***) 1.61ms referer=None
[W 16:21:02.255 NotebookApp] 404 GET /static/components/proptypes/index.js.map (***.***.*.***) 1.27ms referer=None
关闭网络中的代理设置就可以载入,同时,另一个搭载在google cloud上的Jupyter可以载入,没有出现这个问题,国内两台服务器都出现这个问题。

openwrt中定义成服务启动异常

#!/bin/sh /etc/rc.common

PROCD_DEBUG=1
START=98
USE_PROCD=1

start_service() {
procd_open_instance
procd_set_param respawn
procd_set_param command '/home/root/shuttle/shuttle'
procd_append_param command '-c /home/root/shuttle/shuttle.yaml -l off -lp /home/root/log'
procd_set_param stdout 1 # forward stdout of the command to logd
procd_set_param stderr 1 # same for stderr
procd_set_param env GIN_MODE=release
procd_set_param env HOME=/home/root
procd_set_param env LOGNAME=root
procd_set_param env TERM=xterm
procd_set_param env PWD=/home/root

    procd_close_instance

}

stop_service() {
killall -9 shuttle
}

restart() {
stop
start
}

Tue Dec 18 09:01:54 2018 daemon.err shuttle[2146]: panic: user: Current not implemented on linux/amd64
Tue Dec 18 09:01:54 2018 daemon.err shuttle[2146]:
Tue Dec 18 09:01:54 2018 daemon.err shuttle[2146]: goroutine 1 [running]:
Tue Dec 18 09:01:54 2018 daemon.err shuttle[2146]: github.com/sipt/shuttle/extension/config.init.0()
Tue Dec 18 09:01:54 2018 daemon.err shuttle[2146]: /Users/sipt/Documents/GOPATH/src/github.com/sipt/shuttle/extension/config/config_path.go:17 +0x20f
Tue Dec 18 09:02:00 2018 daemon.err shuttle[2164]: panic: user: Current not implemented on linux/amd64
Tue Dec 18 09:02:00 2018 daemon.err shuttle[2164]:
Tue Dec 18 09:02:00 2018 daemon.err shuttle[2164]: goroutine 1 [running]:
Tue Dec 18 09:02:00 2018 daemon.err shuttle[2164]: github.com/sipt/shuttle/extension/config.init.0()
Tue Dec 18 09:02:00 2018 daemon.err shuttle[2164]: /Users/sipt/Documents/GOPATH/src/github.com/sipt/shuttle/extension/config/config_path.go:17 +0x20f
Tue Dec 18 09:02:05 2018 daemon.err shuttle[2179]: panic: user: Current not implemented on linux/amd64
Tue Dec 18 09:02:05 2018 daemon.err shuttle[2179]:
Tue Dec 18 09:02:05 2018 daemon.err shuttle[2179]: goroutine 1 [running]:
Tue Dec 18 09:02:05 2018 daemon.err shuttle[2179]: github.com/sipt/shuttle/extension/config.init.0()
Tue Dec 18 09:02:05 2018 daemon.err shuttle[2179]: /Users/sipt/Documents/GOPATH/src/github.com/sipt/shuttle/extension/config/config_path.go:17 +0x20f

yaml配置文件编辑Tips<—>试用者必看

我在手动编辑配置文件的时候走了一些弯路,开个issue记录下来,方便后来者:
1、shuttle.yaml一定要以UTF8格式编辑,部分编辑器可能默认是gkb,这一点要注意
2、 "🇯🇵JP_a": ["jp.a.example.com", "12345", "rc4-md5", "123456"]———>这个配置样例,一定要注意冒号分和后边分括号之间一定一定要有空格,否则无法启动,而且不提示报错原因
3、"🇯🇵JP_a": ["jp.a.example.com", "12345", "rc4-md5", "123456"]———>这个配置样例,中括号内的以逗号分隔的具体字段内一定不要有空格,比如"jp.a.example.com"会解析成功,"jp.a.example.com "会解析失败,因为后者多了一个空格

疑似BUG提交,HTTP系统代理的情况下,同一个域名内部做了二次跳转的话,shuttle似乎会提示“意外终止连接”

系统:win10专业版最新版
配置:2组rtt节点,每组约10个。、
BUG疑似:HTTP系统代理的情况下,同一个域名内部做了二次跳转的话,shuttle似乎会提示“意外终止连接”
测试使用情景:打开https://my.90vm.com/clientarea.php?action=services正常,打开https://my.90vm.com/clientarea.php?action=productdetails&id=65失败。
目前测试的过程:
咨询厂商,似乎他们https://my.90vm.com/clientarea.php?action=services是在国内,https://my.90vm.com/clientarea.php?action=productdetails&id=65会内部跳转到美国的服务器。
相同的规则,手机+surge可以正常打开。PC+http系统代理无法打开。
我有90vm的VPS,作者如果想测试这个问题,可以提供我邮箱地址,我把我在90VM的账号密码贡献出来

No english ?

Hello,
Your project looks good, any plans to translate it in english ;)

0.4.1bug反馈

相同的配置在0.3.2可用,在之后两个版本都不行
主代理Proxy没问题,规则里ip段的代理nw在0.4.1和0.5.1都不可用,同样配置换成0.3.2程序就能用..
查看Records显示如下
10-09 22:59:44 | 500B/0B | nw(DOMAIN,192.168.5.55) | http(GET) | http://192.168.5.55/

,配置大致如下,vt是默认f.q用,nw只是为了访问固定网段时跳到单位内网
Proxy:
"vt": ["ss", ....]
"nw": ["ss", ....]
Proxy-Group:
"Auto": ["rtt", "VT"]
"Proxy": ["select", "Auto", "VT", "NW"]
"VT": ["select", "vt"]
"NW": ["select", "nw"]
"nProxy": ["select", "DIRECT"]
Rule:

  • ["IP-CIDR", "192.168.5.1/24", "NW", ""]
  • ["IP-CIDR", "192.168.1.1/24", "NW", ""]
  • ["IP-CIDR", "192.168.254.1/24", "NW", ""]
  • ["DOMAIN", "gs.apple.com", "Proxy", ""]
  • ["DOMAIN", "apple.com", "nProxy", ""]
  • ["DOMAIN", "icloud.com", "nProxy", ""]

日志
2018-10-09 22:59:44 [INFO] [RULE] [ID:269669823514939392] [192.168.5.55:0, 192.168.5.55, ] rule: [DOMAIN, 192.168.5.55, NW]
2018-10-09 22:59:44 [INFO] [RULE] [ID:269669823514939392] Get server by policy [NW] => [nw]
2018-10-09 22:59:44 [INFO] [HTTP] [ID:269669823514939392] Start connect to Server [nw]
2018-10-09 22:59:44 [INFO] [HTTP] [ClientConnID:269669823514939392] Bind to Server [ServerConnID:269669823611408384]
2018-10-09 22:59:44 [ERROR] [ID:269669823611408384] [HttpChannel] HttpChannel Transport s->[b]: read tcp 192.168.31.181:58658->xxx.xxx.xxx.xxx:xxxx: wsarecv: 远程主机强迫关闭了一个现有的连接。
2018-10-09 22:59:44 [INFO] [ID:269669823514939392] close connection
2018-10-09 22:59:44 [INFO] [ID:269669823611408384] close connection

远程服务用gost的ss,日志如下
2018/10/09 22:59:37 ss.go:162: [ss] xxx.xxx.xxx.xxx:54063 -> [3139:322e:3136:382e:3
52e:3535:50:4745]:21536 : dial tcp [3139:322e:3136:382e:352e:3535:50:4745]:21536
: connectex: A socket operation was attempted to an unreachable network.

0.6.0后Socks协议代理打开谷歌超时

使用0.6.0版本的软件发现一个奇怪的问题,如果使用Socks协议的代理谷歌,twitter等一些网站无法打开,不是报连接超时就是报证书错误,但是打开其他的网站有没有问题。而且如果选择使用Shadowsocks代理谷歌等网站打开又是正常的。
下面附上了软件日志,cn2是ss代理,xs和ss是Socks代理。
2018-12-26-220413_1.log

Windows系统全局http代理似乎有断流现象

系统环境:Win10专业版 1803 shuttle最新release版
疑似问题描述:Windows系统全局http代理似乎有断流现象
疑似问题发现过程:Windows系统全局代理的情况下,telegram的UI左下角经常转圈[转圈一般是代表tg在重新建立连接],发生频率大约10分钟一次,恢复时间3-5秒。
尝试解决过程:tg软件直接配置socks5代理后就没有断流。
其他系统代理模式下的软件表现:sstap,ssr,SSD均在系统代理的模式下未发现断流

升级到0.6.0后socks不可用

报错如下,http代理没有问题。

2018-12-12 10:26:59 [ERROR] [SOCKS] [ID:%d] ConnectToServer failed [%s] err: %s29279400728776294469.171.234.29:443strconv.ParseUint: parsing "": invalid syntax

为何运行./shuttle后,根本没有shuttle进程在运行?

hi。

bogon:shuttle brite$ ls
shuttle shuttle_macos_amd64_alpha_v0.5.1.zip
bogon:shuttle brite$ cd shuttle
bogon:shuttle brite$ ls
GeoLite2-Country.mmdb shuttle.yaml view
RespFiles start.sh
shuttle upgrade
bogon:shuttle brite$ ./shuttle -h
bogon:shuttle brite$ ./shuttle -c shuttle.yaml
bogon:shuttle brite$ cat start.sh
#!/usr/bin/env bash
nohup ./shuttle >> shuttle.log 2>&1 &
bogon:shuttle brite$ ps aux|grep shuttle
yuming 17338 0.0 0.0 2442020 784 s000 S+ 7:47下午 0:00.00 grep shuttle
bogon:shuttle brite$ ./start.sh
bogon:shuttle brite$ ps aux|grep shuttle
yuming 17350 0.0 0.0 2423384 248 s000 R+ 7:47下午 0:00.00 grep shuttle
bogon:shuttle brite$

针对panel优化的两个建议

1、希望可以优化Proxy的显示面板,代理节点可以按照分组展示的同时,不要在顶端像在这样子全部在一起展示出来——如果代理节点一多了,会比较乱
2、希望可以不借助rtt分组的情况下,自动展示延迟信息

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.