tun

package module
v0.4.2 Latest Latest
Warning

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

Go to latest
Published: Nov 26, 2024 License: GPL-2.0 Imports: 43 Imported by: 13

README

sing-tun

Simple transparent proxy library.

For Linux, Windows, macOS and iOS.

License

Copyright (C) 2022 by nekohasekai <contact-sagernet@sekai.icu>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

Documentation

Index

Constants

View Source
const (
	EventInterfaceUpdate  = 1
	EventAndroidVPNUpdate = 2
	EventNoRoute          = 4
)
View Source
const (
	DefaultAutoRedirectInputMark  = 0x2023
	DefaultAutoRedirectOutputMark = 0x2024
)
View Source
const (
	DefaultIPRoute2TableIndex = 2022
	DefaultIPRoute2RuleIndex  = 9000
)
View Source
const PacketOffset = 0
View Source
const ProtocolRedirect = "redirect"
View Source
const WithGVisor = false

Variables

View Source
var ErrGVisorNotIncluded = E.New(`gVisor is not included in this build, rebuild with -tags with_gvisor`)
View Source
var ErrIncludeAllNetworks = E.New("`system` and `mixed` stack are not available when `includeAllNetworks` is enabled. See https://github.com/SagerNet/sing-tun/issues/25")
View Source
var ErrNetlinkBanned = E.New(
	"netlink socket in Android is banned by Google, " +
		"use the root or system (ADB) user to run sing-box, " +
		"or switch to the sing-box Adnroid graphical interface client",
)
View Source
var ErrNoRoute = E.New("no route to internet")
View Source
var ErrTooManySegments = E.New("too many segments")

Functions

func BroadcastAddr added in v0.2.0

func BroadcastAddr(inet4Address []netip.Prefix) netip.Addr

func CalculateInterfaceName

func CalculateInterfaceName(name string) (tunName string)

func HasNextAddress added in v0.4.1

func HasNextAddress(prefix netip.Prefix, count int) bool

func NetworkFromName added in v0.1.3

func NetworkFromName(name string) uint8

func NetworkName added in v0.1.3

func NetworkName(network uint8) string

Types

type AutoRedirect added in v0.4.1

type AutoRedirect interface {
	Start() error
	Close() error
	UpdateRouteAddressSet()
}

func NewAutoRedirect added in v0.4.1

func NewAutoRedirect(options AutoRedirectOptions) (AutoRedirect, error)

type AutoRedirectOptions added in v0.4.1

type AutoRedirectOptions struct {
	TunOptions             *Options
	Context                context.Context
	Handler                Handler
	Logger                 logger.Logger
	NetworkMonitor         NetworkUpdateMonitor
	InterfaceFinder        control.InterfaceFinder
	TableName              string
	DisableNFTables        bool
	CustomRedirectPort     func() int
	RouteAddressSet        *[]*netipx.IPSet
	RouteExcludeAddressSet *[]*netipx.IPSet
}

type DefaultInterfaceMonitor

type DefaultInterfaceMonitor interface {
	Start() error
	Close() error
	DefaultInterfaceName(destination netip.Addr) string
	DefaultInterfaceIndex(destination netip.Addr) int
	DefaultInterface(destination netip.Addr) (string, int)
	OverrideAndroidVPN() bool
	AndroidVPNEnabled() bool
	RegisterCallback(callback DefaultInterfaceUpdateCallback) *list.Element[DefaultInterfaceUpdateCallback]
	UnregisterCallback(element *list.Element[DefaultInterfaceUpdateCallback])
}

func NewDefaultInterfaceMonitor

func NewDefaultInterfaceMonitor(networkMonitor NetworkUpdateMonitor, logger logger.Logger, options DefaultInterfaceMonitorOptions) (DefaultInterfaceMonitor, error)

type DefaultInterfaceMonitorOptions

type DefaultInterfaceMonitorOptions struct {
	InterfaceFinder       control.InterfaceFinder
	OverrideAndroidVPN    bool
	UnderNetworkExtension bool
}

type DefaultInterfaceUpdateCallback

type DefaultInterfaceUpdateCallback = func(event int)

type Handler

type Handler interface {
	N.TCPConnectionHandler
	N.UDPConnectionHandler
	E.Handler
}

type LinuxTUN added in v0.2.0

type LinuxTUN interface {
	Tun
	N.FrontHeadroom
	BatchSize() int
	BatchRead(buffers [][]byte, offset int, readN []int) (n int, err error)
	BatchWrite(buffers [][]byte, offset int) error
	TXChecksumOffload() bool
}

type NativeTun

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

func (*NativeTun) BatchRead added in v0.2.0

func (t *NativeTun) BatchRead(buffers [][]byte, offset int, readN []int) (n int, err error)

func (*NativeTun) BatchSize added in v0.2.0

func (t *NativeTun) BatchSize() int

func (*NativeTun) BatchWrite added in v0.2.0

func (t *NativeTun) BatchWrite(buffers [][]byte, offset int) error

func (*NativeTun) Close

func (t *NativeTun) Close() error

func (*NativeTun) FrontHeadroom added in v0.2.0

func (t *NativeTun) FrontHeadroom() int

func (*NativeTun) Read

func (t *NativeTun) Read(p []byte) (n int, err error)

func (*NativeTun) TXChecksumOffload added in v0.2.0

func (t *NativeTun) TXChecksumOffload() bool

func (*NativeTun) Write

func (t *NativeTun) Write(p []byte) (n int, err error)

func (*NativeTun) WriteVectorised added in v0.2.0

func (t *NativeTun) WriteVectorised(buffers []*buf.Buffer) error

type NetworkUpdateCallback

type NetworkUpdateCallback = func()

type NetworkUpdateMonitor

type NetworkUpdateMonitor interface {
	Start() error
	Close() error
	RegisterCallback(callback NetworkUpdateCallback) *list.Element[NetworkUpdateCallback]
	UnregisterCallback(element *list.Element[NetworkUpdateCallback])
}

func NewNetworkUpdateMonitor

func NewNetworkUpdateMonitor(logger logger.Logger) (NetworkUpdateMonitor, error)

type Options

type Options struct {
	Name                     string
	Inet4Address             []netip.Prefix
	Inet6Address             []netip.Prefix
	MTU                      uint32
	GSO                      bool
	AutoRoute                bool
	Inet4Gateway             netip.Addr
	Inet6Gateway             netip.Addr
	DNSServers               []netip.Addr
	IPRoute2TableIndex       int
	IPRoute2RuleIndex        int
	AutoRedirectMarkMode     bool
	AutoRedirectInputMark    uint32
	AutoRedirectOutputMark   uint32
	StrictRoute              bool
	Inet4RouteAddress        []netip.Prefix
	Inet6RouteAddress        []netip.Prefix
	Inet4RouteExcludeAddress []netip.Prefix
	Inet6RouteExcludeAddress []netip.Prefix
	IncludeInterface         []string
	ExcludeInterface         []string
	IncludeUID               []ranges.Range[uint32]
	ExcludeUID               []ranges.Range[uint32]
	IncludeAndroidUser       []int
	IncludePackage           []string
	ExcludePackage           []string
	InterfaceMonitor         DefaultInterfaceMonitor
	FileDescriptor           int
	Logger                   logger.Logger

	// For library usages.
	EXP_DisableDNSHijack bool
	// contains filtered or unexported fields
}

func (*Options) BuildAndroidRules

func (o *Options) BuildAndroidRules(packageManager PackageManager, errorHandler E.Handler)

func (*Options) BuildAutoRouteRanges added in v0.2.0

func (o *Options) BuildAutoRouteRanges(underNetworkExtension bool) ([]netip.Prefix, error)

func (*Options) ExcludedRanges

func (o *Options) ExcludedRanges() (uidRanges []ranges.Range[uint32])

func (*Options) Inet4GatewayAddr added in v0.4.1

func (o *Options) Inet4GatewayAddr() netip.Addr

func (*Options) Inet6GatewayAddr added in v0.4.1

func (o *Options) Inet6GatewayAddr() netip.Addr

type PackageManager

type PackageManager interface {
	Start() error
	Close() error
	IDByPackage(packageName string) (uint32, bool)
	IDBySharedPackage(sharedPackage string) (uint32, bool)
	PackageByID(id uint32) (string, bool)
	SharedPackageByID(id uint32) (string, bool)
}

func NewPackageManager

func NewPackageManager(options PackageManagerOptions) (PackageManager, error)

type PackageManagerCallback

type PackageManagerCallback interface {
	OnPackagesUpdated(packages int, sharedUsers int)
}

type PackageManagerOptions added in v0.4.1

type PackageManagerOptions struct {
	Callback PackageManagerCallback

	// Logger is the logger to log errors
	// optional
	Logger logger.Logger
}

type Session

type Session struct {
	SourceAddress      netip.Addr
	DestinationAddress netip.Addr
	SourcePort         uint16
	DestinationPort    uint16
}

type Stack

type Stack interface {
	Start() error
	Close() error
}

func NewGVisor

func NewGVisor(
	options StackOptions,
) (Stack, error)

func NewMixed added in v0.1.11

func NewMixed(
	options StackOptions,
) (Stack, error)

func NewStack

func NewStack(
	stack string,
	options StackOptions,
) (Stack, error)

func NewSystem

func NewSystem(options StackOptions) (Stack, error)

type StackOptions

type StackOptions struct {
	Context                context.Context
	Tun                    Tun
	TunOptions             Options
	EndpointIndependentNat bool
	UDPTimeout             int64
	Handler                Handler
	Logger                 logger.Logger
	ForwarderBindInterface bool
	IncludeAllNetworks     bool
	InterfaceFinder        control.InterfaceFinder
	EnforceBindInterface   bool
}

type System

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

func (*System) Close

func (s *System) Close() error

func (*System) Start

func (s *System) Start() error

type TCPNat

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

func NewNat

func NewNat(ctx context.Context, timeout time.Duration) *TCPNat

func (*TCPNat) Lookup

func (n *TCPNat) Lookup(source netip.AddrPort, destination netip.AddrPort) uint16

func (*TCPNat) LookupBack

func (n *TCPNat) LookupBack(port uint16) *TCPSession

type TCPSession

type TCPSession struct {
	Source      netip.AddrPort
	Destination netip.AddrPort
	LastActive  time.Time
}

type Tun

type Tun interface {
	io.ReadWriter
	N.VectorisedWriter
	Close() error
}

func New added in v0.1.2

func New(options Options) (Tun, error)

type WinTun

type WinTun interface {
	Tun
	ReadPacket() ([]byte, func(), error)
}

Directories

Path Synopsis
internal

Jump to

Keyboard shortcuts

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