github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgNet/kmgTransparent/TransparentListen_linux.go (about) 1 package kmgTransparent 2 3 import ( 4 "net" 5 "os" 6 7 "github.com/bronze1man/kmg/kmgNet/kmgUnix" 8 "golang.org/x/sys/unix" 9 ) 10 11 //linux transparent listen 12 //use for iptables TProxy 13 func TransparentListen(listenAddr string) (listener net.Listener, err error) { 14 s, err := unix.Socket(unix.AF_INET, unix.SOCK_STREAM, 0) 15 if err != nil { 16 return nil, err 17 } 18 defer unix.Close(s) 19 err = unix.SetsockoptInt(s, unix.SOL_IP, unix.IP_TRANSPARENT, 1) 20 if err != nil { 21 return nil, err 22 } 23 sa, err := kmgUnix.IPv4TcpAddrToUnixSocksAddr(listenAddr) 24 if err != nil { 25 return nil, err 26 } 27 err = unix.Bind(s, sa) 28 if err != nil { 29 return nil, err 30 } 31 err = unix.Listen(s, 10) 32 if err != nil { 33 return nil, err 34 } 35 f := os.NewFile(uintptr(s), "TProxy") 36 defer f.Close() 37 return net.FileListener(f) 38 }