|
|
|
@ -5,11 +5,15 @@ import ( |
|
|
|
"github.com/golang/glog" |
|
|
|
"net" |
|
|
|
"strings" |
|
|
|
"time" |
|
|
|
) |
|
|
|
|
|
|
|
func handleTcpForward(conn net.Conn, arg Args) { |
|
|
|
defer conn.Close() |
|
|
|
glog.V(LINFO).Infof("[tcp-forward] %s -> %s", conn.RemoteAddr(), arg.Forward) |
|
|
|
if !strings.Contains(arg.Forward, ":") { |
|
|
|
arg.Forward += ":22" // default is ssh service
|
|
|
|
} |
|
|
|
glog.V(LINFO).Infof("[tcp-forward] %s - %s", conn.RemoteAddr(), arg.Forward) |
|
|
|
c, err := Connect(arg.Forward) |
|
|
|
if err != nil { |
|
|
|
glog.V(LWARNING).Infof("[tcp-forward] %s -> %s : %s", conn.RemoteAddr(), arg.Forward, err) |
|
|
|
@ -24,9 +28,48 @@ func handleTcpForward(conn net.Conn, arg Args) { |
|
|
|
|
|
|
|
func handleUdpForward(conn *net.UDPConn, raddr *net.UDPAddr, data []byte, arg Args) { |
|
|
|
if !strings.Contains(arg.Forward, ":") { |
|
|
|
arg.Forward += ":53" |
|
|
|
arg.Forward += ":53" // default is dns service
|
|
|
|
} |
|
|
|
|
|
|
|
faddr, err := net.ResolveUDPAddr("udp", arg.Forward) |
|
|
|
if err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s -> %s : %s", raddr, arg.Forward, err) |
|
|
|
return |
|
|
|
} |
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s -> %s", raddr, arg.Forward) |
|
|
|
|
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s - %s", raddr, faddr) |
|
|
|
|
|
|
|
if len(forwardArgs) == 0 { |
|
|
|
lconn, err := net.ListenUDP("udp", nil) |
|
|
|
if err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s -> %s : %s", raddr, arg.Forward, err) |
|
|
|
return |
|
|
|
} |
|
|
|
defer lconn.Close() |
|
|
|
|
|
|
|
if _, err := lconn.WriteToUDP(data, faddr); err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s -> %s : %s", raddr, arg.Forward, err) |
|
|
|
return |
|
|
|
} |
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s >>> %s length %d", raddr, arg.Forward, len(data)) |
|
|
|
|
|
|
|
b := udpPool.Get().([]byte) |
|
|
|
defer udpPool.Put(b) |
|
|
|
lconn.SetReadDeadline(time.Now().Add(time.Second * 60)) |
|
|
|
n, addr, err := lconn.ReadFromUDP(b) |
|
|
|
if err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s <- %s : %s", raddr, arg.Forward, err) |
|
|
|
return |
|
|
|
} |
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s <<< %s length %d", raddr, addr, n) |
|
|
|
|
|
|
|
if _, err := conn.WriteToUDP(b[:n], raddr); err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s <- %s : %s", raddr, arg.Forward, err) |
|
|
|
} |
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s >-< %s DONE", raddr, arg.Forward) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
fconn, _, err := forwardChain(forwardArgs...) |
|
|
|
if err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s -> %s : %s", raddr, arg.Forward, err) |
|
|
|
@ -58,27 +101,27 @@ func handleUdpForward(conn *net.UDPConn, raddr *net.UDPAddr, data []byte, arg Ar |
|
|
|
} |
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s <-> %s ASSOCIATE ON %s OK", raddr, arg.Forward, rep.Addr) |
|
|
|
|
|
|
|
addr, err := net.ResolveUDPAddr("udp", arg.Forward) |
|
|
|
if err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s -> %s : %s", raddr, arg.Forward, err) |
|
|
|
return |
|
|
|
} |
|
|
|
dgram := gosocks5.NewUDPDatagram( |
|
|
|
gosocks5.NewUDPHeader(uint16(len(data)), 0, ToSocksAddr(addr)), data) |
|
|
|
gosocks5.NewUDPHeader(uint16(len(data)), 0, ToSocksAddr(faddr)), data) |
|
|
|
|
|
|
|
fconn.SetWriteDeadline(time.Now().Add(time.Second * 60)) |
|
|
|
if err = dgram.Write(fconn); err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s -> %s : %s", raddr, arg.Forward, err) |
|
|
|
return |
|
|
|
} |
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s >>> %s length %d", raddr, arg.Forward, len(data)) |
|
|
|
|
|
|
|
fconn.SetReadDeadline(time.Now().Add(time.Second * 60)) |
|
|
|
dgram, err = gosocks5.ReadUDPDatagram(fconn) |
|
|
|
if err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s <- %s : %s", raddr, arg.Forward, err) |
|
|
|
return |
|
|
|
} |
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s <<< %s length %d", raddr, arg.Forward, len(dgram.Data)) |
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s <<< %s length %d", raddr, dgram.Header.Addr, len(dgram.Data)) |
|
|
|
|
|
|
|
if _, err = conn.WriteToUDP(dgram.Data, raddr); err != nil { |
|
|
|
glog.V(LWARNING).Infof("[udp-forward] %s <- %s : %s", raddr, arg.Forward, err) |
|
|
|
} |
|
|
|
|
|
|
|
glog.V(LINFO).Infof("[udp-forward] %s >-< %s DONE", raddr, arg.Forward) |
|
|
|
} |
|
|
|
|