diff --git a/README.md b/README.md index adcbe65..216d3ca 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ we can set up local listeners as proxy servers, and forward requests to internet - Services: - dhcpd: a simple dhcp server that can detect existing dhcp server and avoid conflicts -## Supported Protocols +## Protocols
click to see details @@ -82,12 +82,21 @@ we can set up local listeners as proxy servers, and forward requests to internet - Docker: `docker pull nadoo/glider` - ArchLinux: `sudo pacman -S glider` -## Usage - -#### Show help +## Run ```bash -glider -h +glider -config CONFIG_PATH +``` +```bash +glider -verbose -listen :8443 -forward SCHEME://HOST:PORT +``` + +## Usage + +**Show help:** + +```bash +glider -help ```
click to see details @@ -137,6 +146,8 @@ OPTION: remote dns server address -dnstimeout int timeout value used in multiple dnsservers switch(seconds) (default 3) + -example + show usage examples -forward value forward url, see the URL section below -include value @@ -156,7 +167,7 @@ OPTION: -rules-dir string rule file folder -scheme string - show help message of proxy scheme, use 'all' to see all + show help message of proxy scheme, use 'all' to see all schemes -service value run specified services, format: SERVICE_NAME[,SERVICE_CONFIG] -strategy string @@ -183,10 +194,10 @@ URL: -forward socks5://serverA:1080,socks5://serverB:1080 (proxy chain) SCHEME: - listen : kcp,socks5,tls,smux,ss,vless,redir,tproxy,mixed,wss,redir6,http,pxyproto,tcp,trojan,trojanc,udp,ws,unix - forward: trojanc,udp,vless,vmess,socks4,tcp,tls,trojan,http,kcp,smux,ws,simple-obfs,unix,ss,ssh,ssr,wss,direct,socks5,reject,socks4a + listen : http kcp mixed pxyproto redir redir6 smux socks5 ss tcp tls tproxy trojan trojanc udp unix vless ws wss + forward: direct http kcp reject simple-obfs smux socks4 socks4a socks5 ss ssh ssr tcp tls trojan trojanc udp unix vless vmess ws wss - Note: use `glider -scheme all` or `glider -scheme SCHEME` to see help info for the scheme. + Note: use 'glider -scheme all' or 'glider -scheme SCHEME' to see help info for the scheme. -- Forwarder Options: FORWARD_URL#OPTIONS @@ -201,23 +212,20 @@ Services: dhcpd: service=dhcpd,INTERFACE,START_IP,END_IP,LEASE_MINUTES[,MAC=IP,MAC=IP...] e.g. service=dhcpd,eth1,192.168.1.100,192.168.1.199,720 +-- +Help: + glider -help + glider -scheme all + glider -example + see README.md and glider.conf.example for more details. -- -glider v0.16.0, https://github.com/nadoo/glider +glider 0.16.0, https://github.com/nadoo/glider ```
-#### Run it - -```bash -glider -config CONFIG_PATH -``` -```bash -glider -verbose -listen :8443 -forward SCHEME://HOST:PORT -``` - -#### Show Schemes +**Show Schemes:** ```bash glider -scheme all @@ -335,6 +343,48 @@ TLS and Websocket with a specified proxy protocol:
+**Show Examples:** + +```bash +glider -example +``` + +
+click to see details + +```bash +Examples: + glider -config glider.conf + -run glider with specified config file. + + glider -listen :8443 -verbose + -listen on :8443, serve as http/socks5 proxy on the same port, in verbose mode. + + glider -listen :8443 -forward direct://#interface=eth0 -forward direct://#interface=eth1 + -listen on 8443 and forward requests via interface eth0 and eth1 in round robin mode. + + glider -listen tls://:443?cert=crtFilePath&key=keyFilePath,http:// -verbose + -listen on :443 as a https(http over tls) proxy server. + + glider -listen http://:8080 -forward socks5://serverA:1080,socks5://serverB:1080 + -listen on :8080 as a http proxy server, forward all requests via forward chain. + + glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080#priority=10 -forward socks5://serverC:1080#priority=10 + -serverA will only be used when serverB and serverC are not available. + + glider -listen tcp://:80 -forward tcp://serverA:80 + -tcp tunnel: listen on :80 and forward all requests to serverA:80. + + glider -listen udp://:53 -forward socks5://serverA:1080,udp://8.8.8.8:53 + -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote socks5 server. + + glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward socks5://serverA:1080 -dnsrecord=www.example.com/1.2.3.4 + -listen on :53 as dns server, forward to 8.8.8.8:53 via socks5 server. +``` + +
+ + ## Config - [ConfigFile](config) @@ -420,49 +470,6 @@ TLS and Websocket with a specified proxy protocol: -## Examples - -
-click to see details - -```bash -Examples: - glider -config glider.conf - -run glider with specified config file. - - glider -listen :8443 -verbose - -listen on :8443, serve as http/socks5 proxy on the same port, in verbose mode. - - glider -listen ss://AEAD_AES_128_GCM:pass@:8443 -verbose - -listen on 0.0.0.0:8443 as a ss server. - - glider -listen tls://:443?cert=crtFilePath&key=keyFilePath,http:// -verbose - -listen on :443 as a https(http over tls) proxy server. - - glider -listen http://:8080 -forward socks5://127.0.0.1:1080 - -listen on :8080 as a http proxy server, forward all requests via socks5 server. - - glider -listen socks5://:1080 -forward "tls://abc.com:443,vmess://security:uuid@?alterID=10" - -listen on :1080 as a socks5 server, forward all requests via remote tls+vmess server. - - glider -listen socks5://:1080 -forward ss://method:pass@server1:port1 -forward ss://method:pass@server2:port2 -strategy rr - -listen on :1080 as socks5 server, forward requests via server1 and server2 in round robin mode. - - glider -listen tcp://:80 -forward tcp://2.2.2.2:80 - -tcp tunnel: listen on :80 and forward all requests to 2.2.2.2:80. - - glider -listen udp://:53 -forward ss://method:pass@1.1.1.1:8443,udp://8.8.8.8:53 - -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote ss server. - - glider -listen socks5://:1080 -listen http://:8080 -forward ss://method:pass@1.1.1.1:8443 - -listen on :1080 as socks5 server, :8080 as http proxy server, forward all requests via remote ss server. - - glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward ss://method:pass@server:port -dnsrecord=www.example.com/1.2.3.4 - -listen on :53 as dns server, forward to 8.8.8.8:53 via ss server. -``` - -
- ## Links - [ipset](https://github.com/nadoo/ipset): netlink ipset package for Go. diff --git a/config.go b/config.go index d297552..551cacd 100644 --- a/config.go +++ b/config.go @@ -43,7 +43,8 @@ func parseConfig() *Config { flag.SetOutput(os.Stdout) - scheme := flag.String("scheme", "", "show help message of proxy scheme, use 'all' to see all ") + scheme := flag.String("scheme", "", "show help message of proxy scheme, use 'all' to see all schemes") + example := flag.Bool("example", false, "show usage examples") flag.BoolVar(&conf.Verbose, "verbose", false, "verbose mode") flag.IntVar(&conf.LogFlags, "logflags", 19, "do not change it if you do not know what it is, ref: https://pkg.go.dev/log#pkg-constants") @@ -98,7 +99,12 @@ check=disable: disable health check`) } if *scheme != "" { - fmt.Fprintf(os.Stdout, proxy.Usage(*scheme)) + fmt.Fprintf(flag.Output(), proxy.Usage(*scheme)) + os.Exit(0) + } + + if *example { + fmt.Fprintf(flag.Output(), examples) os.Exit(0) } @@ -154,20 +160,21 @@ check=disable: disable health check`) } func usage() { - w := flag.Output() + fmt.Fprint(flag.Output(), usage1) + flag.PrintDefaults() + fmt.Fprintf(flag.Output(), usage2, proxy.ServerSchemes(), proxy.DialerSchemes(), version) +} - fmt.Fprint(w, ` +var usage1 = ` Usage: glider [-listen URL]... [-forward URL]... [OPTION]... e.g. glider -config /etc/glider/glider.conf glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080 -verbose -`) +OPTION: +` - fmt.Fprintf(w, "OPTION:\n") - flag.PrintDefaults() - - fmt.Fprint(w, ` +var usage2 = ` URL: proxy: SCHEME://[USER:PASS@][HOST]:PORT chain: proxy,proxy[,proxy]... @@ -179,14 +186,12 @@ URL: -forward tls://server.com:443,http:// (protocol chain) -forward socks5://serverA:1080,socks5://serverB:1080 (proxy chain) -`) +SCHEME: + listen : %s + forward: %s - fmt.Fprintf(w, "SCHEME:\n") - fmt.Fprintf(w, " listen : %s\n", proxy.ServerSchemes()) - fmt.Fprintf(w, " forward: %s\n", proxy.DialerSchemes()) - fmt.Fprintf(w, "\n Note: use `glider -scheme all` or `glider -scheme SCHEME` to see help info for the scheme.\n") + Note: use 'glider -scheme all' or 'glider -scheme SCHEME' to see help info for the scheme. - fmt.Fprint(w, ` -- Forwarder Options: FORWARD_URL#OPTIONS priority : the priority of that forwarder, the larger the higher, default: 0 @@ -200,8 +205,43 @@ Services: dhcpd: service=dhcpd,INTERFACE,START_IP,END_IP,LEASE_MINUTES[,MAC=IP,MAC=IP...] e.g. service=dhcpd,eth1,192.168.1.100,192.168.1.199,720 -see README.md and glider.conf.example for more details. -`) +-- +Help: + glider -help + glider -scheme all + glider -example - fmt.Fprintf(w, "--\nglider v%s, https://github.com/nadoo/glider\n\n", version) -} +see README.md and glider.conf.example for more details. +-- +glider %s, https://github.com/nadoo/glider +` + +var examples = ` +Examples: + glider -config glider.conf + -run glider with specified config file. + + glider -listen :8443 -verbose + -listen on :8443, serve as http/socks5 proxy on the same port, in verbose mode. + + glider -listen :8443 -forward direct://#interface=eth0 -forward direct://#interface=eth1 + -listen on 8443 and forward requests via interface eth0 and eth1 in round robin mode. + + glider -listen tls://:443?cert=crtFilePath&key=keyFilePath,http:// -verbose + -listen on :443 as a https(http over tls) proxy server. + + glider -listen http://:8080 -forward socks5://serverA:1080,socks5://serverB:1080 + -listen on :8080 as a http proxy server, forward all requests via forward chain. + + glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080#priority=10 -forward socks5://serverC:1080#priority=10 + -serverA will only be used when serverB and serverC are not available. + + glider -listen tcp://:80 -forward tcp://serverA:80 + -tcp tunnel: listen on :80 and forward all requests to serverA:80. + + glider -listen udp://:53 -forward socks5://serverA:1080,udp://8.8.8.8:53 + -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote socks5 server. + + glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward socks5://serverA:1080 -dnsrecord=www.example.com/1.2.3.4 + -listen on :53 as dns server, forward to 8.8.8.8:53 via socks5 server. +` diff --git a/proxy/dialer.go b/proxy/dialer.go index 4112468..753fa6a 100644 --- a/proxy/dialer.go +++ b/proxy/dialer.go @@ -3,6 +3,7 @@ package proxy import ( "errors" "net" + "sort" "strings" ) @@ -73,5 +74,6 @@ func DialerSchemes() string { for name := range dialerCreators { s = append(s, name) } - return strings.Join(s, ",") + sort.Strings(s) + return strings.Join(s, " ") } diff --git a/proxy/server.go b/proxy/server.go index c674420..a0cf2f5 100644 --- a/proxy/server.go +++ b/proxy/server.go @@ -3,6 +3,7 @@ package proxy import ( "errors" "net" + "sort" "strings" ) @@ -58,5 +59,6 @@ func ServerSchemes() string { for name := range serverCreators { s = append(s, name) } - return strings.Join(s, ",") + sort.Strings(s) + return strings.Join(s, " ") } diff --git a/proxy/trojan/trojan.go b/proxy/trojan/trojan.go index 6ee811c..cda4c64 100644 --- a/proxy/trojan/trojan.go +++ b/proxy/trojan/trojan.go @@ -51,12 +51,13 @@ func NewTrojan(s string, d proxy.Dialer, p proxy.Proxy) (*Trojan, error) { fallback: query.Get("fallback"), } - if _, port, _ := net.SplitHostPort(t.addr); port == "" { - t.addr = net.JoinHostPort(t.addr, "443") - } - - if t.serverName == "" { - t.serverName = t.addr[:strings.LastIndex(t.addr, ":")] + if t.addr != "" { + if _, port, _ := net.SplitHostPort(t.addr); port == "" { + t.addr = net.JoinHostPort(t.addr, "443") + } + if t.serverName == "" { + t.serverName = t.addr[:strings.LastIndex(t.addr, ":")] + } } // pass diff --git a/proxy/usage.go b/proxy/usage.go index f707fd6..d9a1241 100644 --- a/proxy/usage.go +++ b/proxy/usage.go @@ -2,8 +2,10 @@ package proxy import "strings" -var msg strings.Builder -var usages = make(map[string]string) +var ( + msg strings.Builder + usages = make(map[string]string) +) // AddUsage adds help message for the named proxy. func AddUsage(name, usage string) {