mirror of
				https://github.com/nadoo/glider.git
				synced 2025-11-03 23:32:37 +08:00 
			
		
		
		
	forwarder: add NextDialer method so we can choose dialer by domain name (not dns server) in dns proxy
This commit is contained in:
		
							parent
							
								
									652d49182a
								
							
						
					
					
						commit
						cba2f36b08
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -19,6 +19,7 @@
 | 
				
			|||||||
/*.rule
 | 
					/*.rule
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rules.d/*.rule
 | 
					rules.d/*.rule
 | 
				
			||||||
 | 
					rules.d/*.list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
glider
 | 
					glider
 | 
				
			||||||
bak/
 | 
					bak/
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								conf.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								conf.go
									
									
									
									
									
								
							@ -79,6 +79,8 @@ func confInit() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// RuleConf , every ruleForwarder points to a rule file
 | 
					// RuleConf , every ruleForwarder points to a rule file
 | 
				
			||||||
type RuleConf struct {
 | 
					type RuleConf struct {
 | 
				
			||||||
 | 
						name string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Forward       []string
 | 
						Forward       []string
 | 
				
			||||||
	Strategy      string
 | 
						Strategy      string
 | 
				
			||||||
	CheckWebSite  string
 | 
						CheckWebSite  string
 | 
				
			||||||
@ -90,8 +92,6 @@ type RuleConf struct {
 | 
				
			|||||||
	Domain []string
 | 
						Domain []string
 | 
				
			||||||
	IP     []string
 | 
						IP     []string
 | 
				
			||||||
	CIDR   []string
 | 
						CIDR   []string
 | 
				
			||||||
 | 
					 | 
				
			||||||
	name string
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewRuleConfFromFile .
 | 
					// NewRuleConfFromFile .
 | 
				
			||||||
@ -111,6 +111,8 @@ func NewRuleConfFromFile(ruleFile string) (*RuleConf, error) {
 | 
				
			|||||||
	f.StringSliceUniqVar(&p.IP, "ip", nil, "ip")
 | 
						f.StringSliceUniqVar(&p.IP, "ip", nil, "ip")
 | 
				
			||||||
	f.StringSliceUniqVar(&p.CIDR, "cidr", nil, "cidr")
 | 
						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()
 | 
						err := f.Parse()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "ERROR: %s\n", err)
 | 
							fmt.Fprintf(os.Stderr, "ERROR: %s\n", err)
 | 
				
			||||||
 | 
				
			|||||||
@ -13,6 +13,9 @@ type Dialer interface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Dial connects to the given address via the proxy.
 | 
						// Dial connects to the given address via the proxy.
 | 
				
			||||||
	Dial(network, addr string) (c net.Conn, err error)
 | 
						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
 | 
					// DialerFromURL parses url and get a Proxy
 | 
				
			||||||
 | 
				
			|||||||
@ -18,3 +18,5 @@ func (d *direct) Dial(network, addr string) (net.Conn, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return c, err
 | 
						return c, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (d *direct) NextDialer(dstAddr string) Dialer { return d }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								dns.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								dns.go
									
									
									
									
									
								
							@ -105,7 +105,7 @@ func (s *DNS) ListenAndServe() {
 | 
				
			|||||||
			dnsServer := s.GetServer(domain)
 | 
								dnsServer := s.GetServer(domain)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// TODO: check here; ADD dnsServer to rule ip lists
 | 
								// 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 {
 | 
								if err != nil {
 | 
				
			||||||
				logf("failed to connect to server %v: %v", dnsServer, err)
 | 
									logf("failed to connect to server %v: %v", dnsServer, err)
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
 | 
				
			|||||||
@ -22,3 +22,7 @@ func (p *Forwarder) Addr() string { return p.addr }
 | 
				
			|||||||
func (p *Forwarder) Dial(network, addr string) (net.Conn, error) {
 | 
					func (p *Forwarder) Dial(network, addr string) (net.Conn, error) {
 | 
				
			||||||
	return p.cDialer.Dial(network, addr)
 | 
						return p.cDialer.Dial(network, addr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p *Forwarder) NextDialer(dstAddr string) Dialer {
 | 
				
			||||||
 | 
						return p.cDialer
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										13
									
								
								rule.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								rule.go
									
									
									
									
									
								
							@ -50,16 +50,6 @@ func NewRuleDialer(rules []*RuleConf, gDialer Dialer) Dialer {
 | 
				
			|||||||
			rd.ipMap[ip] = sd
 | 
								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)
 | 
							rd.cidrMap = make(map[string]Dialer)
 | 
				
			||||||
		for _, cidr := range r.CIDR {
 | 
							for _, cidr := range r.CIDR {
 | 
				
			||||||
			rd.cidrMap[cidr] = sd
 | 
								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) {
 | 
					func (rd *RuleDialer) Dial(network, addr string) (net.Conn, error) {
 | 
				
			||||||
	d := rd.NextDialer(addr)
 | 
						return rd.NextDialer(addr).Dial(network, addr)
 | 
				
			||||||
	return d.Dial(network, addr)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -62,10 +62,10 @@ func newRRDialer(dialers []Dialer, website string, duration int) *rrDialer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (rr *rrDialer) Addr() string { return "STRATEGY" }
 | 
					func (rr *rrDialer) Addr() string { return "STRATEGY" }
 | 
				
			||||||
func (rr *rrDialer) Dial(network, addr string) (net.Conn, error) {
 | 
					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)
 | 
						n := len(rr.dialers)
 | 
				
			||||||
	if n == 1 {
 | 
						if n == 1 {
 | 
				
			||||||
		rr.idx = 0
 | 
							rr.idx = 0
 | 
				
			||||||
@ -149,7 +149,7 @@ func (ha *haDialer) Dial(network, addr string) (net.Conn, error) {
 | 
				
			|||||||
	d := ha.dialers[ha.idx]
 | 
						d := ha.dialers[ha.idx]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !ha.status[ha.idx] {
 | 
						if !ha.status[ha.idx] {
 | 
				
			||||||
		d = ha.NextDialer()
 | 
							d = ha.NextDialer(addr)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return d.Dial(network, addr)
 | 
						return d.Dial(network, addr)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user