コード例 #1
0
ファイル: socks.go プロジェクト: xieshmei/firefly-proxy
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
	}
}
コード例 #2
0
ファイル: socks.go プロジェクト: xieshmei/firefly-proxy
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)
	}
}
コード例 #3
0
ファイル: tunnel.go プロジェクト: xieshmei/firefly-proxy
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)
}