2019-04-21 15:16:13 +00:00
|
|
|
// +build !windows
|
|
|
|
|
|
|
|
package proxy
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"strconv"
|
|
|
|
"syscall"
|
2019-08-10 03:15:25 +00:00
|
|
|
|
2020-01-08 13:57:14 +00:00
|
|
|
"ehang.io/nps/lib/common"
|
|
|
|
"ehang.io/nps/lib/conn"
|
2019-04-21 15:16:13 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func HandleTrans(c *conn.Conn, s *TunnelModeServer) error {
|
|
|
|
if addr, err := getAddress(c.Conn); err != nil {
|
|
|
|
return err
|
|
|
|
} else {
|
|
|
|
return s.DealClient(c, s.task.Client, addr, nil, common.CONN_TCP, nil, s.task.Flow, s.task.Target.LocalProxy)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const SO_ORIGINAL_DST = 80
|
|
|
|
|
|
|
|
func getAddress(conn net.Conn) (string, error) {
|
|
|
|
sysrawconn, f := conn.(syscall.Conn)
|
|
|
|
if !f {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
rawConn, err := sysrawconn.SyscallConn()
|
|
|
|
if err != nil {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
var ip string
|
|
|
|
var port uint16
|
|
|
|
err = rawConn.Control(func(fd uintptr) {
|
|
|
|
addr, err := syscall.GetsockoptIPv6Mreq(int(fd), syscall.IPPROTO_IP, SO_ORIGINAL_DST)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ip = net.IP(addr.Multiaddr[4:8]).String()
|
|
|
|
port = uint16(addr.Multiaddr[2])<<8 + uint16(addr.Multiaddr[3])
|
|
|
|
})
|
|
|
|
return ip + ":" + strconv.Itoa(int(port)), nil
|
|
|
|
}
|