Documentation
¶
Index ¶
- Constants
- Variables
- func SetLogger(l *zap.Logger)
- type Client
- type Handshaker
- type PacketAdapter
- type Service
- func NewTCPShadowsocksNoneService(ssNoneListenAddress string, listenerTFO, dialerTFO bool, client Client) Service
- func NewTCPSimpleHttpConnectService(httpListenAddress string, listenerTFO, dialerTFO bool, client Client) Service
- func NewTCPSimpleSocks5Service(socks5ListenAddress string, enableTCP, enableUDP, listenerTFO, dialerTFO bool, ...) Service
- func NewTCPSimpleTunnelService(tunnelListenAddress string, tunnelRemoteSocksAddr socks.Addr, ...) Service
- func NewUDPShadowsocksNoneService(ssNoneListenAddress string, natTimeout time.Duration, client Client) Service
- func NewUDPSimpleSocks5Service(socks5ListenAddress string, natTimeout time.Duration, client Client) Service
- func NewUDPSimpleTunnelService(tunnelListenAddress string, tunnelRemoteSocksAddr socks.Addr, ...) Service
- type ShadowsocksNoneHandshaker
- type ShadowsocksNonePacketAdapter
- func (p *ShadowsocksNonePacketAdapter) EncapsulatePacket(decryptedFullPacket []byte, socksAddrStart, payloadStart, payloadLength int) (pkt []byte, err error)
- func (p *ShadowsocksNonePacketAdapter) ParsePacket(pkt []byte, start, length int) (payloadStart, payloadLength int, detachedSocksAddr []byte, err error)
- func (p *ShadowsocksNonePacketAdapter) String() string
- type ShadowsocksPacketConn
- type SimpleHttpConnectHandshaker
- type SimpleSocks5Handshaker
- type SimpleSocks5PacketAdapter
- func (p *SimpleSocks5PacketAdapter) EncapsulatePacket(decryptedFullPacket []byte, socksAddrStart, payloadStart, payloadLength int) (pkt []byte, err error)
- func (p *SimpleSocks5PacketAdapter) ParsePacket(pkt []byte, start, length int) (payloadStart, payloadLength int, detachedSocksAddr []byte, err error)
- func (p *SimpleSocks5PacketAdapter) String() string
- type SimpleTunnelHandshaker
- type SimpleTunnelPacketAdapter
- func (p *SimpleTunnelPacketAdapter) EncapsulatePacket(decryptedFullPacket []byte, _, payloadStart, payloadLength int) (pkt []byte, err error)
- func (p *SimpleTunnelPacketAdapter) ParsePacket(_ []byte, start, length int) (payloadStart, payloadLength int, detachedSocksAddr []byte, err error)
- func (p *SimpleTunnelPacketAdapter) String() string
- type TCPTunnel
- type UDPTunnel
Constants ¶
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 ¶
var (
ErrRepeatedSalt = errors.New("server stream has repeated salt")
)
Functions ¶
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.
type Handshaker ¶
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 NewTCPSimpleHttpConnectService ¶ added in v0.3.0
type ShadowsocksNoneHandshaker ¶
type ShadowsocksNoneHandshaker struct{}
ShadowsocksNoneHandshaker implements the 'none' mode of Shadowsocks.
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 (*ShadowsocksNonePacketAdapter) String ¶ added in v0.2.0
func (p *ShadowsocksNonePacketAdapter) String() string
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) 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) 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 (*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) 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 (*SimpleTunnelPacketAdapter) String ¶ added in v0.2.0
func (p *SimpleTunnelPacketAdapter) String() string