diff --git a/features_linux.go b/features_linux.go index 636e616..87c6457 100644 --- a/features_linux.go +++ b/features_linux.go @@ -2,4 +2,5 @@ package main import ( _ "github.com/nadoo/glider/proxy/redir" + // _ "github.com/nadoo/glider/proxy/tproxy" ) diff --git a/proxy/tproxy/tproxy.go b/proxy/tproxy/tproxy_linux.go similarity index 72% rename from proxy/tproxy/tproxy.go rename to proxy/tproxy/tproxy_linux.go index cefae56..d4a4595 100644 --- a/proxy/tproxy/tproxy.go +++ b/proxy/tproxy/tproxy_linux.go @@ -1,34 +1,53 @@ -// +build linux - // ref: https://www.kernel.org/doc/Documentation/networking/tproxy.txt // @LiamHaworth: https://github.com/LiamHaworth/go-tproxy/blob/master/tproxy_udp.go -package main +package tproxy import ( "bytes" "encoding/binary" "fmt" "net" + "net/url" "strconv" "syscall" "unsafe" + + "github.com/nadoo/glider/common/log" + "github.com/nadoo/glider/proxy" ) // TProxy struct type TProxy struct { - dialer Dialer + dialer proxy.Dialer addr string } +func init() { + proxy.RegisterServer("tproxy", NewTProxyServer) +} + // NewTProxy returns a tproxy. -func NewTProxy(addr string, dialer Dialer) (*TProxy, error) { - s := &TProxy{ +func NewTProxy(s string, dialer proxy.Dialer) (*TProxy, error) { + u, err := url.Parse(s) + if err != nil { + log.F("parse err: %s", err) + return nil, err + } + + addr := u.Host + + p := &TProxy{ dialer: dialer, addr: addr, } - return s, nil + return p, nil +} + +// NewTProxyServer returns a udp tunnel server. +func NewTProxyServer(s string, dialer proxy.Dialer) (proxy.Server, error) { + return NewTProxy(s, dialer) } // ListenAndServe . @@ -39,26 +58,26 @@ func (s *TProxy) ListenAndServe() { // ListenAndServeTCP . func (s *TProxy) ListenAndServeTCP() { - logf("proxy-tproxy tcp mode not supported now, please use 'redir' instead") + log.F("proxy-tproxy tcp mode not supported now, please use 'redir' instead") } // ListenAndServeUDP . func (s *TProxy) ListenAndServeUDP() { laddr, err := net.ResolveUDPAddr("udp", s.addr) if err != nil { - logf("proxy-tproxy failed to resolve addr %s: %v", s.addr, err) + log.F("proxy-tproxy failed to resolve addr %s: %v", s.addr, err) return } lc, err := net.ListenUDP("udp", laddr) if err != nil { - logf("proxy-tproxy failed to listen on %s: %v", s.addr, err) + log.F("proxy-tproxy failed to listen on %s: %v", s.addr, err) return } fd, err := lc.File() if err != nil { - logf("proxy-tproxy failed to get file descriptor: %v", err) + log.F("proxy-tproxy failed to get file descriptor: %v", err) return } defer fd.Close() @@ -66,13 +85,13 @@ func (s *TProxy) ListenAndServeUDP() { fileDescriptor := int(fd.Fd()) if err = syscall.SetsockoptInt(fileDescriptor, syscall.SOL_IP, syscall.IP_TRANSPARENT, 1); err != nil { syscall.Close(fileDescriptor) - logf("proxy-tproxy failed to set socket option IP_TRANSPARENT: %v", err) + log.F("proxy-tproxy failed to set socket option IP_TRANSPARENT: %v", err) return } if err = syscall.SetsockoptInt(fileDescriptor, syscall.SOL_IP, syscall.IP_RECVORIGDSTADDR, 1); err != nil { syscall.Close(fileDescriptor) - logf("proxy-tproxy failed to set socket option IP_RECVORIGDSTADDR: %v", err) + log.F("proxy-tproxy failed to set socket option IP_RECVORIGDSTADDR: %v", err) return } @@ -81,15 +100,15 @@ func (s *TProxy) ListenAndServeUDP() { _, srcAddr, dstAddr, err := ReadFromUDP(lc, buf) if err != nil { if netErr, ok := err.(net.Error); ok && netErr.Temporary() { - logf("proxy-tproxy temporary reading data error: %s", netErr) + log.F("proxy-tproxy temporary reading data error: %s", netErr) continue } - logf("proxy-tproxy Unrecoverable error while reading data: %s", err) + log.F("proxy-tproxy Unrecoverable error while reading data: %s", err) continue } - logf("proxy-tproxy Accepting UDP connection from %s with destination of %s", srcAddr.String(), dstAddr.String()) + log.F("proxy-tproxy Accepting UDP connection from %s with destination of %s", srcAddr.String(), dstAddr.String()) } diff --git a/proxy/tproxy/tproxy_other.go b/proxy/tproxy/tproxy_other.go deleted file mode 100644 index f5dbaeb..0000000 --- a/proxy/tproxy/tproxy_other.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build !linux - -package main - -import ( - "errors" - "log" -) - -// TProxy struct -type TProxy struct{} - -// NewTProxy returns a tproxy. -func NewTProxy(addr string, sDialer Dialer) (*TProxy, error) { - return nil, errors.New("tproxy not supported on this os") -} - -// ListenAndServe . -func (s *TProxy) ListenAndServe() { - log.Fatal("tproxy not supported on this os") -}