mirror of
				https://github.com/nadoo/glider.git
				synced 2025-11-04 07:42:38 +08:00 
			
		
		
		
	dns: add a parameter in dns struct to identify tunnel
This commit is contained in:
		
							parent
							
								
									238702f159
								
							
						
					
					
						commit
						d2d49e7d2e
					
				
							
								
								
									
										43
									
								
								dns.go
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								dns.go
									
									
									
									
									
								
							@ -4,6 +4,8 @@ package main
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/binary"
 | 
						"encoding/binary"
 | 
				
			||||||
 | 
						"encoding/hex"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
@ -56,6 +58,8 @@ type DNS struct {
 | 
				
			|||||||
	*Forwarder        // as proxy client
 | 
						*Forwarder        // as proxy client
 | 
				
			||||||
	sDialer    Dialer // dialer for server
 | 
						sDialer    Dialer // dialer for server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tunnel bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dnsServer string
 | 
						dnsServer string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dnsServerMap   map[string]string
 | 
						dnsServerMap   map[string]string
 | 
				
			||||||
@ -63,11 +67,13 @@ type DNS struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewDNS returns a dns forwarder. client[dns.udp] -> glider[tcp] -> forwarder[dns.tcp] -> remote dns addr
 | 
					// NewDNS returns a dns forwarder. client[dns.udp] -> glider[tcp] -> forwarder[dns.tcp] -> remote dns addr
 | 
				
			||||||
func NewDNS(addr, raddr string, sDialer Dialer) (*DNS, error) {
 | 
					func NewDNS(addr, raddr string, sDialer Dialer, tunnel bool) (*DNS, error) {
 | 
				
			||||||
	s := &DNS{
 | 
						s := &DNS{
 | 
				
			||||||
		Forwarder: NewForwarder(addr, nil),
 | 
							Forwarder: NewForwarder(addr, nil),
 | 
				
			||||||
		sDialer:   sDialer,
 | 
							sDialer:   sDialer,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							tunnel: tunnel,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		dnsServer:    raddr,
 | 
							dnsServer:    raddr,
 | 
				
			||||||
		dnsServerMap: make(map[string]string),
 | 
							dnsServerMap: make(map[string]string),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -90,7 +96,7 @@ func (s *DNS) ListenAndServeUDP() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer c.Close()
 | 
						defer c.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logf("proxy-dns listening UDP on %s", s.addr)
 | 
						logf("proxy-dns listening on udp:%s", s.addr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		data := make([]byte, DNSUDPMaxLen)
 | 
							data := make([]byte, DNSUDPMaxLen)
 | 
				
			||||||
@ -107,9 +113,9 @@ func (s *DNS) ListenAndServeUDP() {
 | 
				
			|||||||
			query := parseQuery(data)
 | 
								query := parseQuery(data)
 | 
				
			||||||
			domain := query.DomainName
 | 
								domain := query.DomainName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			dnsServer := s.dnsServer
 | 
								dnsServer := s.GetServer(domain)
 | 
				
			||||||
			if dnsServer == "" {
 | 
								if s.tunnel {
 | 
				
			||||||
				dnsServer = s.GetServer(domain)
 | 
									dnsServer = s.dnsServer
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rc, err := s.sDialer.NextDialer(domain+":53").Dial("tcp", dnsServer)
 | 
								rc, err := s.sDialer.NextDialer(domain+":53").Dial("tcp", dnsServer)
 | 
				
			||||||
@ -122,6 +128,7 @@ func (s *DNS) ListenAndServeUDP() {
 | 
				
			|||||||
			// 2 bytes length after tcp header, before dns message
 | 
								// 2 bytes length after tcp header, before dns message
 | 
				
			||||||
			reqLen := make([]byte, 2)
 | 
								reqLen := make([]byte, 2)
 | 
				
			||||||
			binary.BigEndian.PutUint16(reqLen, uint16(len(data)))
 | 
								binary.BigEndian.PutUint16(reqLen, uint16(len(data)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rc.Write(reqLen)
 | 
								rc.Write(reqLen)
 | 
				
			||||||
			rc.Write(data)
 | 
								rc.Write(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -187,7 +194,7 @@ func (s *DNS) ListenAndServeTCP() {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logf("proxy-dns-tcp listening TCP on %s", s.addr)
 | 
						logf("proxy-dns-tcp listening on tcp:%s", s.addr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		c, err := l.Accept()
 | 
							c, err := l.Accept()
 | 
				
			||||||
@ -223,9 +230,9 @@ func (s *DNS) ServeTCP(c net.Conn) {
 | 
				
			|||||||
	query := parseQuery(reqMsg)
 | 
						query := parseQuery(reqMsg)
 | 
				
			||||||
	domain := query.DomainName
 | 
						domain := query.DomainName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dnsServer := s.dnsServer
 | 
						dnsServer := s.GetServer(domain)
 | 
				
			||||||
	if dnsServer == "" {
 | 
						if s.tunnel {
 | 
				
			||||||
		dnsServer = s.GetServer(domain)
 | 
							dnsServer = s.dnsServer
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rc, err := s.sDialer.NextDialer(domain+":53").Dial("tcp", dnsServer)
 | 
						rc, err := s.sDialer.NextDialer(domain+":53").Dial("tcp", dnsServer)
 | 
				
			||||||
@ -235,8 +242,12 @@ func (s *DNS) ServeTCP(c net.Conn) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer rc.Close()
 | 
						defer rc.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	binary.Write(rc, binary.BigEndian, reqLen)
 | 
						if err := binary.Write(rc, binary.BigEndian, reqLen); err != nil {
 | 
				
			||||||
	binary.Write(rc, binary.BigEndian, reqMsg)
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := binary.Write(rc, binary.BigEndian, reqMsg); err != nil {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var respLen uint16
 | 
						var respLen uint16
 | 
				
			||||||
	if err := binary.Read(rc, binary.BigEndian, &respLen); err != nil {
 | 
						if err := binary.Read(rc, binary.BigEndian, &respLen); err != nil {
 | 
				
			||||||
@ -251,6 +262,8 @@ func (s *DNS) ServeTCP(c net.Conn) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Printf("dns resp len %d:\n%s\n\n", respLen, hex.Dump(respMsg[:]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var ip string
 | 
						var ip string
 | 
				
			||||||
	if respLen > 0 {
 | 
						if respLen > 0 {
 | 
				
			||||||
		query := parseQuery(respMsg)
 | 
							query := parseQuery(respMsg)
 | 
				
			||||||
@ -270,8 +283,12 @@ func (s *DNS) ServeTCP(c net.Conn) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		binary.Write(c, binary.BigEndian, respLen)
 | 
							if err := binary.Write(c, binary.BigEndian, respLen); err != nil {
 | 
				
			||||||
		binary.Write(c, binary.BigEndian, respMsg)
 | 
								logf("proxy-dns-tcp error in local write respLen: %s\n", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if err := binary.Write(c, binary.BigEndian, respMsg); err != nil {
 | 
				
			||||||
 | 
								logf("proxy-dns-tcp error in local write respMsg: %s\n", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logf("proxy-dns-tcp %s <-> %s, type: %d, %s: %s", c.RemoteAddr(), dnsServer, query.QueryType, domain, ip)
 | 
						logf("proxy-dns-tcp %s <-> %s, type: %d, %s: %s", c.RemoteAddr(), dnsServer, query.QueryType, domain, ip)
 | 
				
			||||||
 | 
				
			|||||||
@ -22,7 +22,7 @@ func NewDNSTun(addr, raddr string, sDialer Dialer) (*DNSTun, error) {
 | 
				
			|||||||
		raddr: raddr,
 | 
							raddr: raddr,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	s.dns, _ = NewDNS(addr, raddr, sDialer)
 | 
						s.dns, _ = NewDNS(addr, raddr, sDialer, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return s, nil
 | 
						return s, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								main.go
									
									
									
									
									
								
							@ -49,16 +49,16 @@ func main() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if conf.DNS != "" {
 | 
						if conf.DNS != "" {
 | 
				
			||||||
		dns, err := NewDNS(conf.DNS, conf.DNSServer[0], sDialer)
 | 
							dns, err := NewDNS(conf.DNS, conf.DNSServer[0], sDialer, false)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Fatal(err)
 | 
								log.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// rule
 | 
							// rule
 | 
				
			||||||
		for _, fwdr := range conf.rules {
 | 
							for _, r := range conf.rules {
 | 
				
			||||||
			for _, domain := range fwdr.Domain {
 | 
								for _, domain := range r.Domain {
 | 
				
			||||||
				if len(fwdr.DNSServer) > 0 {
 | 
									if len(r.DNSServer) > 0 {
 | 
				
			||||||
					dns.SetServer(domain, fwdr.DNSServer[0])
 | 
										dns.SetServer(domain, r.DNSServer[0])
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user