From 38c7391ceb40f5fcefa5bf6ace5dc76abc0df2de Mon Sep 17 00:00:00 2001 From: wweir Date: Wed, 11 Aug 2021 06:48:18 +0800 Subject: [PATCH] 1. add comments, 2. optimize text message --- cmd/sower/main.go | 15 +++++++-------- cmd/sowerd/main.go | 3 +++ router/dns.go | 2 ++ router/ping.go | 1 + router/router.go | 7 ++++--- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/cmd/sower/main.go b/cmd/sower/main.go index 2564aaa..c8ddcdc 100644 --- a/cmd/sower/main.go +++ b/cmd/sower/main.go @@ -26,7 +26,7 @@ var ( conf = struct { Remote struct { - Type string `default:"sower" required:"true" usage:"optional: sower/trojan/socks5"` + Type string `default:"sower" required:"true" usage:"option: sower/trojan/socks5"` Addr string `required:"true" usage:"proxy address, eg: proxy.com/127.0.0.1:7890"` Password string `usage:"remote proxy password"` } @@ -44,24 +44,24 @@ var ( Router struct { Block struct { File string `usage:"block list file, local file or remote"` - FilePrefix string `default:"**." usage:"parsed as 'prefix.line_text'"` + FilePrefix string `default:"**." usage:"parsed as 'line_text'"` Rules []string `usage:"block list rules"` } Direct struct { File string `usage:"direct list file, local file or remote"` - FilePrefix string `default:"**." usage:"parsed as 'prefix.line_text'"` + FilePrefix string `default:"**." usage:"parsed as 'line_text'"` Rules []string `usage:"direct list rules"` } Proxy struct { File string `usage:"proxy list file, local file or remote"` - FilePrefix string `default:"**." usage:"parsed as 'prefix.line_text'"` + FilePrefix string `default:"**." usage:"parsed as 'line_text'"` Rules []string `usage:"proxy list rules"` } Country struct { MMDB string `usage:"mmdb file"` File string `usage:"CIDR block list file, local file or remote"` - FilePrefix string `default:"" usage:"parsed as 'prefix.line_text'"` + FilePrefix string `default:"" usage:"parsed as 'line_text'"` Rules []string `usage:"CIDR list rules"` } } @@ -117,11 +117,10 @@ func main() { } go ServeHTTPS(lnHTTPS, r) - addr := net.JoinHostPort(conf.DNS.Serve, "53") log.Info(). - Str("listen_on", addr). + Str("listen_on", conf.DNS.Serve). Msg("DNS proxy started") - if err := dns.ListenAndServe(addr, "udp", r); err != nil { + if err := dns.ListenAndServe(net.JoinHostPort(conf.DNS.Serve, "53"), "udp", r); err != nil { log.Fatal().Err(err).Msg("serve dns") } }() diff --git a/cmd/sowerd/main.go b/cmd/sowerd/main.go index 1d32030..8dbd072 100644 --- a/cmd/sowerd/main.go +++ b/cmd/sowerd/main.go @@ -119,6 +119,7 @@ func serve443(ln net.Listener, fakeSite string, sower *sower.Sower, trojan *troj Msgf("relay conn to %s", addr) }() + // 1. detect if it's a sower underlaying connection teeconn.Reread() if addr, err = sower.Unwrap(teeconn); err == nil { teeconn.Stop() @@ -127,6 +128,7 @@ func serve443(ln net.Listener, fakeSite string, sower *sower.Sower, trojan *troj return } + // 2. detect if it's a trojan underlaying connection teeconn.Reread() if addr, err = trojan.Unwrap(teeconn); err == nil { teeconn.Stop() @@ -135,6 +137,7 @@ func serve443(ln net.Listener, fakeSite string, sower *sower.Sower, trojan *troj return } + // 3. fallback to fake site teeconn.Stop().Reread() dur, err = util.RelayTo(teeconn, fakeSite) } diff --git a/router/dns.go b/router/dns.go index 5b3a041..5632e64 100644 --- a/router/dns.go +++ b/router/dns.go @@ -16,6 +16,7 @@ func (r *Router) ServeDNS(w dns.ResponseWriter, req *dns.Msg) { } domain := req.Question[0].Name + // 1. rule_based( block > direct > proxy ) switch { case r.blockRule.Match(domain): _ = w.WriteMsg(r.dnsFail(req, dns.RcodeNameError)) @@ -28,6 +29,7 @@ func (r *Router) ServeDNS(w dns.ResponseWriter, req *dns.Msg) { return } + // 2. direct with cache, do not fallback to proxy to avoid side-effect c := &dnsCache{Router: r, Req: req} if err := r.dns.cache.Remember(c, req.Question[0].String()); err != nil { _ = w.WriteMsg(r.dnsFail(req, dns.RcodeServerFailure)) diff --git a/router/ping.go b/router/ping.go index 65662c5..45580b3 100644 --- a/router/ping.go +++ b/router/ping.go @@ -30,6 +30,7 @@ type ping struct { } func (p *ping) Fulfill(key string) error { + // just like `curl -I http://domain.com:80` _, err := pingClient.Head(net.JoinHostPort(key, "80")) deferlog.Std.DebugWarn(err). Str("domain", key). diff --git a/router/router.go b/router/router.go index 006ec60..d1b5629 100644 --- a/router/router.go +++ b/router/router.go @@ -107,6 +107,9 @@ func (r *Router) RouteHandle(conn net.Conn, domain string, port uint16) (err err addr := net.JoinHostPort(domain, strconv.FormatUint(uint64(port), 10)) + // 1. rule_based( block > direct > proxy ) + // 2. detect_based( CN IP || access site ) + // 3. fallback( proxy ) switch { case r.blockRule.Match(domain): return nil @@ -117,9 +120,7 @@ func (r *Router) RouteHandle(conn net.Conn, domain string, port uint16) (err err case r.proxyRule.Match(domain): return r.ProxyHandle(conn, domain, port) - case r.localSite(domain): - return r.DirectHandle(conn, addr) - case r.isAccess(domain, port): + case r.localSite(domain), r.isAccess(domain, port): return r.DirectHandle(conn, addr) default: return r.ProxyHandle(conn, domain, port)