Documentation
¶
Index ¶
- Constants
- Variables
- func ParseAddress(na net.Addr) (a byte, addr []byte, port []byte)
- func ToAddress(a byte, addr []byte, port []byte) string
- type NegotiationReply
- type NegotiationRequest
- type Reply
- type Request
- type Server
- type UDPHeader
- type UserPassNegotiationReply
- type UserPassNegotiationRequest
Examples ¶
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 ( // ErrBadReply is the error when read reply ErrBadReply = errors.New("Bad Reply") )
Functions ¶
func ParseAddress ¶
ParseAddress format net.Addr to raw address
Types ¶
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 io.Reader) (*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 io.Reader) (*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
type Server ¶
type Server struct {
C net.Conn
CheckUserPass func(user, pass []byte) bool
SelectMethod func(methods []byte) (method byte, got bool)
SupportedCommands []byte // Now only support connect command
}
Server is socks5 server wrapper
Example ¶
package main
import (
"io"
"log"
"net"
"github.com/txthinking/socks5"
)
func main() {
socks5.Debug = true // enable socks5 debug log
l, err := net.Listen("tcp", ":1980")
if err != nil {
log.Println(err)
return
}
defer l.Close()
for {
c, err := l.Accept()
if err != nil {
log.Println(err)
return
}
go func(c net.Conn) {
defer c.Close()
s5s := socks5.NewClassicServer(c)
if err := s5s.Negotiate(); err != nil {
log.Println(err)
return
}
r, err := s5s.GetRequest()
if err != nil {
log.Println(err)
return
}
rc, err := r.Connect(c)
if err != nil {
log.Println(err)
return
}
defer rc.Close()
go func() {
_, _ = io.Copy(c, rc)
}()
_, _ = io.Copy(rc, c)
}(c)
}
}
Output:
func NewClassicServer ¶
NewClassicServer return a server which allow none method and connect command
func (*Server) GetRequest ¶
GetRequest get request packet from client, and check command according to SupportedCommands
type UDPHeader ¶
type UDPHeader struct {
Rsv []byte // 0x00 0x00
Flag byte
Atyp byte
DstAddr []byte
DstPort []byte // 2 bytes
}
UDPHeader is the UDP header packet
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 io.Reader) (*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 io.Reader) (*UserPassNegotiationRequest, error)
NewUserPassNegotiationRequestFrom read user password negotiation request packet from client