Documentation
¶
Index ¶
- Constants
- Variables
- func ReportUDPUnreachable(packet UDPPacket) error
- func SetConfig(file string)
- func SetHomeDir(root string)
- type AdapterType
- type AddrType
- type Chain
- type Conn
- type ConnContext
- type Connection
- type DNSMode
- type DNSPrefer
- type DelayHistory
- type DelayHistoryStoreType
- type Dialer
- type DomainMatcher
- type ErrNotSafePath
- type FilterMode
- type HTTPVersion
- type InboundConfig
- type InboundListenConfig
- type InboundListener
- type IpMatcher
- type Listener
- type Metadata
- func (m *Metadata) AddrPort() netip.AddrPort
- func (m *Metadata) AddrType() AddrType
- func (m *Metadata) Clone() *Metadata
- func (m *Metadata) HasUID() bool
- func (m *Metadata) Pure() *Metadata
- func (m *Metadata) RemoteAddress() string
- func (m *Metadata) Resolved() bool
- func (m *Metadata) RuleHost() string
- func (m *Metadata) SetRemoteAddr(addr net.Addr) error
- func (m *Metadata) SetRemoteAddress(rawAddress string) error
- func (m *Metadata) SourceAddrPort() netip.AddrPort
- func (m *Metadata) SourceAddress() string
- func (m *Metadata) SourceDetail() string
- func (m *Metadata) SourceValid() bool
- func (m *Metadata) String() string
- func (m *Metadata) SwapSrcDst()
- func (m *Metadata) UDPAddr() *net.UDPAddr
- func (m *Metadata) Valid() bool
- type MultiAddrListener
- type NatTable
- type NetWork
- type PacketAdapter
- type PacketConn
- type PacketConnContext
- type PacketSender
- type PlainContext
- type Proxy
- type ProxyAdapter
- type ProxyInfo
- type ProxyState
- type Rule
- type RuleGroup
- type RuleMatchHelper
- type RuleType
- type RuleWrapper
- type TUNStack
- type Tunnel
- type Type
- type UDPPacket
- type UDPPacketInAddr
- type WriteBack
- type WriteBackProxy
Constants ¶
const ( DefaultTCPTimeout = dialer.DefaultTCPTimeout DefaultUDPTimeout = dialer.DefaultUDPTimeout DefaultDropTime = 12 * DefaultTCPTimeout DefaultTLSTimeout = DefaultTCPTimeout DefaultTestURL = "https://www.gstatic.com/generate_204" )
const Name = "mihomo"
Variables ¶
var ( GeositeName = "GeoSite.dat" GeoipName = "GeoIP.dat" ASNName = "ASN.mmdb" BundleMRSName = "BundleMRS.7z" )
var ( Meta = true Version = "1.10.0" BuildTime = "unknown time" MihomoName = "mihomo" )
var DNSModeMapping = map[string]DNSMode{ DNSNormal.String(): DNSNormal, DNSFakeIP.String(): DNSFakeIP, DNSMapping.String(): DNSMapping, }
DNSModeMapping is a mapping for EnhancedMode enum
var ErrNotSupport = errors.New("no support")
var FilterModeMapping = map[string]FilterMode{ FilterBlackList.String(): FilterBlackList, FilterWhiteList.String(): FilterWhiteList, FilterRule.String(): FilterRule, }
FilterModeMapping is a mapping for FilterMode enum
var Path = func() *path { homeDir, err := os.UserHomeDir() if err != nil { homeDir, _ = os.Getwd() } allowUnsafePath, _ := strconv.ParseBool(os.Getenv("SKIP_SAFE_PATH_CHECK")) homeDir = P.Join(homeDir, ".config", Name) if _, err = os.Stat(homeDir); err != nil { if configHome, ok := os.LookupEnv("XDG_CONFIG_HOME"); ok { homeDir = P.Join(configHome, Name) } } var safePaths []string for _, safePath := range filepath.SplitList(os.Getenv("SAFE_PATHS")) { safePath = strings.TrimSpace(safePath) if len(safePath) == 0 { continue } safePaths = append(safePaths, safePath) } return &path{homeDir: homeDir, configFile: "config.yaml", allowUnsafePath: allowUnsafePath, safePaths: safePaths} }()
Path is used to get the configuration path
on Unix systems, `$HOME/.config/mihomo`. on Windows, `%USERPROFILE%/.config/mihomo`.
Functions ¶
func ReportUDPUnreachable ¶
Types ¶
type AdapterType ¶
type AdapterType int
AdapterType is enum of adapter type
const ( Direct AdapterType = iota Reject RejectDrop Compatible Pass PassRule Rematch Dns Relay Selector Fallback URLTest LoadBalance Shadowsocks ShadowsocksR Snell Socks5 Http Vmess Vless Trojan Hysteria Hysteria2 WireGuard Tuic Ssh Mieru AnyTLS Sudoku Masque TrustTunnel ShadowQuic OpenVPN Tailscale ZeroTier EasyTier GostRelay )
Adapter Type
func (AdapterType) String ¶
func (at AdapterType) String() string
type Conn ¶
type Conn interface {
N.ExtendedConn
Connection
}
type ConnContext ¶
type ConnContext interface {
PlainContext
Metadata() *Metadata
Conn() *N.BufferedConn
}
type Connection ¶
type Connection interface {
Chains() Chain
ProviderChains() Chain
AppendToChains(adapter ProxyAdapter)
RemoteDestination() string
}
type DNSMode ¶
type DNSMode int
func (DNSMode) MarshalText ¶
MarshalText serialize EnhancedMode
func (*DNSMode) UnmarshalText ¶
UnmarshalText unserialize EnhancedMode
type DNSPrefer ¶
type DNSPrefer int
func (DNSPrefer) MarshalText ¶
func (*DNSPrefer) UnmarshalText ¶
type DelayHistory ¶
type DelayHistoryStoreType ¶
type DelayHistoryStoreType int
type DomainMatcher ¶
type ErrNotSafePath ¶
func (ErrNotSafePath) Error ¶
func (e ErrNotSafePath) Error() string
type FilterMode ¶
type FilterMode int
const ( FilterBlackList FilterMode = iota FilterWhiteList FilterRule )
func (FilterMode) MarshalText ¶
func (e FilterMode) MarshalText() ([]byte, error)
func (FilterMode) String ¶
func (e FilterMode) String() string
func (*FilterMode) UnmarshalText ¶
func (e *FilterMode) UnmarshalText(data []byte) error
type HTTPVersion ¶
type HTTPVersion string
const ( // HTTPVersion11 is HTTP/1.1. HTTPVersion11 HTTPVersion = "http/1.1" // HTTPVersion2 is HTTP/2. HTTPVersion2 HTTPVersion = "h2" // HTTPVersion3 is HTTP/3. HTTPVersion3 HTTPVersion = "h3" )
type InboundConfig ¶
type InboundConfig interface {
Name() string
Equal(config InboundConfig) bool
}
type InboundListenConfig ¶
type InboundListener ¶
type Metadata ¶
type Metadata struct {
NetWork NetWork `json:"network"`
Type Type `json:"type"`
SrcIP netip.Addr `json:"sourceIP"`
DstIP netip.Addr `json:"destinationIP"`
SrcGeoIP []string `json:"sourceGeoIP"` // can be nil if never queried, empty slice if got no result
DstGeoIP []string `json:"destinationGeoIP"` // can be nil if never queried, empty slice if got no result
SrcIPASN string `json:"sourceIPASN"`
DstIPASN string `json:"destinationIPASN"`
SrcPort uint16 `json:"sourcePort,string"` // `,string` is used to compatible with old version json output
DstPort uint16 `json:"destinationPort,string"` // `,string` is used to compatible with old version json output
InIP netip.Addr `json:"inboundIP"`
InPort uint16 `json:"inboundPort,string"` // `,string` is used to compatible with old version json output
InName string `json:"inboundName"`
InUser string `json:"inboundUser"`
RematchName string `json:"rematchName"`
Host string `json:"host"`
DNSMode DNSMode `json:"dnsMode"`
Uid uint32 `json:"uid"`
UidKnown bool `json:"uidKnown"`
Process string `json:"process"`
ProcessPath string `json:"processPath"`
SourceIdentityKnown bool `json:"sourceIdentityKnown"`
SourceAppSigningIdentifier string `json:"sourceAppSigningIdentifier"`
SourceAppTeamIdentifier string `json:"sourceAppTeamIdentifier"`
SpecialProxy string `json:"specialProxy"`
SpecialRules string `json:"specialRules"`
RemoteDst string `json:"remoteDestination"`
DSCP uint8 `json:"dscp"`
RawSrcAddr net.Addr `json:"-"`
RawDstAddr net.Addr `json:"-"`
// Only domain rule
SniffHost string `json:"sniffHost"`
}
Metadata is used to store connection address
func (*Metadata) Pure ¶
Pure is used to solve unexpected behavior when dialing proxy connection in DNSMapping mode.
func (*Metadata) RemoteAddress ¶
func (*Metadata) SetRemoteAddress ¶
func (*Metadata) SourceAddrPort ¶
func (*Metadata) SourceAddress ¶
func (*Metadata) SourceDetail ¶
func (*Metadata) SourceValid ¶
func (*Metadata) SwapSrcDst ¶
func (m *Metadata) SwapSrcDst()
type MultiAddrListener ¶
type NatTable ¶
type NatTable interface {
GetOrCreate(key string, maker func() PacketSender) (PacketSender, bool)
Delete(key string)
GetForLocalConn(lAddr, rAddr string) *net.UDPConn
AddForLocalConn(lAddr, rAddr string, conn *net.UDPConn) bool
RangeForLocalConn(lAddr string, f func(key string, value *net.UDPConn) bool)
GetOrCreateLockForLocalConn(lAddr string, key string) (*sync.Cond, bool)
DeleteForLocalConn(lAddr, key string)
DeleteLockForLocalConn(lAddr, key string)
}
type PacketAdapter ¶
type PacketAdapter interface {
UDPPacket
// Metadata returns destination metadata
Metadata() *Metadata
// Key is a SNAT key
Key() string
}
PacketAdapter is a UDP Packet adapter for socks/redir/tun
func NewPacketAdapter ¶
func NewPacketAdapter(packet UDPPacket, metadata *Metadata) PacketAdapter
type PacketConn ¶
type PacketConn interface {
N.EnhancePacketConn
Connection
ResolveUDP(ctx context.Context, metadata *Metadata) error
}
type PacketConnContext ¶
type PacketConnContext interface {
PlainContext
Metadata() *Metadata
PacketConn() net.PacketConn
}
type PacketSender ¶
type PacketSender interface {
// Send will send PacketAdapter nonblocking
// the implement must call UDPPacket.Drop() inside Send
Send(PacketAdapter)
// Process is a blocking loop to send PacketAdapter to PacketConn and update the WriteBackProxy
Process(PacketConn, WriteBackProxy)
// Close stop the Process loop
Close()
// DoSniff will blocking after sniffer work done
DoSniff(*Metadata) error
// AddMapping add a destination NAT record
AddMapping(originMetadata *Metadata, metadata *Metadata)
// RestoreReadFrom restore destination NAT for ReadFrom
// the implement must ensure returned netip.Add is valid (or just return input addr)
RestoreReadFrom(addr netip.Addr) netip.Addr
}
type PlainContext ¶
type Proxy ¶
type Proxy interface {
ProxyAdapter
Adapter() ProxyAdapter
AliveForTestUrl(url string) bool
DelayHistory() []DelayHistory
ExtraDelayHistories() map[string]ProxyState
LastDelayForTestUrl(url string) uint16
URLTest(ctx context.Context, url string, expectedStatus utils.IntRanges[uint16]) (uint16, error)
}
type ProxyAdapter ¶
type ProxyAdapter interface {
Name() string
Type() AdapterType
Addr() string
SupportUDP() bool
// ProxyInfo contains some extra information maybe useful for MarshalJSON
ProxyInfo() ProxyInfo
MarshalJSON() ([]byte, error)
// DialContext return a C.Conn with protocol which
// contains multiplexing-related reuse logic (if any)
DialContext(ctx context.Context, metadata *Metadata) (Conn, error)
ListenPacketContext(ctx context.Context, metadata *Metadata) (PacketConn, error)
// SupportUOT return UDP over TCP support
SupportUOT() bool
// IsL3Protocol return ProxyAdapter working in L3 (tell dns module not pass the domain to avoid loopback)
IsL3Protocol(metadata *Metadata) bool
// Unwrap extracts the proxy from a proxy-group. It returns nil when nothing to extract.
Unwrap(metadata *Metadata, touch bool) Proxy
// Close releasing associated resources
Close() error
}
type ProxyState ¶
type ProxyState struct {
Alive bool `json:"alive"`
History []DelayHistory `json:"history"`
}
type RuleMatchHelper ¶
type RuleType ¶
type RuleType int
const ( Domain RuleType = iota DomainSuffix DomainKeyword DomainRegex DomainWildcard GEOSITE GEOIP SrcGEOIP IPASN SrcIPASN IPCIDR SrcIPCIDR IPSuffix SrcIPSuffix SrcPort DstPort InPort DSCP InUser InName InType ProcessName ProcessPath ProcessNameRegex ProcessPathRegex ProcessNameWildcard ProcessPathWildcard RematchName RuleSet Network Uid SubRules MATCH AND OR NOT SourceAppSigningID SourceAppTeamID )
Rule Type
type RuleWrapper ¶
type RuleWrapper interface {
Rule
// SetDisabled to set enable/disable rule
SetDisabled(v bool)
// IsDisabled return rule is disabled or not
IsDisabled() bool
// HitCount for statistics
HitCount() uint64
// HitAt for statistics
HitAt() time.Time
// MissCount for statistics
MissCount() uint64
// MissAt for statistics
MissAt() time.Time
// Unwrap return Rule
Unwrap() Rule
}
type TUNStack ¶
type TUNStack int
func (TUNStack) MarshalText ¶
MarshalText serialize TUNStack with json
func (*TUNStack) UnmarshalText ¶
UnmarshalText unserialize TUNStack
type UDPPacket ¶
type UDPPacket interface {
// Data get the payload of UDP Packet
Data() []byte
// WriteBack writes the payload with source IP/Port equals addr
// - variable source IP/Port is important to STUN
// - if addr is not provided, WriteBack will write out UDP packet with SourceIP/Port equals to original Target,
// this is important when using Fake-IP.
WriteBack
// Drop call after packet is used, could recycle buffer in this function.
Drop()
// LocalAddr returns the source IP/Port of packet
LocalAddr() net.Addr
}
UDPPacket contains the data of UDP packet, and offers control/info of UDP packet's source