transport.go 961 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // +build !windows
  2. package proxy
  3. import (
  4. "net"
  5. "strconv"
  6. "syscall"
  7. "ehang.io/nps/lib/common"
  8. "ehang.io/nps/lib/conn"
  9. )
  10. func HandleTrans(c *conn.Conn, s *TunnelModeServer) error {
  11. if addr, err := getAddress(c.Conn); err != nil {
  12. return err
  13. } else {
  14. return s.DealClient(c, s.task.Client, addr, nil, common.CONN_TCP, nil, s.task.Flow, s.task.Target.LocalProxy)
  15. }
  16. }
  17. const SO_ORIGINAL_DST = 80
  18. func getAddress(conn net.Conn) (string, error) {
  19. sysrawconn, f := conn.(syscall.Conn)
  20. if !f {
  21. return "", nil
  22. }
  23. rawConn, err := sysrawconn.SyscallConn()
  24. if err != nil {
  25. return "", nil
  26. }
  27. var ip string
  28. var port uint16
  29. err = rawConn.Control(func(fd uintptr) {
  30. addr, err := syscall.GetsockoptIPv6Mreq(int(fd), syscall.IPPROTO_IP, SO_ORIGINAL_DST)
  31. if err != nil {
  32. return
  33. }
  34. ip = net.IP(addr.Multiaddr[4:8]).String()
  35. port = uint16(addr.Multiaddr[2])<<8 + uint16(addr.Multiaddr[3])
  36. })
  37. return ip + ":" + strconv.Itoa(int(port)), nil
  38. }