system_dialer.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package internet
  2. import (
  3. "context"
  4. "math/rand"
  5. gonet "net"
  6. "syscall"
  7. "time"
  8. "github.com/sagernet/sing/common/control"
  9. "github.com/xtls/xray-core/common/errors"
  10. "github.com/xtls/xray-core/common/net"
  11. "github.com/xtls/xray-core/features/dns"
  12. "github.com/xtls/xray-core/features/outbound"
  13. )
  14. var effectiveSystemDialer SystemDialer = &DefaultSystemDialer{}
  15. type SystemDialer interface {
  16. Dial(ctx context.Context, source net.Address, destination net.Destination, sockopt *SocketConfig) (net.Conn, error)
  17. DestIpAddress() net.IP
  18. }
  19. type DefaultSystemDialer struct {
  20. controllers []control.Func
  21. dns dns.Client
  22. obm outbound.Manager
  23. }
  24. func resolveSrcAddr(network net.Network, src net.Address) net.Addr {
  25. if src == nil || src == net.AnyIP {
  26. return nil
  27. }
  28. if network == net.Network_TCP {
  29. return &net.TCPAddr{
  30. IP: src.IP(),
  31. Port: 0,
  32. }
  33. }
  34. return &net.UDPAddr{
  35. IP: src.IP(),
  36. Port: 0,
  37. }
  38. }
  39. func hasBindAddr(sockopt *SocketConfig) bool {
  40. return sockopt != nil && len(sockopt.BindAddress) > 0 && sockopt.BindPort > 0
  41. }
  42. func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest net.Destination, sockopt *SocketConfig) (net.Conn, error) {
  43. errors.LogDebug(ctx, "dialing to "+dest.String())
  44. if dest.Network == net.Network_UDP && !hasBindAddr(sockopt) {
  45. srcAddr := resolveSrcAddr(net.Network_UDP, src)
  46. if srcAddr == nil {
  47. srcAddr = &net.UDPAddr{
  48. IP: []byte{0, 0, 0, 0},
  49. Port: 0,
  50. }
  51. }
  52. var lc net.ListenConfig
  53. destAddr, err := net.ResolveUDPAddr("udp", dest.NetAddr())
  54. if err != nil {
  55. return nil, err
  56. }
  57. lc.Control = func(network, address string, c syscall.RawConn) error {
  58. for _, ctl := range d.controllers {
  59. if err := ctl(network, address, c); err != nil {
  60. errors.LogInfoInner(ctx, err, "failed to apply external controller")
  61. }
  62. }
  63. return c.Control(func(fd uintptr) {
  64. if sockopt != nil {
  65. if err := applyOutboundSocketOptions(network, destAddr.String(), fd, sockopt); err != nil {
  66. errors.LogInfo(ctx, err, "failed to apply socket options")
  67. }
  68. }
  69. })
  70. }
  71. packetConn, err := lc.ListenPacket(ctx, srcAddr.Network(), srcAddr.String())
  72. if err != nil {
  73. return nil, err
  74. }
  75. return &PacketConnWrapper{
  76. Conn: packetConn,
  77. Dest: destAddr,
  78. }, nil
  79. }
  80. // Chrome defaults
  81. keepAliveConfig := gonet.KeepAliveConfig{
  82. Enable: true,
  83. Idle: 45 * time.Second,
  84. Interval: 45 * time.Second,
  85. Count: -1,
  86. }
  87. keepAlive := time.Duration(0)
  88. if sockopt != nil {
  89. if sockopt.TcpKeepAliveIdle*sockopt.TcpKeepAliveInterval < 0 {
  90. return nil, errors.New("invalid TcpKeepAliveIdle or TcpKeepAliveInterval value: ", sockopt.TcpKeepAliveIdle, " ", sockopt.TcpKeepAliveInterval)
  91. }
  92. if sockopt.TcpKeepAliveIdle < 0 || sockopt.TcpKeepAliveInterval < 0 {
  93. keepAlive = -1
  94. keepAliveConfig.Enable = false
  95. }
  96. if sockopt.TcpKeepAliveIdle > 0 {
  97. keepAliveConfig.Idle = time.Duration(sockopt.TcpKeepAliveIdle) * time.Second
  98. }
  99. if sockopt.TcpKeepAliveInterval > 0 {
  100. keepAliveConfig.Interval = time.Duration(sockopt.TcpKeepAliveInterval) * time.Second
  101. }
  102. }
  103. dialer := &net.Dialer{
  104. Timeout: time.Second * 16,
  105. LocalAddr: resolveSrcAddr(dest.Network, src),
  106. KeepAlive: keepAlive,
  107. KeepAliveConfig: keepAliveConfig,
  108. }
  109. if sockopt != nil || len(d.controllers) > 0 {
  110. if sockopt != nil && sockopt.TcpMptcp {
  111. dialer.SetMultipathTCP(true)
  112. }
  113. dialer.Control = func(network, address string, c syscall.RawConn) error {
  114. for _, ctl := range d.controllers {
  115. if err := ctl(network, address, c); err != nil {
  116. errors.LogInfoInner(ctx, err, "failed to apply external controller")
  117. }
  118. }
  119. return c.Control(func(fd uintptr) {
  120. if sockopt != nil {
  121. if err := applyOutboundSocketOptions(network, address, fd, sockopt); err != nil {
  122. errors.LogInfoInner(ctx, err, "failed to apply socket options")
  123. }
  124. if dest.Network == net.Network_UDP && hasBindAddr(sockopt) {
  125. if err := bindAddr(fd, sockopt.BindAddress, sockopt.BindPort); err != nil {
  126. errors.LogInfoInner(ctx, err, "failed to bind source address to ", sockopt.BindAddress)
  127. }
  128. }
  129. }
  130. })
  131. }
  132. }
  133. return dialer.DialContext(ctx, dest.Network.SystemString(), dest.NetAddr())
  134. }
  135. func (d *DefaultSystemDialer) DestIpAddress() net.IP {
  136. return nil
  137. }
  138. type PacketConnWrapper struct {
  139. Conn net.PacketConn
  140. Dest net.Addr
  141. }
  142. func (c *PacketConnWrapper) Close() error {
  143. return c.Conn.Close()
  144. }
  145. func (c *PacketConnWrapper) LocalAddr() net.Addr {
  146. return c.Conn.LocalAddr()
  147. }
  148. func (c *PacketConnWrapper) RemoteAddr() net.Addr {
  149. return c.Dest
  150. }
  151. func (c *PacketConnWrapper) Write(p []byte) (int, error) {
  152. return c.Conn.WriteTo(p, c.Dest)
  153. }
  154. func (c *PacketConnWrapper) Read(p []byte) (int, error) {
  155. n, _, err := c.Conn.ReadFrom(p)
  156. return n, err
  157. }
  158. func (c *PacketConnWrapper) WriteTo(p []byte, d net.Addr) (int, error) {
  159. return c.Conn.WriteTo(p, d)
  160. }
  161. func (c *PacketConnWrapper) ReadFrom(p []byte) (int, net.Addr, error) {
  162. return c.Conn.ReadFrom(p)
  163. }
  164. func (c *PacketConnWrapper) SetDeadline(t time.Time) error {
  165. return c.Conn.SetDeadline(t)
  166. }
  167. func (c *PacketConnWrapper) SetReadDeadline(t time.Time) error {
  168. return c.Conn.SetReadDeadline(t)
  169. }
  170. func (c *PacketConnWrapper) SetWriteDeadline(t time.Time) error {
  171. return c.Conn.SetWriteDeadline(t)
  172. }
  173. type SystemDialerAdapter interface {
  174. Dial(network string, address string) (net.Conn, error)
  175. }
  176. type SimpleSystemDialer struct {
  177. adapter SystemDialerAdapter
  178. }
  179. func WithAdapter(dialer SystemDialerAdapter) SystemDialer {
  180. return &SimpleSystemDialer{
  181. adapter: dialer,
  182. }
  183. }
  184. func (v *SimpleSystemDialer) Dial(ctx context.Context, src net.Address, dest net.Destination, sockopt *SocketConfig) (net.Conn, error) {
  185. return v.adapter.Dial(dest.Network.SystemString(), dest.NetAddr())
  186. }
  187. func (d *SimpleSystemDialer) DestIpAddress() net.IP {
  188. return nil
  189. }
  190. // UseAlternativeSystemDialer replaces the current system dialer with a given one.
  191. // Caller must ensure there is no race condition.
  192. //
  193. // xray:api:stable
  194. func UseAlternativeSystemDialer(dialer SystemDialer) {
  195. if dialer == nil {
  196. dialer = &DefaultSystemDialer{}
  197. }
  198. effectiveSystemDialer = dialer
  199. }
  200. // RegisterDialerController adds a controller to the effective system dialer.
  201. // The controller can be used to operate on file descriptors before they are put into use.
  202. // It only works when effective dialer is the default dialer.
  203. //
  204. // xray:api:beta
  205. func RegisterDialerController(ctl control.Func) error {
  206. if ctl == nil {
  207. return errors.New("nil listener controller")
  208. }
  209. dialer, ok := effectiveSystemDialer.(*DefaultSystemDialer)
  210. if !ok {
  211. return errors.New("RegisterListenerController not supported in custom dialer")
  212. }
  213. dialer.controllers = append(dialer.controllers, ctl)
  214. return nil
  215. }
  216. type FakePacketConn struct {
  217. net.Conn
  218. }
  219. func (c *FakePacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
  220. n, err = c.Read(p)
  221. return n, c.RemoteAddr(), err
  222. }
  223. func (c *FakePacketConn) WriteTo(p []byte, _ net.Addr) (n int, err error) {
  224. return c.Write(p)
  225. }
  226. func (c *FakePacketConn) LocalAddr() net.Addr {
  227. return &net.TCPAddr{
  228. IP: net.IP{byte(rand.Intn(256)), byte(rand.Intn(256)), byte(rand.Intn(256)), byte(rand.Intn(256))},
  229. Port: rand.Intn(65536),
  230. }
  231. }
  232. func (c *FakePacketConn) SetReadBuffer(bytes int) error {
  233. // do nothing, this function is only there to suppress quic-go printing
  234. // random warnings about UDP buffers to stdout
  235. return nil
  236. }