forwarder: add NextDialer method so we can choose dialer by domain name (not dns server) in dns proxy

This commit is contained in:
nadoo 2017-08-23 17:45:57 +08:00
parent 652d49182a
commit cba2f36b08
8 changed files with 19 additions and 18 deletions

1
.gitignore vendored
View File

@ -19,6 +19,7 @@
/*.rule
rules.d/*.rule
rules.d/*.list
glider
bak/

View File

@ -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)

View File

@ -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

View File

@ -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 }

2
dns.go
View File

@ -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

View File

@ -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
}

13
rule.go
View File

@ -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)
}

View File

@ -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)