Original post

socks5

Go Report Card GoDoc

SOCKS Protocol Version 5 Library.

Full TCP/UDP and IPv4/IPv6 support. Goals: KISS, less is more, small API, code is like the original protocol.

Install

$  get github.com/txthinking/socks5

Struct is like concept in protocol

  • Negotiation:
    • type NegotiationRequest struct
      • func NewNegotiationRequest(methods []byte), in client
      • func (r *NegotiationRequest) WriteTo(w *net.TCPConn), client writes to server
      • func NewNegotiationRequestFrom(r *net.TCPConn), server reads from client
    • type NegotiationReply struct
      • func NewNegotiationReply(method byte), in server
      • func (r *NegotiationReply) WriteTo(w *net.TCPConn), server writes to client
      • func NewNegotiationReplyFrom(r *net.TCPConn), client reads from server
  • User and password negotiation:
    • type UserPassNegotiationRequest struct
      • func NewUserPassNegotiationRequest(username []byte, password []byte), in client
      • func (r *UserPassNegotiationRequest) WriteTo(w *net.TCPConn), client writes to server
      • func NewUserPassNegotiationRequestFrom(r *net.TCPConn), server reads from client
    • type UserPassNegotiationReply struct
      • func NewUserPassNegotiationReply(status byte), in server
      • func (r *UserPassNegotiationReply) WriteTo(w *net.TCPConn), server writes to client
      • func NewUserPassNegotiationReplyFrom(r *net.TCPConn), client reads from server
  • Request:
    • type Request struct
      • func NewRequest(cmd byte, atyp byte, dstaddr []byte, dstport []byte), in client
      • func (r *Request) WriteTo(w *net.TCPConn), client writes to server
      • func NewRequestFrom(r *net.TCPConn), server reads from client
      • After server gets the client’s *Request, processes…
  • Reply:
    • type Reply struct
      • func NewReply(rep byte, atyp byte, bndaddr []byte, bndport []byte), in server
      • func (r *Reply) WriteTo(w *net.TCPConn), server writes to client
      • func NewReplyFrom(r *net.TCPConn), client reads from server
  • Datagram:
    • type Datagram struct
      • func NewDatagram(atyp byte, dstaddr []byte, dstport []byte, data []byte)
      • func NewDatagramFromBytes(bb []byte) (*Datagram, error)
      • func (d *Datagram) Bytes() []byte

Advanced API

You can process client’s request by yourself after reading *Request from client. Also, here is a advanced interfaces.

  • type Server struct
  • type Handler interface
    • TCPHandle(*Server, *net.TCPConn, *Request) error
    • UDPHandle(*Server, *net.UDPAddr, *Datagram) error

This is example:

s, _ := NewClassicServer(addr, ip, username, password, tcpTimeout, tcpDeadline, udpDeadline, udpSessionTime)
s.Run(Handler)

  • If you want a standard socks5 server, pass in nil
  • If you want to handle data by yourself, pass in a custom Handler

Users: