// https://tools.ietf.org/html/rfc1035 package dnstun import ( "net/url" "strings" "github.com/nadoo/glider/common/log" "github.com/nadoo/glider/dns" "github.com/nadoo/glider/proxy" "github.com/nadoo/glider/proxy/tcptun" ) // DNSTun struct type DNSTun struct { dialer proxy.Dialer addr string raddr string dns *dns.DNS tcp *tcptun.TCPTun } func init() { proxy.RegisterServer("dnstun", NewDNSTunServer) } // NewDNSTun returns a dns tunnel forwarder. func NewDNSTun(s string, dialer proxy.Dialer) (*DNSTun, error) { u, err := url.Parse(s) if err != nil { log.F("parse err: %s", err) return nil, err } addr := u.Host d := strings.Split(addr, "=") addr, raddr := d[0], d[1] p := &DNSTun{ dialer: dialer, addr: addr, raddr: raddr, } p.dns, _ = dns.NewDNS(addr, raddr, dialer, true) return p, nil } // NewDNSTunServer returns a dns tunnel server. func NewDNSTunServer(s string, dialer proxy.Dialer) (proxy.Server, error) { return NewDNSTun(s, dialer) } // ListenAndServe . func (s *DNSTun) ListenAndServe() { if s.dns != nil { go s.dns.ListenAndServe() } }