mirror of https://github.com/ehang-io/nps
parent
f6c596f318
commit
2912246572
|
@ -13,7 +13,6 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"syscall"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type TunnelModeServer struct {
|
type TunnelModeServer struct {
|
||||||
|
@ -115,35 +114,3 @@ func ProcessHttp(c *conn.Conn, s *TunnelModeServer) error {
|
||||||
}
|
}
|
||||||
return s.DealClient(c, s.task.Client, addr, rb, common.CONN_TCP, nil, s.task.Flow, s.task.Target.LocalProxy)
|
return s.DealClient(c, s.task.Client, addr, rb, common.CONN_TCP, nil, s.task.Flow, s.task.Target.LocalProxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package proxy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cnlh/nps/lib/common"
|
||||||
|
"github.com/cnlh/nps/lib/conn"
|
||||||
|
"net"
|
||||||
|
"strconv"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package proxy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cnlh/nps/lib/conn"
|
||||||
|
)
|
||||||
|
|
||||||
|
func HandleTrans(c *conn.Conn, s *TunnelModeServer) error {
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue