1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- // +build !windows
- package proxy
- import (
- "net"
- "strconv"
- "syscall"
- "ehang.io/nps/lib/common"
- "ehang.io/nps/lib/conn"
- )
- 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
- }
|