Documentation ¶
Index ¶
- Constants
- Variables
- func ParseAddress(address string) (a byte, addr []byte, port []byte, err error)
- func ToAddress(a byte, addr []byte, port []byte) string
- type Client
- type Datagram
- type DefaultHandle
- type Handler
- type NegotiationReply
- type NegotiationRequest
- type Reply
- type Request
- type Server
- type UDPExchange
- type UserPassNegotiationReply
- type UserPassNegotiationRequest
Constants ¶
const ( // Ver is socks protocol version Ver byte = 0x05 // MethodNone is none method MethodNone byte = 0x00 // MethodGSSAPI is gssapi method MethodGSSAPI byte = 0x01 // MUST support // todo // MethodUsernamePassword is username/assword auth method MethodUsernamePassword byte = 0x02 // SHOULD support // MethodUnsupportAll means unsupport all given methods MethodUnsupportAll byte = 0xFF // UserPassVer is username/password auth protocol version UserPassVer byte = 0x01 // UserPassStatusSuccess is success status of username/password auth UserPassStatusSuccess byte = 0x00 // UserPassStatusFailure is failure status of username/password auth UserPassStatusFailure byte = 0x01 // just other than 0x00 // CmdConnect is connect command CmdConnect byte = 0x01 // CmdBind is bind command CmdBind byte = 0x02 // CmdUDP is UDP command CmdUDP byte = 0x03 // ATYPIPv4 is ipv4 address type ATYPIPv4 byte = 0x01 // 4 octets // ATYPDomain is domain address type ATYPDomain byte = 0x03 // The first octet of the address field contains the number of octets of name that follow, there is no terminating NUL octet. // ATYPIPv6 is ipv6 address type ATYPIPv6 byte = 0x04 // 16 octets // RepSuccess means that success for repling RepSuccess byte = 0x00 // RepServerFailure means the server failure RepServerFailure byte = 0x01 // RepNotAllowed means the request not allowed RepNotAllowed byte = 0x02 // RepNetworkUnreachable means the network unreachable RepNetworkUnreachable byte = 0x03 // RepHostUnreachable means the host unreachable RepHostUnreachable byte = 0x04 // RepConnectionRefused means the connection refused RepConnectionRefused byte = 0x05 // RepTTLExpired means the TTL expired RepTTLExpired byte = 0x06 // RepCommandNotSupported means the request command not supported RepCommandNotSupported byte = 0x07 // RepAddressNotSupported means the request address not supported RepAddressNotSupported byte = 0x08 )
Variables ¶
var ( // ErrUnsupportCmd is the error when got unsupport command ErrUnsupportCmd = errors.New("Unsupport Command") // ErrUserPassAuth is the error when got invalid username or password ErrUserPassAuth = errors.New("Invalid Username or Password for Auth") )
var ( // ErrVersion is version error ErrVersion = errors.New("Invalid Version") // ErrUserPassVersion is username/password auth version error ErrUserPassVersion = errors.New("Invalid Version of Username Password Auth") // ErrBadRequest is bad request error ErrBadRequest = errors.New("Bad Request") )
var Debug bool
Debug enable debug log
var Dial x.Dialer = x.DefaultDial
var ( // ErrBadReply is the error when read reply ErrBadReply = errors.New("Bad Reply") )
Functions ¶
func ParseAddress ¶
ParseAddress format address x.x.x.x:xx to raw address. addr contains domain length
Types ¶
type Client ¶
type Client struct { UserName string Password string TCPAddr *net.TCPAddr TCPConn *net.TCPConn UDPAddr *net.UDPAddr TCPDeadline int // not refreshed TCPTimeout int UDPDeadline int // refreshed }
Client is socks5 client wrapper
type Datagram ¶
type Datagram struct { Rsv []byte // 0x00 0x00 Frag byte Atyp byte DstAddr []byte DstPort []byte // 2 bytes Data []byte }
Datagram is the UDP packet
func NewDatagram ¶
NewDatagram return datagram packet can be writed into client
func NewDatagramFromBytes ¶
type DefaultHandle ¶
type DefaultHandle struct { }
DefaultHandle implements Handler interface
type Handler ¶
type Handler interface { // Request has not been replied yet TCPHandle(*Server, *net.TCPConn, *Request) error UDPHandle(*Server, *net.UDPAddr, *Datagram) error }
Handler handle tcp, udp request
type NegotiationReply ¶
NegotiationReply is the negotiation reply packet
func NewNegotiationReply ¶
func NewNegotiationReply(method byte) *NegotiationReply
NewNegotiationReply return negotiation reply packet can be writed into client
func NewNegotiationReplyFrom ¶
func NewNegotiationReplyFrom(r *net.TCPConn) (*NegotiationReply, error)
NewNegotiationReplyFrom read negotiation reply packet from server
type NegotiationRequest ¶
NegotiationRequest is the negotiation reqeust packet
func NewNegotiationRequest ¶
func NewNegotiationRequest(methods []byte) *NegotiationRequest
NewNegotiationRequest return negotiation request packet can be writed into server
func NewNegotiationRequestFrom ¶
func NewNegotiationRequestFrom(r *net.TCPConn) (*NegotiationRequest, error)
NewNegotiationRequestFrom read negotiation requst packet from client
type Reply ¶
type Reply struct { Ver byte Rep byte Rsv byte // 0x00 Atyp byte // CONNECT socks server's address which used to connect to dst addr // BIND ... // UDP socks server's address which used to connect to dst addr BndAddr []byte // CONNECT socks server's port which used to connect to dst addr // BIND ... // UDP socks server's port which used to connect to dst addr BndPort []byte // 2 bytes }
Reply is the reply packet
func NewReplyFrom ¶
NewReplyFrom read reply packet from server
type Request ¶
type Request struct { Ver byte Cmd byte Rsv byte // 0x00 Atyp byte DstAddr []byte DstPort []byte // 2 bytes }
Request is the request packet
func NewRequest ¶
NewRequest return request packet can be writed into server
func NewRequestFrom ¶
NewRequestFrom read requst packet from client
func (*Request) Connect ¶
Connect remote conn which u want to connect with your dialer Error or OK both replied.
func (*Request) UDP ¶
UDP remote conn which u want to connect with your dialer. Error or OK both replied. Addr can be used to associate TCP connection with the coming UDP connection, so we can close the TCP connection when UDP connection closed. If client send 0.0.0.0:0 address, alternative solution is set fixed time on TCP connection.
type Server ¶
type Server struct { UserName string Password string Method byte SupportedCommands []byte TCPAddr *net.TCPAddr UDPAddr *net.UDPAddr ServerAddr *net.UDPAddr TCPListen *net.TCPListener UDPConn *net.UDPConn UDPExchanges *cache.Cache TCPDeadline int TCPTimeout int UDPDeadline int UDPSessionTime int // If client does't send address, use this fixed time Handle Handler TCPUDPAssociate *cache.Cache }
Server is socks5 server wrapper
func NewClassicServer ¶
func NewClassicServer(addr, ip, username, password string, tcpTimeout, tcpDeadline, udpDeadline, udpSessionTime int) (*Server, error)
NewClassicServer return a server which allow none method
func (*Server) GetRequest ¶
GetRequest get request packet from client, and check command according to SupportedCommands Error replied.
type UDPExchange ¶
UDPExchange used to store client address and remote connection
type UserPassNegotiationReply ¶
UserPassNegotiationReply is the negotiation username/password reply packet
func NewUserPassNegotiationReply ¶
func NewUserPassNegotiationReply(status byte) *UserPassNegotiationReply
NewUserPassNegotiationReply return negotiation username password reply packet can be writed into client
func NewUserPassNegotiationReplyFrom ¶
func NewUserPassNegotiationReplyFrom(r *net.TCPConn) (*UserPassNegotiationReply, error)
NewUserPassNegotiationReplyFrom read user password negotiation reply packet from server
type UserPassNegotiationRequest ¶
type UserPassNegotiationRequest struct { Ver byte Ulen byte Uname []byte // 1-255 bytes Plen byte Passwd []byte // 1-255 bytes }
UserPassNegotiationRequest is the negotiation username/password reqeust packet
func NewUserPassNegotiationRequest ¶
func NewUserPassNegotiationRequest(username []byte, password []byte) *UserPassNegotiationRequest
NewUserPassNegotiationRequest return user password negotiation request packet can be writed into server
func NewUserPassNegotiationRequestFrom ¶
func NewUserPassNegotiationRequestFrom(r *net.TCPConn) (*UserPassNegotiationRequest, error)
NewUserPassNegotiationRequestFrom read user password negotiation request packet from client