mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 09:25: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
|
/*.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