func (r *relayHandler) ServeSocks(conn *gosocks.SocksConn) { conn.SetReadDeadline(time.Now().Add(conn.Timeout)) req, err := gosocks.ReadSocksRequest(conn) if err != nil { log.Printf("error in ReadSocksRequest: %s", err) return } switch req.Cmd { case gosocks.SocksCmdConnect: chain := r.lookup(req.DstHost, conn) if chain != nil { chain.TCP(req, conn) } else { r.basic.HandleCmdConnect(req, conn) } return case gosocks.SocksCmdUDPAssociate: r.handleUDPAssociate(req, conn) return case gosocks.SocksCmdBind: conn.Close() return default: return } }
func (r *relayHandler) handleUDPAssociate(req *gosocks.SocksRequest, conn *gosocks.SocksConn) { clientBind, clientAssociate, udpReq, clientAddr, err := r.basic.UDPAssociateFirstPacket(req, conn) if err != nil { conn.Close() return } chain := r.lookup(udpReq.DstHost, conn) if chain != nil { chain.UDPAssociate(req, conn, clientBind, clientAssociate, udpReq, clientAddr) } else { r.basic.UDPAssociateForwarding(conn, clientBind, clientAssociate, udpReq, clientAddr) } }
func (t *tunnelHandler) ServeSocks(conn *gosocks.SocksConn) { r := &tunnelRequest{ret: make(chan net.Conn)} t.ch <- r tunnel, ok := <-r.ret if !ok { log.Printf("error to get a tunnel connection") conn.Close() return } if t.auth.ClientAuthenticate(conn, tunnel) != nil { conn.Close() tunnel.Close() return } sockstun.TunnelClient(conn, tunnel) }