2017-08-23 16:35:39 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2018-07-09 23:42:33 +08:00
|
|
|
"io/ioutil"
|
2017-08-23 16:35:39 +08:00
|
|
|
"log"
|
|
|
|
"os"
|
2017-08-25 20:32:51 +08:00
|
|
|
"path"
|
2018-07-09 23:42:33 +08:00
|
|
|
"strings"
|
2017-08-23 16:35:39 +08:00
|
|
|
|
|
|
|
"github.com/nadoo/conflag"
|
2018-08-11 11:46:10 +08:00
|
|
|
|
2018-08-12 22:07:19 +08:00
|
|
|
"github.com/nadoo/glider/dns"
|
2018-08-11 11:46:10 +08:00
|
|
|
"github.com/nadoo/glider/strategy"
|
2017-08-23 16:35:39 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
var flag = conflag.New()
|
|
|
|
|
|
|
|
var conf struct {
|
2018-08-10 19:03:30 +08:00
|
|
|
Verbose bool
|
|
|
|
|
|
|
|
Listen []string
|
|
|
|
|
2018-08-11 11:46:10 +08:00
|
|
|
Forward []string
|
|
|
|
StrategyConfig strategy.Config
|
2018-08-10 19:03:30 +08:00
|
|
|
|
|
|
|
RuleFile []string
|
|
|
|
RulesDir string
|
2017-08-23 16:35:39 +08:00
|
|
|
|
2018-08-12 22:07:19 +08:00
|
|
|
DNS string
|
|
|
|
DNSConfig dns.Config
|
2017-08-23 16:35:39 +08:00
|
|
|
|
|
|
|
IPSet string
|
|
|
|
|
|
|
|
rules []*RuleConf
|
|
|
|
}
|
|
|
|
|
|
|
|
func confInit() {
|
|
|
|
flag.BoolVar(&conf.Verbose, "verbose", false, "verbose mode")
|
2018-06-03 13:54:16 +08:00
|
|
|
flag.StringSliceUniqVar(&conf.Listen, "listen", nil, "listen url, format: SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS")
|
2018-08-10 19:03:30 +08:00
|
|
|
|
2018-06-03 13:54:16 +08:00
|
|
|
flag.StringSliceUniqVar(&conf.Forward, "forward", nil, "forward url, format: SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS[,SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS]")
|
2018-08-10 19:03:30 +08:00
|
|
|
flag.StringVar(&conf.StrategyConfig.Strategy, "strategy", "rr", "forward strategy, default: rr")
|
|
|
|
flag.StringVar(&conf.StrategyConfig.CheckWebSite, "checkwebsite", "www.apple.com", "proxy check HTTP(NOT HTTPS) website address, format: HOST[:PORT], default port: 80")
|
2018-08-12 21:40:22 +08:00
|
|
|
// TODO: change to checkinterval
|
2018-08-10 19:03:30 +08:00
|
|
|
flag.IntVar(&conf.StrategyConfig.CheckInterval, "checkduration", 30, "proxy check interval(seconds)")
|
2018-08-12 21:40:22 +08:00
|
|
|
flag.IntVar(&conf.StrategyConfig.MaxFailures, "maxfailures", 3, "max failures to change status to disabled")
|
2018-08-10 19:03:30 +08:00
|
|
|
|
2017-08-23 16:35:39 +08:00
|
|
|
flag.StringSliceUniqVar(&conf.RuleFile, "rulefile", nil, "rule file path")
|
2017-09-04 23:32:12 +08:00
|
|
|
flag.StringVar(&conf.RulesDir, "rules-dir", "", "rule file folder")
|
2017-08-23 16:35:39 +08:00
|
|
|
|
2017-08-31 00:08:22 +08:00
|
|
|
flag.StringVar(&conf.DNS, "dns", "", "dns forwarder server listen address")
|
2018-08-12 22:07:19 +08:00
|
|
|
flag.StringSliceUniqVar(&conf.DNSConfig.Servers, "dnsserver", []string{"8.8.8.8:53"}, "remote dns server")
|
|
|
|
flag.IntVar(&conf.DNSConfig.Timeout, "dnstimeout", 3, "timeout value used in multiple dnsservers switch(seconds)")
|
|
|
|
flag.IntVar(&conf.DNSConfig.MaxTTL, "dnsmaxttl", 1800, "maximum TTL value for entries in the CACHE(seconds)")
|
|
|
|
flag.IntVar(&conf.DNSConfig.MinTTL, "dnsminttl", 0, "minimum TTL value for entries in the CACHE(seconds)")
|
|
|
|
flag.StringSliceUniqVar(&conf.DNSConfig.Records, "dnsrecord", nil, "custom dns record, format: domain/ip")
|
2017-08-23 16:35:39 +08:00
|
|
|
|
2017-08-29 18:36:42 +08:00
|
|
|
flag.StringVar(&conf.IPSet, "ipset", "", "ipset name")
|
2017-08-23 16:35:39 +08:00
|
|
|
|
|
|
|
flag.Usage = usage
|
|
|
|
err := flag.Parse()
|
|
|
|
if err != nil {
|
2018-01-04 15:26:18 +08:00
|
|
|
flag.Usage()
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "ERROR: %s\n", err)
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(conf.Listen) == 0 && conf.DNS == "" {
|
|
|
|
flag.Usage()
|
|
|
|
fmt.Fprintf(os.Stderr, "ERROR: listen url must be specified.\n")
|
|
|
|
os.Exit(-1)
|
|
|
|
}
|
|
|
|
|
|
|
|
// rulefiles
|
|
|
|
for _, ruleFile := range conf.RuleFile {
|
|
|
|
rule, err := NewRuleConfFromFile(ruleFile)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
conf.rules = append(conf.rules, rule)
|
|
|
|
}
|
|
|
|
|
2017-09-04 23:32:12 +08:00
|
|
|
if conf.RulesDir != "" {
|
2018-07-29 23:44:23 +08:00
|
|
|
if !path.IsAbs(conf.RulesDir) {
|
|
|
|
conf.RulesDir = path.Join(flag.ConfDir(), conf.RulesDir)
|
|
|
|
}
|
2017-09-04 23:32:12 +08:00
|
|
|
ruleFolderFiles, _ := listDir(conf.RulesDir, ".rule")
|
2017-08-25 20:32:51 +08:00
|
|
|
|
2017-09-04 23:32:12 +08:00
|
|
|
for _, ruleFile := range ruleFolderFiles {
|
|
|
|
rule, err := NewRuleConfFromFile(ruleFile)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2017-08-23 16:35:39 +08:00
|
|
|
|
2017-09-04 23:32:12 +08:00
|
|
|
conf.rules = append(conf.rules, rule)
|
|
|
|
}
|
2017-08-23 16:35:39 +08:00
|
|
|
}
|
2017-09-04 23:32:12 +08:00
|
|
|
|
2017-08-23 16:35:39 +08:00
|
|
|
}
|
|
|
|
|
2018-07-09 23:42:33 +08:00
|
|
|
func listDir(dirPth string, suffix string) (files []string, err error) {
|
|
|
|
files = make([]string, 0, 10)
|
|
|
|
dir, err := ioutil.ReadDir(dirPth)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
PthSep := string(os.PathSeparator)
|
|
|
|
suffix = strings.ToUpper(suffix)
|
|
|
|
for _, fi := range dir {
|
|
|
|
if fi.IsDir() {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) {
|
|
|
|
files = append(files, dirPth+PthSep+fi.Name())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return files, nil
|
|
|
|
}
|
|
|
|
|
2017-08-23 16:35:39 +08:00
|
|
|
// RuleConf , every ruleForwarder points to a rule file
|
|
|
|
type RuleConf struct {
|
2017-08-23 17:45:57 +08:00
|
|
|
name string
|
|
|
|
|
2018-08-11 11:46:10 +08:00
|
|
|
Forward []string
|
|
|
|
StrategyConfig strategy.Config
|
2017-08-23 16:35:39 +08:00
|
|
|
|
2018-08-12 12:37:25 +08:00
|
|
|
DNSServers []string
|
|
|
|
IPSet string
|
2017-08-23 16:35:39 +08:00
|
|
|
|
|
|
|
Domain []string
|
|
|
|
IP []string
|
|
|
|
CIDR []string
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewRuleConfFromFile .
|
|
|
|
func NewRuleConfFromFile(ruleFile string) (*RuleConf, error) {
|
|
|
|
p := &RuleConf{name: ruleFile}
|
|
|
|
|
|
|
|
f := conflag.NewFromFile("rule", ruleFile)
|
2018-06-03 13:54:16 +08:00
|
|
|
f.StringSliceUniqVar(&p.Forward, "forward", nil, "forward url, format: SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS[,SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS]")
|
2018-08-10 19:03:30 +08:00
|
|
|
f.StringVar(&p.StrategyConfig.Strategy, "strategy", "rr", "forward strategy, default: rr")
|
|
|
|
f.StringVar(&p.StrategyConfig.CheckWebSite, "checkwebsite", "www.apple.com", "proxy check HTTP(NOT HTTPS) website address, format: HOST[:PORT], default port: 80")
|
2018-08-12 21:40:22 +08:00
|
|
|
// TODO: change to checkinterval
|
2018-08-10 19:03:30 +08:00
|
|
|
f.IntVar(&p.StrategyConfig.CheckInterval, "checkduration", 30, "proxy check interval(seconds)")
|
2017-08-23 16:35:39 +08:00
|
|
|
|
2018-08-12 12:37:25 +08:00
|
|
|
f.StringSliceUniqVar(&p.DNSServers, "dnsserver", nil, "remote dns server")
|
2017-08-23 16:35:39 +08:00
|
|
|
f.StringVar(&p.IPSet, "ipset", "", "ipset name")
|
|
|
|
|
|
|
|
f.StringSliceUniqVar(&p.Domain, "domain", nil, "domain")
|
|
|
|
f.StringSliceUniqVar(&p.IP, "ip", nil, "ip")
|
|
|
|
f.StringSliceUniqVar(&p.CIDR, "cidr", nil, "cidr")
|
|
|
|
|
|
|
|
err := f.Parse()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, "ERROR: %s\n", err)
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return p, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func usage() {
|
|
|
|
app := os.Args[0]
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "%s v%s usage:\n", app, VERSION)
|
|
|
|
flag.PrintDefaults()
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2018-06-03 13:54:16 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "Available Schemes:\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " mixed: serve as a http/socks5 proxy on the same port. (default)\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " ss: ss proxy\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " socks5: socks5 proxy\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " http: http proxy\n")
|
2018-05-20 16:59:48 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " ssr: ssr proxy\n")
|
2018-07-04 11:17:38 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " vmess: vmess proxy\n")
|
2018-07-24 00:54:38 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " tls: tls transport\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " ws: websocket transport\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " redir: redirect proxy. (used on linux as a transparent proxy with iptables redirect rules)\n")
|
2018-01-20 23:31:36 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " tcptun: tcp tunnel\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " udptun: udp tunnel\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " uottun: udp over tcp tunnel\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2018-06-03 13:54:16 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "Available schemes for different modes:\n")
|
2018-07-30 01:13:44 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " listen: mixed ss socks5 http redir tcptun udptun uottun\n")
|
2018-07-22 20:02:50 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " forward: ss socks5 http ssr vmess tls ws\n")
|
2018-05-17 10:16:00 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2018-06-03 13:54:16 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "SS scheme:\n")
|
2018-05-17 10:16:00 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " ss://method:pass@host:port\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
|
|
|
fmt.Fprintf(os.Stderr, "Available methods for ss:\n")
|
2018-06-26 16:15:48 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " AEAD_AES_128_GCM AEAD_AES_192_GCM AEAD_AES_256_GCM AEAD_CHACHA20_POLY1305 AES-128-CFB AES-128-CTR AES-192-CFB AES-192-CTR AES-256-CFB AES-256-CTR CHACHA20-IETF XCHACHA20")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " NOTE: chacha20-ietf-poly1305 = AEAD_CHACHA20_POLY1305\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2018-06-03 13:54:16 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "SSR scheme:\n")
|
2018-05-17 10:16:00 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " ssr://method:pass@host:port?protocol=xxx&protocol_param=yyy&obfs=zzz&obfs_param=xyz\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2018-07-04 11:17:38 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "VMess scheme:\n")
|
2018-07-06 11:13:25 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " vmess://[security:]uuid@host:port?alterID=num\n")
|
2018-07-04 11:17:38 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2018-07-12 11:22:21 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "Available securities for vmess:\n")
|
2018-07-11 08:34:15 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " none, aes-128-gcm, chacha20-poly1305\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
|
|
|
fmt.Fprintf(os.Stderr, "TLS scheme:\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true]\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
|
|
|
fmt.Fprintf(os.Stderr, "TLS with a specified proxy protocol:\n")
|
2018-07-24 00:45:41 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true],scheme://\n")
|
2018-07-11 08:34:15 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true],http://[user:pass@]\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true],socks5://[user:pass@]\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true],vmess://[security:]uuid@?alterID=num\n")
|
2018-07-05 20:44:19 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2018-07-22 20:02:50 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "Websocket scheme:\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " ws://host:port[/path]\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
|
|
|
fmt.Fprintf(os.Stderr, "Websocket with a specified proxy protocol:\n")
|
2018-07-24 00:45:41 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " ws://host:port[/path],scheme://\n")
|
2018-07-22 20:02:50 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " ws://host:port[/path],http://[user:pass@]\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " ws://host:port[/path],socks5://[user:pass@]\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " ws://host:port[/path],vmess://[security:]uuid@?alterID=num\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
|
|
|
fmt.Fprintf(os.Stderr, "TLS and Websocket with a specified proxy protocol:\n")
|
2018-07-24 00:45:41 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true],ws://[@/path],scheme://\n")
|
2018-07-22 20:02:50 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true],ws://[@/path],http://[user:pass@]\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true],ws://[@/path],socks5://[user:pass@]\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " tls://host:port[?skipVerify=true],ws://[@/path],vmess://[security:]uuid@?alterID=num\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2018-08-01 00:36:11 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "DNS forwarding server:\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " dns=:53\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " dnsserver=8.8.8.8:53\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " dnsserver=1.1.1.1:53\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " dnsrecord=www.example.com/1.2.3.4\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " dnsrecord=www.example.com/2606:2800:220:1:248:1893:25c8:1946\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "Available forward strategies:\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " rr: Round Robin mode\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " ha: High Availability mode\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
|
|
|
fmt.Fprintf(os.Stderr, "Config file format(see `"+app+".conf.example` as an example):\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " # COMMENT LINE\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " KEY=VALUE\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " KEY=VALUE\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " # KEY equals to command line flag name: listen forward strategy...\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
|
|
|
|
fmt.Fprintf(os.Stderr, "Examples:\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -config glider.conf\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -run glider with specified config file.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -config glider.conf -rulefile office.rule -rulefile home.rule\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -run glider with specified global config file and rule config files.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen :8443\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :8443, serve as http/socks5 proxy on the same port.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen ss://AEAD_CHACHA20_POLY1305:pass@:8443\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on 0.0.0.0:8443 as a ss server.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen socks5://:1080 -verbose\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :1080 as a socks5 proxy server, in verbose mode.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen http://:8080 -forward socks5://127.0.0.1:1080\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :8080 as a http proxy server, forward all requests via socks5 server.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen redir://:1081 -forward ss://method:pass@1.1.1.1:8443\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :1081 as a transparent redirect server, forward all requests via remote ss server.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
2018-05-22 12:19:57 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen redir://:1081 -forward \"ssr://method:pass@1.1.1.1:8444?protocol=a&protocol_param=b&obfs=c&obfs_param=d\"\n")
|
2018-05-17 10:16:00 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :1081 as a transparent redirect server, forward all requests via remote ssr server.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
2018-07-12 11:22:21 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen redir://:1081 -forward \"tls://1.1.1.1:443,vmess://security:uuid@?alterID=10\"\n")
|
2018-07-24 00:45:41 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :1081 as a transparent redirect server, forward all requests via remote tls+vmess server.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen redir://:1081 -forward \"ws://1.1.1.1:80,vmess://security:uuid@?alterID=10\"\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :1081 as a transparent redirect server, forward all requests via remote ws+vmess server.\n")
|
2018-07-04 11:17:38 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen tcptun://:80=2.2.2.2:80 -forward ss://method:pass@1.1.1.1:8443\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :80 and forward all requests to 2.2.2.2:80 via remote ss server.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
2018-01-20 23:27:22 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen udptun://:53=8.8.8.8:53 -forward ss://method:pass@1.1.1.1:8443\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote ss server.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen uottun://:53=8.8.8.8:53 -forward ss://method:pass@1.1.1.1:8443\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :53 and forward all udp requests via udp over tcp tunnel.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen socks5://:1080 -listen http://:8080 -forward ss://method:pass@1.1.1.1:8443\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :1080 as socks5 server, :8080 as http proxy server, forward all requests via remote ss server.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
2018-08-01 00:36:11 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen redir://:1081 -dns=:53 -dnsserver=8.8.8.8:53 -forward ss://method:pass@server1:port1,ss://method:pass@server2:port2\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :1081 as transparent redirect server, :53 as dns server, use forward chain: server1 -> server2.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -listen socks5://:1080 -forward ss://method:pass@server1:port1 -forward ss://method:pass@server2:port2 -strategy rr\n")
|
2018-02-25 12:31:48 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :1080 as socks5 server, forward requests via server1 and server2 in round robin mode.\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
2018-08-01 00:36:11 +08:00
|
|
|
fmt.Fprintf(os.Stderr, " "+app+" -verbose -dns=:53 -dnsserver=8.8.8.8:53 -dnsrecord=www.example.com/1.2.3.4\n")
|
|
|
|
fmt.Fprintf(os.Stderr, " -listen on :53 as dns server, forward dns requests to 8.8.8.8:53, return 1.2.3.4 when resolving www.example.com.\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "\n")
|
2017-08-23 16:35:39 +08:00
|
|
|
}
|