mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 01:15:41 +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
|
||||
|
||||
rules.d/*.rule
|
||||
rules.d/*.list
|
||||
|
||||
glider
|
||||
bak/
|
||||
|
6
conf.go
6
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)
|
||||
|
@ -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
|
||||
|
@ -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
2
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
|
||||
|
@ -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
13
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)
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user