client

package
v0.3.6 Latest Latest
Warning

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

Go to latest
Published: Apr 15, 2022 License: Apache-2.0 Imports: 24 Imported by: 0

Documentation

Index

Constants

View Source
const (

	// Defines the space to reserve in front of a slice for making an outgoing Shadowsocks client message.
	ShadowsocksPacketConnFrontReserve = 24 + ss.UDPClientMessageHeaderFixedLength + ss.MaxPaddingLength + socks.MaxAddrLen
)

Variables

View Source
var (
	ErrRepeatedSalt = errors.New("server stream has repeated salt")
)

Functions

func SetLogger added in v0.2.0

func SetLogger(l *zap.Logger)

Types

type Client

type Client interface {
	// DialTCP connects to `raddr` over TCP though a Shadowsocks proxy.
	// `laddr` is a local bind address, a local address is automatically chosen if nil.
	// `raddr` is the target socks address.
	DialTCP(laddr *net.TCPAddr, raddr []byte, dialerTFO bool) (onet.DuplexConn, error)

	// ListenUDP starts a new Shadowsocks UDP session and returns a connection that
	// can be used to relay UDP packets though the proxy.
	// `laddr` is a local bind address, a local address is automatically chosen if nil.
	// For Shadowsocks 2022, this encapsulation does not support multiplexing several sessions
	// into one proxy connection.
	ListenUDP(laddr *net.UDPAddr) (ShadowsocksPacketConn, error)

	// Cipher gets the underlying Shadowsocks cipher used by the client.
	Cipher() *ss.Cipher
}

Client is a client for Shadowsocks TCP and UDP connections.

func NewClient

func NewClient(address, method, password string, saltPool *service.SaltPool) (Client, error)

NewClient creates a client that routes connections to a Shadowsocks proxy listening at `host:port`, with authentication parameters `cipher` (AEAD) and `password`. TODO: add a dialer argument to support proxy chaining and transport changes.

type Handshaker

type Handshaker interface {
	String() string
	Handshake(*net.TCPConn) (socks.Addr, error)
}

Handshaker handles the handshake with clientConn for TCPTunnel.

An implementation of Handshaker must be thread-safe. Handshake(1) may be called simultaneously from different goroutines.

If both the returned socks address and error are nil, the connection is kept open until EOF.

type PacketAdapter

type PacketAdapter interface {
	String() string

	// ParsePacket parses an incoming packet and returns payload start index, payload length,
	// a detached socks address (if applicable), or an error.
	//
	// The detached socks address is only returned when the payload does not start with a socks address.
	ParsePacket(pkt []byte, start, length int) (payloadStart, payloadLength int, detachedSocksAddr []byte, err error)

	// EncapsulatePacket encapsulates the decrypted packet from proxy
	// into a new form so it's ready to be sent on the local interface.
	// The encapsulation must not extend beyond the range of the full decrypted packet.
	EncapsulatePacket(decryptedFullPacket []byte, socksAddrStart, payloadStart, payloadLength int) (pkt []byte, err error)
}

PacketAdapter translates packets between a local interface and the proxy interface.

type Service

type Service interface {
	// String returns the service's name.
	// This method may be called on a nil pointer.
	String() string

	// Start starts the service.
	Start() error

	// Stop stops the service.
	Stop() error
}

Service defines the management interface for client services.

func NewTCPShadowsocksNoneService

func NewTCPShadowsocksNoneService(ssNoneListenAddress string, listenerTFO, dialerTFO bool, client Client) Service

func NewTCPSimpleHttpConnectService added in v0.3.0

func NewTCPSimpleHttpConnectService(httpListenAddress string, listenerTFO, dialerTFO bool, client Client) Service

func NewTCPSimpleSocks5Service

func NewTCPSimpleSocks5Service(socks5ListenAddress string, enableTCP, enableUDP, listenerTFO, dialerTFO bool, client Client) Service

func NewTCPSimpleTunnelService

func NewTCPSimpleTunnelService(tunnelListenAddress string, tunnelRemoteSocksAddr socks.Addr, listenerTFO, dialerTFO bool, client Client) Service

func NewUDPShadowsocksNoneService

func NewUDPShadowsocksNoneService(ssNoneListenAddress string, natTimeout time.Duration, client Client) Service

func NewUDPSimpleSocks5Service

func NewUDPSimpleSocks5Service(socks5ListenAddress string, natTimeout time.Duration, client Client) Service

func NewUDPSimpleTunnelService

func NewUDPSimpleTunnelService(tunnelListenAddress string, tunnelRemoteSocksAddr socks.Addr, natTimeout time.Duration, client Client) Service

type ShadowsocksNoneHandshaker

type ShadowsocksNoneHandshaker struct{}

ShadowsocksNoneHandshaker implements the 'none' mode of Shadowsocks.

func (*ShadowsocksNoneHandshaker) Handshake

func (h *ShadowsocksNoneHandshaker) Handshake(conn *net.TCPConn) (socks.Addr, error)

func (*ShadowsocksNoneHandshaker) String added in v0.2.0

func (h *ShadowsocksNoneHandshaker) String() string

type ShadowsocksNonePacketAdapter

type ShadowsocksNonePacketAdapter struct{}

ShadowsocksNonePacketAdapter implements the 'none' mode of Shadowsocks.

func (*ShadowsocksNonePacketAdapter) EncapsulatePacket

func (p *ShadowsocksNonePacketAdapter) EncapsulatePacket(decryptedFullPacket []byte, socksAddrStart, payloadStart, payloadLength int) (pkt []byte, err error)

func (*ShadowsocksNonePacketAdapter) ParsePacket

func (p *ShadowsocksNonePacketAdapter) ParsePacket(pkt []byte, start, length int) (payloadStart, payloadLength int, detachedSocksAddr []byte, err error)

func (*ShadowsocksNonePacketAdapter) String added in v0.2.0

type ShadowsocksPacketConn

type ShadowsocksPacketConn interface {
	net.PacketConn

	// RemoteAddr returns the remote proxy's address.
	RemoteAddr() net.Addr

	// ReadFromZeroCopy eliminates copying by requiring that a big enough buffer is passed for reading.
	ReadFromZeroCopy(b []byte) (socksAddrStart, payloadStart, payloadLength int, err error)

	// WriteToZeroCopy minimizes copying by requiring that enough space is reserved in b.
	// The socks address is still being copied into the buffer.
	//
	// You should reserve 24 + ss.UDPClientMessageHeaderFixedLength + ss.MaxPaddingLength + socks.MaxAddrLen
	// in the beginning, and cipher.TagSize() in the end.
	//
	// start points to where the actual payload (excluding header) starts.
	// length is payload length.
	WriteToZeroCopy(b []byte, start, length int, socksAddr []byte) (n int, err error)
}

ShadowsocksPacketConn adds zero-copy methods for reading from and writing to a Shadowsocks UDP proxy.

type SimpleHttpConnectHandshaker added in v0.3.0

type SimpleHttpConnectHandshaker struct{}

func (*SimpleHttpConnectHandshaker) Handshake added in v0.3.0

func (h *SimpleHttpConnectHandshaker) Handshake(conn *net.TCPConn) (socks.Addr, error)

func (*SimpleHttpConnectHandshaker) String added in v0.3.0

func (h *SimpleHttpConnectHandshaker) String() string

type SimpleSocks5Handshaker

type SimpleSocks5Handshaker struct {
	// contains filtered or unexported fields
}

SimpleSocks5Handshaker is a minimal implementation of SOCKS5 server. SOCKS5 spec: https://datatracker.ietf.org/doc/html/rfc1928

func NewSimpleSocks5Handshaker

func NewSimpleSocks5Handshaker(enableTCP, enableUDP bool) *SimpleSocks5Handshaker

func (*SimpleSocks5Handshaker) Handshake

func (h *SimpleSocks5Handshaker) Handshake(conn *net.TCPConn) (socks.Addr, error)

func (*SimpleSocks5Handshaker) String added in v0.2.0

func (h *SimpleSocks5Handshaker) String() string

type SimpleSocks5PacketAdapter

type SimpleSocks5PacketAdapter struct{}

SimpleSocks5PacketAdapter is a minimal implementation of SOCKS5 UDP server. It unconditionally accepts SOCKS5 UDP packets, no matter a corresponding UDP association exists or not.

func (*SimpleSocks5PacketAdapter) EncapsulatePacket

func (p *SimpleSocks5PacketAdapter) EncapsulatePacket(decryptedFullPacket []byte, socksAddrStart, payloadStart, payloadLength int) (pkt []byte, err error)

func (*SimpleSocks5PacketAdapter) ParsePacket

func (p *SimpleSocks5PacketAdapter) ParsePacket(pkt []byte, start, length int) (payloadStart, payloadLength int, detachedSocksAddr []byte, err error)

func (*SimpleSocks5PacketAdapter) String added in v0.2.0

func (p *SimpleSocks5PacketAdapter) String() string

type SimpleTunnelHandshaker

type SimpleTunnelHandshaker struct {
	// contains filtered or unexported fields
}

SimpleTunnelHandshaker simply tunnels traffic between clientConn and proxyConn.

func NewSimpleTunnelHandshaker

func NewSimpleTunnelHandshaker(remoteSocksAddr socks.Addr) *SimpleTunnelHandshaker

func (*SimpleTunnelHandshaker) Handshake

func (h *SimpleTunnelHandshaker) Handshake(_ *net.TCPConn) (socks.Addr, error)

func (*SimpleTunnelHandshaker) String added in v0.2.0

func (h *SimpleTunnelHandshaker) String() string

type SimpleTunnelPacketAdapter

type SimpleTunnelPacketAdapter struct {
	// contains filtered or unexported fields
}

SimpleTunnelPacketAdapter simply relays packets between clientConn and proxyConn.

func NewSimpleTunnelPacketAdapter

func NewSimpleTunnelPacketAdapter(remoteSocksAddr socks.Addr) *SimpleTunnelPacketAdapter

func (*SimpleTunnelPacketAdapter) EncapsulatePacket

func (p *SimpleTunnelPacketAdapter) EncapsulatePacket(decryptedFullPacket []byte, _, payloadStart, payloadLength int) (pkt []byte, err error)

func (*SimpleTunnelPacketAdapter) ParsePacket

func (p *SimpleTunnelPacketAdapter) ParsePacket(_ []byte, start, length int) (payloadStart, payloadLength int, detachedSocksAddr []byte, err error)

func (*SimpleTunnelPacketAdapter) String added in v0.2.0

func (p *SimpleTunnelPacketAdapter) String() string

type TCPTunnel

type TCPTunnel struct {
	// contains filtered or unexported fields
}

func (*TCPTunnel) Start

func (s *TCPTunnel) Start() error

func (*TCPTunnel) Stop

func (s *TCPTunnel) Stop() error

func (*TCPTunnel) String added in v0.2.0

func (s *TCPTunnel) String() string

type UDPTunnel

type UDPTunnel struct {
	// contains filtered or unexported fields
}

func (*UDPTunnel) Start

func (s *UDPTunnel) Start() error

func (*UDPTunnel) Stop

func (s *UDPTunnel) Stop() error

func (*UDPTunnel) String added in v0.2.0

func (s *UDPTunnel) String() string

Jump to

Keyboard shortcuts

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