socks5

package
v0.3.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 25, 2022 License: MIT Imports: 7 Imported by: 0

Documentation

Overview

Package socks5

SOCKS protocol version 5 is defined in RFC 1928. Username/Password authentication for SOCKS version 5 is defined in RFC 1929.

Index

Constants

View Source
const (
	UserPasswordVer     = 0x01
	UserPasswordSuccess = 0x00
	UserPasswordFailure = 0x01
)
View Source
const (
	Version = 0x05 // SOCKS Protocol version 5

	AuthMethodNone                = 0x00 // No authentication required
	AuthMethodGSSAPI              = 0x01 // GSSAPI
	AuthMethodUserPassword        = 0x02 // Username/Password
	AuthMethodNoAcceptableMethods = 0xFF // No acceptable method

	AddrTypeIPv4   = 0x01 // 1 for IPv4 address
	AddrTypeDomain = 0x03 // 3 for domain name
	AddrTypeIPv6   = 0x04 // 4 for IPv6 address

	CmdConnect      = 0x01 // establish a TCP/IP stream connection
	CmdBind         = 0x02 // associate a name with a socket todo
	CmdUdpAssociate = 0x03 // establish a UDP association todo

	StatusSucceeded = 0x00 // succeeded
)

Variables

This section is empty.

Functions

func ClientHandshake

func ClientHandshake(conn net.Conn, hostPort string, cmd byte, auths []AuthMethod) error

ClientHandshake client执行socks5握手,

func ClientHandshakeTimeout

func ClientHandshakeTimeout(conn net.Conn, hostPort string, cmd byte, auths []AuthMethod, timeout time.Duration) error

ClientHandshakeTimeout client设置超时时间并执行socks5握手

func Dial

func Dial(network, address, hostPort string, auths []AuthMethod) (net.Conn, error)

Dial 使用给定的network、address连接到远程主机, hostPort为要代理的地址, auths为支持的认证方法, nil则使用AuthNone

func DialTimeout

func DialTimeout(network, address, hostPort string, auths []AuthMethod, timeout time.Duration) (net.Conn, error)

DialTimeout 使用给定的network、address连接到远程主机, 并设置超时时间, hostPort为要代理的地址, auths为支持的认证方法, nil则使用AuthNone

func ParseHostPort

func ParseHostPort(addrType byte, addr []byte, port []byte) (hostPort string, err error)

ParseHostPort 通过addrType解析addr和port,转换为host:port格式

func ServerHandshake

func ServerHandshake(conn net.Conn, auths []AuthMethod) (hostPort string, err error)

ServerHandshake server执行socks5握手, 握手成功返回client请求的hostPort ServerHandshake无论握手成功与否, 都不会发送Response数据, 需要用户自动构造Response回复

func ServerHandshakeTimeout

func ServerHandshakeTimeout(conn net.Conn, auths []AuthMethod, timeout time.Duration) (hostPort string, err error)

ServerHandshakeTimeout server设置超时时间执行socks5握手, 握手成功返回client请求的hostPort ServerHandshakeTimeout无论握手成功与否, 都不会发送Response数据, 需要用户自动构造Response回复

Types

type AuthMethod

type AuthMethod interface {
	// Method return method byte
	Method() byte
	// Auth 认证具体实现
	// 如果 error 为 nil, 表示认证成功
	Auth(rw io.ReadWriter) error
}

AuthMethod socks5 认证方式接口

type AuthNone

type AuthNone int

AuthNone 无需认证

func NewAuthNone

func NewAuthNone() *AuthNone

NewAuthNone return AuthNone

func (*AuthNone) Auth

func (a *AuthNone) Auth(io.ReadWriter) error

func (*AuthNone) Method

func (a *AuthNone) Method() byte

type AuthUserPassword

type AuthUserPassword struct {
	User     string
	Password string
}

AuthUserPassword 客户端用户名和密码认证

func NewAuthUserPassword

func NewAuthUserPassword(user, password string) *AuthUserPassword

NewAuthUserPassword create AuthUserPassword by user and password

func (*AuthUserPassword) Auth

func (a *AuthUserPassword) Auth(rw io.ReadWriter) error

func (*AuthUserPassword) Method

func (a *AuthUserPassword) Method() byte

type AuthUserPasswordServer

type AuthUserPasswordServer struct {
	// map[user]password
	Map map[string]string
	// 认证失败,是否回复客户端
	Reply bool
}

AuthUserPasswordServer 服务端用户名和密码认证

func NewAuthUserPasswordServer

func NewAuthUserPasswordServer(m map[string]string, reply bool) *AuthUserPasswordServer

NewAuthUserPasswordServer create AuthUserPasswordServer by map[user]password

func (*AuthUserPasswordServer) Auth

func (*AuthUserPasswordServer) Method

func (a *AuthUserPasswordServer) Method() byte

type HelloRequest

type HelloRequest struct {
	Ver      byte
	NMethods byte
	Methods  []byte // 1-255 bytes
}

HelloRequest is the hello request packet

func (*HelloRequest) FlushTo

func (hr *HelloRequest) FlushTo(w io.Writer) error

func (*HelloRequest) ParseFrom

func (hr *HelloRequest) ParseFrom(r io.Reader) error

func (*HelloRequest) Size

func (hr *HelloRequest) Size() int

type HelloResponse

type HelloResponse struct {
	Ver    byte
	Method byte
}

func (*HelloResponse) FlushTo

func (hr *HelloResponse) FlushTo(w io.Writer) error

func (*HelloResponse) ParseFrom

func (hr *HelloResponse) ParseFrom(r io.Reader) error

func (*HelloResponse) Size

func (hr *HelloResponse) Size() int

type Listener

type Listener struct {
	net.Listener
	// contains filtered or unexported fields
}

A Listener is a generic network listener for socks5 protocols. Multiple goroutines may invoke methods on a Listener simultaneously.

func Listen

func Listen(network, address string, auths []AuthMethod) (*Listener, error)

Listen creates a Socks5 listener accepting connections on the given network address using net.Listen. A nil auths as equivalent to the AuthNone.

func ListenTimeout

func ListenTimeout(network, address string, auths []AuthMethod, timeout time.Duration) (*Listener, error)

ListenTimeout creates a Socks5 listener accepting connections on the given network address using net.Listen. A nil auths as equivalent to the AuthNone. i/o timeout will happen if client don't complete the handshake within the timeout.

func (*Listener) Accept

func (l *Listener) Accept() (conn net.Conn, hostPort string, err error)

Accept 返回net.Conn, client请求的地址, 如果握手失败则返回对应的错误

func (*Listener) AcceptResponse

func (l *Listener) AcceptResponse(responseCreate func(localAddress string, err error) *Response) (conn net.Conn, hostPort string, err error)

AcceptResponse 返回net.Conn, client请求的地址, 如果握手失败则返回对应的错误 使用用户构造的Response进行回复

type ReplyCode

type ReplyCode int

A ReplyCode represents a SOCKS command reply code.

func (ReplyCode) String

func (code ReplyCode) String() string

type Request

type Request struct {
	Ver      byte
	Cmd      byte
	Rsv      byte // 0x00
	AddrType byte
	DstAddr  []byte
	DstPort  []byte // 2 bytes
}

Request is the request packet

func (*Request) FlushTo

func (req *Request) FlushTo(w io.Writer) error

func (*Request) ParseFrom

func (req *Request) ParseFrom(r io.Reader) error

func (*Request) Size

func (req *Request) Size() int

type Response

type Response struct {
	Ver      byte
	Rep      byte
	Rsv      byte // 0x00
	AddrType byte
	BndAddr  []byte
	BndPort  []byte // 2 bytes
}

func (*Response) FlushTo

func (res *Response) FlushTo(w io.Writer) error

func (*Response) ParseFrom

func (res *Response) ParseFrom(r io.Reader) error

func (*Response) Size

func (res *Response) Size() int

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL