diff --git a/.gitignore b/.gitignore index 3709d49..e16b335 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ /*.rule rules.d/*.rule +rules.d/*.list glider bak/ diff --git a/conf.go b/conf.go index 89bab55..07c979e 100644 --- a/conf.go +++ b/conf.go @@ -79,6 +79,8 @@ func confInit() { // RuleConf , every ruleForwarder points to a rule file type RuleConf struct { + name string + Forward []string Strategy string CheckWebSite string @@ -90,8 +92,6 @@ type RuleConf struct { Domain []string IP []string CIDR []string - - name string } // NewRuleConfFromFile . @@ -111,6 +111,8 @@ func NewRuleConfFromFile(ruleFile string) (*RuleConf, error) { f.StringSliceUniqVar(&p.IP, "ip", nil, "ip") f.StringSliceUniqVar(&p.CIDR, "cidr", nil, "cidr") + // f.StringSliceUniqVar(&p.Include, "include", nil, "include file path(eg: you can include a domain list file)") + err := f.Parse() if err != nil { fmt.Fprintf(os.Stderr, "ERROR: %s\n", err) diff --git a/dialer.go b/dialer.go index 71c3ff9..0296667 100644 --- a/dialer.go +++ b/dialer.go @@ -13,6 +13,9 @@ type Dialer interface { // Dial connects to the given address via the proxy. Dial(network, addr string) (c net.Conn, err error) + + // Get the dialer by dstAddr + NextDialer(dstAddr string) Dialer } // DialerFromURL parses url and get a Proxy diff --git a/direct.go b/direct.go index 59b03b2..fa1e74e 100644 --- a/direct.go +++ b/direct.go @@ -18,3 +18,5 @@ func (d *direct) Dial(network, addr string) (net.Conn, error) { } return c, err } + +func (d *direct) NextDialer(dstAddr string) Dialer { return d } diff --git a/dns.go b/dns.go index 66cecf1..908dd76 100644 --- a/dns.go +++ b/dns.go @@ -105,7 +105,7 @@ func (s *DNS) ListenAndServe() { dnsServer := s.GetServer(domain) // TODO: check here; ADD dnsServer to rule ip lists - rc, err := s.sDialer.Dial("tcp", dnsServer) + rc, err := s.sDialer.NextDialer(domain+":53").Dial("tcp", dnsServer) if err != nil { logf("failed to connect to server %v: %v", dnsServer, err) return diff --git a/forwarder.go b/forwarder.go index ffb1a80..cc72f16 100644 --- a/forwarder.go +++ b/forwarder.go @@ -22,3 +22,7 @@ func (p *Forwarder) Addr() string { return p.addr } func (p *Forwarder) Dial(network, addr string) (net.Conn, error) { return p.cDialer.Dial(network, addr) } + +func (p *Forwarder) NextDialer(dstAddr string) Dialer { + return p.cDialer +} diff --git a/rule.go b/rule.go index 55f76d9..9f87d32 100644 --- a/rule.go +++ b/rule.go @@ -50,16 +50,6 @@ func NewRuleDialer(rules []*RuleConf, gDialer Dialer) Dialer { rd.ipMap[ip] = sd } - // dnsserver should use rule forwarder too - for _, dnss := range r.DNSServer { - ip, _, err := net.SplitHostPort(dnss) - if err != nil { - logf("SplitHostPort ERROR: %s", err) - continue - } - rd.ipMap[ip] = sd - } - rd.cidrMap = make(map[string]Dialer) for _, cidr := range r.CIDR { rd.cidrMap[cidr] = sd @@ -114,6 +104,5 @@ func (p *RuleDialer) NextDialer(dstAddr string) Dialer { } func (rd *RuleDialer) Dial(network, addr string) (net.Conn, error) { - d := rd.NextDialer(addr) - return d.Dial(network, addr) + return rd.NextDialer(addr).Dial(network, addr) } diff --git a/strategy.go b/strategy.go index 02371ed..312f5d8 100644 --- a/strategy.go +++ b/strategy.go @@ -62,10 +62,10 @@ func newRRDialer(dialers []Dialer, website string, duration int) *rrDialer { func (rr *rrDialer) Addr() string { return "STRATEGY" } func (rr *rrDialer) Dial(network, addr string) (net.Conn, error) { - return rr.NextDialer().Dial(network, addr) + return rr.NextDialer(addr).Dial(network, addr) } -func (rr *rrDialer) NextDialer() Dialer { +func (rr *rrDialer) NextDialer(dstAddr string) Dialer { n := len(rr.dialers) if n == 1 { rr.idx = 0 @@ -149,7 +149,7 @@ func (ha *haDialer) Dial(network, addr string) (net.Conn, error) { d := ha.dialers[ha.idx] if !ha.status[ha.idx] { - d = ha.NextDialer() + d = ha.NextDialer(addr) } return d.Dial(network, addr)