service.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package libbox
  2. import (
  3. "crypto/rand"
  4. "encoding/hex"
  5. "errors"
  6. "net"
  7. "net/netip"
  8. "runtime"
  9. "strconv"
  10. "sync"
  11. "syscall"
  12. "github.com/sagernet/sing-box/adapter"
  13. C "github.com/sagernet/sing-box/constant"
  14. "github.com/sagernet/sing-box/experimental/libbox/internal/procfs"
  15. "github.com/sagernet/sing-box/option"
  16. tun "github.com/sagernet/sing-tun"
  17. "github.com/sagernet/sing/common"
  18. "github.com/sagernet/sing/common/control"
  19. E "github.com/sagernet/sing/common/exceptions"
  20. "github.com/sagernet/sing/common/logger"
  21. )
  22. var _ adapter.PlatformInterface = (*platformInterfaceWrapper)(nil)
  23. type platformInterfaceWrapper struct {
  24. iif PlatformInterface
  25. useProcFS bool
  26. networkManager adapter.NetworkManager
  27. myTunName string
  28. defaultInterfaceAccess sync.Mutex
  29. defaultInterface *control.Interface
  30. isExpensive bool
  31. isConstrained bool
  32. }
  33. func (w *platformInterfaceWrapper) Initialize(networkManager adapter.NetworkManager) error {
  34. w.networkManager = networkManager
  35. return nil
  36. }
  37. func (w *platformInterfaceWrapper) UsePlatformAutoDetectInterfaceControl() bool {
  38. return w.iif.UsePlatformAutoDetectInterfaceControl()
  39. }
  40. func (w *platformInterfaceWrapper) AutoDetectInterfaceControl(fd int) error {
  41. return w.iif.AutoDetectInterfaceControl(int32(fd))
  42. }
  43. func (w *platformInterfaceWrapper) UsePlatformInterface() bool {
  44. return true
  45. }
  46. func (w *platformInterfaceWrapper) OpenInterface(options *tun.Options, platformOptions option.TunPlatformOptions) (tun.Tun, error) {
  47. if len(options.IncludeUID) > 0 || len(options.ExcludeUID) > 0 {
  48. return nil, E.New("platform: unsupported uid options")
  49. }
  50. if len(options.IncludeAndroidUser) > 0 {
  51. return nil, E.New("platform: unsupported android_user option")
  52. }
  53. routeRanges, err := options.BuildAutoRouteRanges(true)
  54. if err != nil {
  55. return nil, err
  56. }
  57. tunFd, err := w.iif.OpenTun(&tunOptions{options, routeRanges, platformOptions})
  58. if err != nil {
  59. return nil, err
  60. }
  61. options.Name, err = getTunnelName(tunFd)
  62. if err != nil {
  63. return nil, E.Cause(err, "query tun name")
  64. }
  65. options.InterfaceMonitor.RegisterMyInterface(options.Name)
  66. dupFd, err := dup(int(tunFd))
  67. if err != nil {
  68. return nil, E.Cause(err, "dup tun file descriptor")
  69. }
  70. options.FileDescriptor = dupFd
  71. w.myTunName = options.Name
  72. w.iif.RegisterMyInterface(options.Name)
  73. return tun.New(*options)
  74. }
  75. func (w *platformInterfaceWrapper) UsePlatformDefaultInterfaceMonitor() bool {
  76. return true
  77. }
  78. func (w *platformInterfaceWrapper) CreateDefaultInterfaceMonitor(logger logger.Logger) tun.DefaultInterfaceMonitor {
  79. return &platformDefaultInterfaceMonitor{
  80. platformInterfaceWrapper: w,
  81. logger: logger,
  82. }
  83. }
  84. func (w *platformInterfaceWrapper) UsePlatformNetworkInterfaces() bool {
  85. return true
  86. }
  87. func (w *platformInterfaceWrapper) NetworkInterfaces() ([]adapter.NetworkInterface, error) {
  88. interfaceIterator, err := w.iif.GetInterfaces()
  89. if err != nil {
  90. return nil, err
  91. }
  92. var interfaces []adapter.NetworkInterface
  93. for _, netInterface := range iteratorToArray[*NetworkInterface](interfaceIterator) {
  94. if netInterface.Name == w.myTunName {
  95. continue
  96. }
  97. w.defaultInterfaceAccess.Lock()
  98. // (GOOS=windows) SA4006: this value of `isDefault` is never used
  99. // Why not used?
  100. //nolint:staticcheck
  101. isDefault := w.defaultInterface != nil && int(netInterface.Index) == w.defaultInterface.Index
  102. w.defaultInterfaceAccess.Unlock()
  103. interfaces = append(interfaces, adapter.NetworkInterface{
  104. Interface: control.Interface{
  105. Index: int(netInterface.Index),
  106. MTU: int(netInterface.MTU),
  107. Name: netInterface.Name,
  108. Addresses: common.Map(iteratorToArray[string](netInterface.Addresses), netip.MustParsePrefix),
  109. Flags: linkFlags(uint32(netInterface.Flags)),
  110. },
  111. Type: C.InterfaceType(netInterface.Type),
  112. DNSServers: iteratorToArray[string](netInterface.DNSServer),
  113. Expensive: netInterface.Metered || isDefault && w.isExpensive,
  114. Constrained: isDefault && w.isConstrained,
  115. })
  116. }
  117. interfaces = common.UniqBy(interfaces, func(it adapter.NetworkInterface) string {
  118. return it.Name
  119. })
  120. return interfaces, nil
  121. }
  122. func (w *platformInterfaceWrapper) UnderNetworkExtension() bool {
  123. return w.iif.UnderNetworkExtension()
  124. }
  125. func (w *platformInterfaceWrapper) NetworkExtensionIncludeAllNetworks() bool {
  126. return w.iif.IncludeAllNetworks()
  127. }
  128. func (w *platformInterfaceWrapper) ClearDNSCache() {
  129. w.iif.ClearDNSCache()
  130. }
  131. func (w *platformInterfaceWrapper) RequestPermissionForWIFIState() error {
  132. return nil
  133. }
  134. func (w *platformInterfaceWrapper) UsePlatformWIFIMonitor() bool {
  135. return true
  136. }
  137. func (w *platformInterfaceWrapper) ReadWIFIState() adapter.WIFIState {
  138. wifiState := w.iif.ReadWIFIState()
  139. if wifiState == nil {
  140. return adapter.WIFIState{}
  141. }
  142. return (adapter.WIFIState)(*wifiState)
  143. }
  144. func (w *platformInterfaceWrapper) SystemCertificates() []string {
  145. return iteratorToArray[string](w.iif.SystemCertificates())
  146. }
  147. func (w *platformInterfaceWrapper) UsePlatformConnectionOwnerFinder() bool {
  148. return true
  149. }
  150. func (w *platformInterfaceWrapper) FindConnectionOwner(request *adapter.FindConnectionOwnerRequest) (*adapter.ConnectionOwner, error) {
  151. if w.useProcFS {
  152. var source netip.AddrPort
  153. var destination netip.AddrPort
  154. sourceAddr, _ := netip.ParseAddr(request.SourceAddress)
  155. source = netip.AddrPortFrom(sourceAddr, uint16(request.SourcePort))
  156. destAddr, _ := netip.ParseAddr(request.DestinationAddress)
  157. destination = netip.AddrPortFrom(destAddr, uint16(request.DestinationPort))
  158. var network string
  159. switch request.IpProtocol {
  160. case int32(syscall.IPPROTO_TCP):
  161. network = "tcp"
  162. case int32(syscall.IPPROTO_UDP):
  163. network = "udp"
  164. default:
  165. return nil, E.New("unknown protocol: ", request.IpProtocol)
  166. }
  167. uid := procfs.ResolveSocketByProcSearch(network, source, destination)
  168. if uid == -1 {
  169. return nil, E.New("procfs: not found")
  170. }
  171. return &adapter.ConnectionOwner{
  172. UserId: uid,
  173. }, nil
  174. }
  175. result, err := w.iif.FindConnectionOwner(request.IpProtocol, request.SourceAddress, request.SourcePort, request.DestinationAddress, request.DestinationPort)
  176. if err != nil {
  177. return nil, err
  178. }
  179. return &adapter.ConnectionOwner{
  180. UserId: result.UserId,
  181. UserName: result.UserName,
  182. ProcessPath: result.ProcessPath,
  183. AndroidPackageNames: result.androidPackageNames,
  184. }, nil
  185. }
  186. func (w *platformInterfaceWrapper) DisableColors() bool {
  187. return runtime.GOOS != "android"
  188. }
  189. func (w *platformInterfaceWrapper) UsePlatformNotification() bool {
  190. return true
  191. }
  192. func (w *platformInterfaceWrapper) SendNotification(notification *adapter.Notification) error {
  193. return w.iif.SendNotification((*Notification)(notification))
  194. }
  195. func (w *platformInterfaceWrapper) UsePlatformNeighborResolver() bool {
  196. return true
  197. }
  198. func (w *platformInterfaceWrapper) StartNeighborMonitor(listener adapter.NeighborUpdateListener) error {
  199. return w.iif.StartNeighborMonitor(&neighborUpdateListenerWrapper{listener: listener})
  200. }
  201. func (w *platformInterfaceWrapper) CloseNeighborMonitor(listener adapter.NeighborUpdateListener) error {
  202. return w.iif.CloseNeighborMonitor(nil)
  203. }
  204. type neighborUpdateListenerWrapper struct {
  205. listener adapter.NeighborUpdateListener
  206. }
  207. func (w *neighborUpdateListenerWrapper) UpdateNeighborTable(entries NeighborEntryIterator) {
  208. var result []adapter.NeighborEntry
  209. for entries.HasNext() {
  210. entry := entries.Next()
  211. if entry == nil {
  212. continue
  213. }
  214. address, err := netip.ParseAddr(entry.Address)
  215. if err != nil {
  216. continue
  217. }
  218. macAddress, err := net.ParseMAC(entry.MacAddress)
  219. if err != nil {
  220. continue
  221. }
  222. result = append(result, adapter.NeighborEntry{
  223. Address: address,
  224. MACAddress: macAddress,
  225. Hostname: entry.Hostname,
  226. })
  227. }
  228. w.listener.UpdateNeighborTable(result)
  229. }
  230. func AvailablePort(startPort int32) (int32, error) {
  231. for port := int(startPort); ; port++ {
  232. if port > 65535 {
  233. return 0, E.New("no available port found")
  234. }
  235. listener, err := net.Listen("tcp", net.JoinHostPort("127.0.0.1", strconv.Itoa(int(port))))
  236. if err != nil {
  237. if errors.Is(err, syscall.EADDRINUSE) {
  238. continue
  239. }
  240. return 0, E.Cause(err, "find available port")
  241. }
  242. err = listener.Close()
  243. if err != nil {
  244. return 0, E.Cause(err, "close listener")
  245. }
  246. return int32(port), nil
  247. }
  248. }
  249. func RandomHex(length int32) *StringBox {
  250. bytes := make([]byte, length)
  251. common.Must1(rand.Read(bytes))
  252. return wrapString(hex.EncodeToString(bytes))
  253. }