phantomtcp

package
v0.0.0-...-2576269 Latest Latest
Warning

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

Go to latest
Published: Jan 25, 2024 License: LGPL-3.0 Imports: 23 Imported by: 2

Documentation

Index

Constants

View Source
const (
	DIRECT   = 0x0
	REDIRECT = 0x1
	NAT64    = 0x2
	HTTP     = 0x3
	HTTPS    = 0x4
	SOCKS4   = 0x5
	SOCKS5   = 0x6
)
View Source
const (
	HINT_NONE = 0x0

	HINT_ALPN  = 0x1 << 1
	HINT_HTTP  = 0x1 << 2
	HINT_HTTPS = 0x1 << 3
	HINT_HTTP3 = 0x1 << 4

	HINT_IPV4 = 0x1 << 5
	HINT_IPV6 = 0x1 << 6

	HINT_MOVE     = 0x1 << 7
	HINT_STRIP    = 0x1 << 8
	HINT_FRONTING = 0x1 << 9

	HINT_TTL   = 0x1 << 10
	HINT_MSS   = 0x1 << 11
	HINT_WMD5  = 0x1 << 12
	HINT_NACK  = 0x1 << 13
	HINT_WACK  = 0x1 << 14
	HINT_WCSUM = 0x1 << 15
	HINT_WSEQ  = 0x1 << 16
	HINT_WTIME = 0x1 << 17

	HINT_TFO   = 0x1 << 18
	HINT_UDP   = 0x1 << 19
	HINT_NOTCP = 0x1 << 20
	HINT_DELAY = 0x1 << 21

	HINT_MODE2     = 0x1 << 22
	HINT_DF        = 0x1 << 23
	HINT_SAT       = 0x1 << 24
	HINT_RAND      = 0x1 << 25
	HINT_SSEG      = 0x1 << 26
	HINT_1SEG      = 0x1 << 27
	HINT_HTFO      = 0x1 << 28
	HINT_KEEPALIVE = 0x1 << 29
	HINT_SYNX2     = 0x1 << 30
	HINT_ZERO      = 0x1 << 31
)
View Source
const (
	SO_ORIGINAL_DST      = 80
	IP6T_SO_ORIGINAL_DST = 80
)

Variables

View Source
var ConnInfo4 [65536]chan *ConnectionInfo
View Source
var ConnInfo6 [65536]chan *ConnectionInfo
View Source
var ConnSyn sync.Map
View Source
var DNSCache sync.Map
View Source
var DNSMinTTL uint32 = 0
View Source
var Forward bool = false
View Source
var HintMap = map[string]uint32{
	"none":  HINT_NONE,
	"http":  HINT_HTTP,
	"https": HINT_HTTPS,
	"h3":    HINT_HTTP3,

	"ipv4": HINT_IPV4,
	"ipv6": HINT_IPV6,

	"move":     HINT_MOVE,
	"strip":    HINT_STRIP,
	"fronting": HINT_FRONTING,

	"mss":    HINT_MSS,
	"udp":    HINT_UDP,
	"no-tcp": HINT_NOTCP,
	"delay":  HINT_DELAY,
}
View Source
var InterfaceMap map[string]PhantomInterface
View Source
var LogLevel = 0
View Source
var Logger *log.Logger
View Source
var Nose []string = []string{"phantom.socks"}
View Source
var NoseLock sync.Mutex
View Source
var PassiveMode = false
View Source
var SubdomainDepth = 2
View Source
var TFOCookies sync.Map
View Source
var TFOPayload [64][]byte
View Source
var TFOSynID uint8 = 0
View Source
var VirtualAddrPrefix byte = 255

Functions

func AddConn

func AddConn(synAddr string, option uint32)

func ComputeUDPChecksum

func ComputeUDPChecksum(buffer []byte) uint16

func ConnectionMonitor

func ConnectionMonitor(devices []string) bool

func CreateInterfaces

func CreateInterfaces(Interfaces []InterfaceConfig) []string

func DNSTCPServer

func DNSTCPServer(client net.Conn)

func DelConn

func DelConn(synAddr string)

func DevicePrint

func DevicePrint()

func DialUDP

func DialUDP(address string) (net.Conn, error)

func DoHServer

func DoHServer(w http.ResponseWriter, req *http.Request)

func GetAddressFromInterface

func GetAddressFromInterface(iface string, ipv6 bool) (string, error)

func GetHost

func GetHost(b []byte) (offset int, length int)

func GetLocalAddr

func GetLocalAddr(name string, ipv6 bool) (*net.TCPAddr, error)

func GetName

func GetName(buf []byte, offset int) (string, int)

func GetNameOffset

func GetNameOffset(response []byte, offset int) int

func GetOriginalDST

func GetOriginalDST(conn *net.TCPConn) (*net.TCPAddr, error)

func GetPAC

func GetPAC(address string, profile string) string

func GetQName

func GetQName(buf []byte) (string, int, int)

func GetQUICSNI

func GetQUICSNI(b []byte) string

func GetQUICVersion

func GetQUICVersion(data []byte) uint32

func GetSNI

func GetSNI(b []byte) (offset int, length int)

func HTTPProxy

func HTTPProxy(client net.Conn)

func HTTPSlookup

func HTTPSlookup(request []byte, u *url.URL, domain string) ([]byte, error)

func HttpMove

func HttpMove(conn net.Conn, host string, b []byte) bool

func IsAddressInUse

func IsAddressInUse(err error) bool

func IsIPv6

func IsIPv6(addr string) bool

func IsNormalError

func IsNormalError(err error) bool

func ListenUDP

func ListenUDP(address string) (*net.UDPConn, error)

func LoadHosts

func LoadHosts(filename string) error

func LoadProfile

func LoadProfile(filename string) error

func ModifyAndSendPacket

func ModifyAndSendPacket(connInfo *ConnectionInfo, payload []byte, hint uint32, ttl uint8, count int) error

func NSLookup

func NSLookup(name string, hint uint32, server string) (uint32, []net.IP)

func NSRequest

func NSRequest(request []byte, cache bool) (uint32, []byte)

func PackQName

func PackQName(name string) []byte

func PackRequest

func PackRequest(name string, qtype uint16, id uint16, ecs string) []byte

func QUICProxy

func QUICProxy(address string)

func ReadAtLeast

func ReadAtLeast()

func Redirect

func Redirect(dst string, to_port int, forward bool)

func RedirectDNS

func RedirectDNS()

func RedirectProxy

func RedirectProxy(client net.Conn)

func SNIProxy

func SNIProxy(client net.Conn)

func SendWithOption

func SendWithOption(conn net.Conn, payload []byte, tos int, ttl int) error

func SocksProxy

func SocksProxy(client net.Conn)

func SocksUDPProxy

func SocksUDPProxy(address string)

func StoreDNSCache

func StoreDNSCache(qname string, record *DNSRecords)

func TCPMapping

func TCPMapping(Listener net.Listener, Hosts string) error

func TCPlookup

func TCPlookup(request []byte, address string, server *PhantomInterface) ([]byte, error)

func TCPlookupDNS64

func TCPlookupDNS64(request []byte, address string, offset int, prefix []byte) ([]byte, error)

func TFOlookup

func TFOlookup(request []byte, address string) ([]byte, error)

func TLSlookup

func TLSlookup(request []byte, address string) ([]byte, error)

func TProxyUDP

func TProxyUDP(address string)

func UDPMapping

func UDPMapping(Address string, Target string) error

func UDPlookup

func UDPlookup(request []byte, address string) ([]byte, error)

Types

type ConnectionInfo

type ConnectionInfo struct {
	Link gopacket.LinkLayer
	IP   gopacket.NetworkLayer
	TCP  layers.TCP
}

func DialConnInfo

func DialConnInfo(laddr, raddr *net.TCPAddr, server *PhantomInterface, payload []byte) (net.Conn, *ConnectionInfo, error)

type DNSRecords

type DNSRecords struct {
	Index    uint32
	ALPN     uint32
	IPv4Hint *RecordAddresses
	IPv6Hint *RecordAddresses
	Ech      []byte
}

func LoadDNSCache

func LoadDNSCache(qname string) *DNSRecords

func (DNSRecords) BuildResponse

func (records DNSRecords) BuildResponse(request []byte, qtype int, minttl uint32) []byte

func (*DNSRecords) GetAnswers

func (records *DNSRecords) GetAnswers(response []byte, options ServerOptions)

func (*DNSRecords) PackAnswers

func (records *DNSRecords) PackAnswers(qtype int, minttl uint32) (int, []byte)

type IPv4Range

type IPv4Range struct {
	Start     uint32
	End       uint32
	Interface *PhantomInterface
}

type IPv6Range

type IPv6Range struct {
	Start     uint64
	End       uint64
	Interface *PhantomInterface
}

type InterfaceConfig

type InterfaceConfig struct {
	Name    string `json:"name,omitempty"`
	Device  string `json:"device,omitempty"`
	DNS     string `json:"dns,omitempty"`
	Hint    string `json:"hint,omitempty"`
	MTU     int    `json:"mtu,omitempty"`
	TTL     int    `json:"ttl,omitempty"`
	MAXTTL  int    `json:"maxttl,omitempty"`
	Timeout int    `json:"timeout,omitempty"`

	Protocol   string `json:"protocol,omitempty"`
	Address    string `json:"address,omitempty"`
	PrivateKey string `json:"privatekey,omitempty"`

	Peers []Peer `json:"peers,omitempty"`
}

type Peer

type Peer struct {
	PublicKey    string `json:"publickey,omitempty"`
	PreSharedKey string `json:"presharedkey,omitempty"`
	Endpoint     string `json:"endpoint,omitempty"`
	KeepAlive    int    `json:"keepalive,omitempty"`
	AllowedIPs   string `json:"allowedips,omitempty"`
}

type PhantomInterface

type PhantomInterface struct {
	Device  string
	DNS     string
	Hint    uint32
	MTU     uint16
	TTL     byte
	MAXTTL  byte
	Timeout uint16

	Protocol byte
	Address  string
}
var DefaultInterface *PhantomInterface = nil

func (*PhantomInterface) Dial

func (pface *PhantomInterface) Dial(host string, port int, b []byte) (net.Conn, *ConnectionInfo, error)

func (*PhantomInterface) DialStrip

func (pface *PhantomInterface) DialStrip(host string, fronting string) (*tls.Conn, error)

func (*PhantomInterface) DialUDPProxy

func (pface *PhantomInterface) DialUDPProxy(host string, port int) (net.Conn, net.Conn, error)

func (*PhantomInterface) GetRemoteAddresses

func (server *PhantomInterface) GetRemoteAddresses(host string, port int) ([]*net.TCPAddr, error)

func (*PhantomInterface) Keep

func (server *PhantomInterface) Keep(client, conn net.Conn, connInfo *ConnectionInfo)

func (*PhantomInterface) ProxyHandshake

func (server *PhantomInterface) ProxyHandshake(conn net.Conn, synpacket *ConnectionInfo, host string, port int) error

func (*PhantomInterface) ResolveTCPAddr

func (server *PhantomInterface) ResolveTCPAddr(host string, port int) (*net.TCPAddr, error)

func (*PhantomInterface) ResolveTCPAddrs

func (server *PhantomInterface) ResolveTCPAddrs(host string, port int) ([]*net.TCPAddr, error)

type PhantomProfile

type PhantomProfile struct {
	DomainMap  map[string]*PhantomInterface
	IPv4Ranges []IPv4Range
	IPv6Ranges []IPv6Range
}
var DefaultProfile *PhantomProfile = nil

func (*PhantomProfile) GetInterface

func (profile *PhantomProfile) GetInterface(name string) *PhantomInterface

func (*PhantomProfile) GetInterfaceByIP

func (profile *PhantomProfile) GetInterfaceByIP(ip net.IP) *PhantomInterface

type RecordAddresses

type RecordAddresses struct {
	TTL       int64
	Addresses []net.IP
}

type ServerOptions

type ServerOptions struct {
	ECS       string
	Type      string
	PD        string
	Domain    string
	BadSubnet *net.IPNet
	Fallback  net.IP
}

func ParseOptions

func ParseOptions(options string) ServerOptions

type ServiceConfig

type ServiceConfig struct {
	Name       string `json:"name,omitempty"`
	Device     string `json:"device,omitempty"`
	MTU        int    `json:"mtu,omitempty"`
	Protocol   string `json:"protocol,omitempty"`
	Address    string `json:"address,omitempty"`
	PrivateKey string `json:"privatekey,omitempty"`
	Profile    string `json:"profile,omitempty"`

	Peers []Peer `json:"peers,omitempty"`
}

type SynInfo

type SynInfo struct {
	Number uint32
	Option uint32
}

Jump to

Keyboard shortcuts

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