123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- package libbox
- import (
- "net"
- "net/netip"
- "github.com/sagernet/sing-box/option"
- "github.com/sagernet/sing-tun"
- "github.com/sagernet/sing/common"
- E "github.com/sagernet/sing/common/exceptions"
- )
- type TunOptions interface {
- GetInet4Address() RoutePrefixIterator
- GetInet6Address() RoutePrefixIterator
- GetDNSServerAddress() (*StringBox, error)
- GetMTU() int32
- GetAutoRoute() bool
- GetStrictRoute() bool
- GetInet4RouteAddress() RoutePrefixIterator
- GetInet6RouteAddress() RoutePrefixIterator
- GetInet4RouteExcludeAddress() RoutePrefixIterator
- GetInet6RouteExcludeAddress() RoutePrefixIterator
- GetInet4RouteRange() RoutePrefixIterator
- GetInet6RouteRange() RoutePrefixIterator
- GetIncludePackage() StringIterator
- GetExcludePackage() StringIterator
- IsHTTPProxyEnabled() bool
- GetHTTPProxyServer() string
- GetHTTPProxyServerPort() int32
- GetHTTPProxyBypassDomain() StringIterator
- GetHTTPProxyMatchDomain() StringIterator
- }
- type RoutePrefix struct {
- address netip.Addr
- prefix int
- }
- func (p *RoutePrefix) Address() string {
- return p.address.String()
- }
- func (p *RoutePrefix) Prefix() int32 {
- return int32(p.prefix)
- }
- func (p *RoutePrefix) Mask() string {
- var bits int
- if p.address.Is6() {
- bits = 128
- } else {
- bits = 32
- }
- return net.IP(net.CIDRMask(p.prefix, bits)).String()
- }
- func (p *RoutePrefix) String() string {
- return netip.PrefixFrom(p.address, p.prefix).String()
- }
- type RoutePrefixIterator interface {
- Next() *RoutePrefix
- HasNext() bool
- }
- func mapRoutePrefix(prefixes []netip.Prefix) RoutePrefixIterator {
- return newIterator(common.Map(prefixes, func(prefix netip.Prefix) *RoutePrefix {
- return &RoutePrefix{
- address: prefix.Addr(),
- prefix: prefix.Bits(),
- }
- }))
- }
- var _ TunOptions = (*tunOptions)(nil)
- type tunOptions struct {
- *tun.Options
- routeRanges []netip.Prefix
- option.TunPlatformOptions
- }
- func (o *tunOptions) GetInet4Address() RoutePrefixIterator {
- return mapRoutePrefix(o.Inet4Address)
- }
- func (o *tunOptions) GetInet6Address() RoutePrefixIterator {
- return mapRoutePrefix(o.Inet6Address)
- }
- func (o *tunOptions) GetDNSServerAddress() (*StringBox, error) {
- if len(o.Inet4Address) == 0 || o.Inet4Address[0].Bits() == 32 {
- return nil, E.New("need one more IPv4 address for DNS hijacking")
- }
- return wrapString(o.Inet4Address[0].Addr().Next().String()), nil
- }
- func (o *tunOptions) GetMTU() int32 {
- return int32(o.MTU)
- }
- func (o *tunOptions) GetAutoRoute() bool {
- return o.AutoRoute
- }
- func (o *tunOptions) GetStrictRoute() bool {
- return o.StrictRoute
- }
- func (o *tunOptions) GetInet4RouteAddress() RoutePrefixIterator {
- return mapRoutePrefix(o.Inet4RouteAddress)
- }
- func (o *tunOptions) GetInet6RouteAddress() RoutePrefixIterator {
- return mapRoutePrefix(o.Inet6RouteAddress)
- }
- func (o *tunOptions) GetInet4RouteExcludeAddress() RoutePrefixIterator {
- return mapRoutePrefix(o.Inet4RouteExcludeAddress)
- }
- func (o *tunOptions) GetInet6RouteExcludeAddress() RoutePrefixIterator {
- return mapRoutePrefix(o.Inet6RouteExcludeAddress)
- }
- func (o *tunOptions) GetInet4RouteRange() RoutePrefixIterator {
- return mapRoutePrefix(common.Filter(o.routeRanges, func(it netip.Prefix) bool {
- return it.Addr().Is4()
- }))
- }
- func (o *tunOptions) GetInet6RouteRange() RoutePrefixIterator {
- return mapRoutePrefix(common.Filter(o.routeRanges, func(it netip.Prefix) bool {
- return it.Addr().Is6()
- }))
- }
- func (o *tunOptions) GetIncludePackage() StringIterator {
- return newIterator(o.IncludePackage)
- }
- func (o *tunOptions) GetExcludePackage() StringIterator {
- return newIterator(o.ExcludePackage)
- }
- func (o *tunOptions) IsHTTPProxyEnabled() bool {
- if o.TunPlatformOptions.HTTPProxy == nil {
- return false
- }
- return o.TunPlatformOptions.HTTPProxy.Enabled
- }
- func (o *tunOptions) GetHTTPProxyServer() string {
- return o.TunPlatformOptions.HTTPProxy.Server
- }
- func (o *tunOptions) GetHTTPProxyServerPort() int32 {
- return int32(o.TunPlatformOptions.HTTPProxy.ServerPort)
- }
- func (o *tunOptions) GetHTTPProxyBypassDomain() StringIterator {
- return newIterator(o.TunPlatformOptions.HTTPProxy.BypassDomain)
- }
- func (o *tunOptions) GetHTTPProxyMatchDomain() StringIterator {
- return newIterator(o.TunPlatformOptions.HTTPProxy.MatchDomain)
- }
|