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  }