tls.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package transport
  2. import (
  3. "context"
  4. "sync"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-box/common/dialer"
  7. "github.com/sagernet/sing-box/common/tls"
  8. C "github.com/sagernet/sing-box/constant"
  9. "github.com/sagernet/sing-box/dns"
  10. "github.com/sagernet/sing-box/log"
  11. "github.com/sagernet/sing-box/option"
  12. "github.com/sagernet/sing/common"
  13. E "github.com/sagernet/sing/common/exceptions"
  14. "github.com/sagernet/sing/common/logger"
  15. M "github.com/sagernet/sing/common/metadata"
  16. N "github.com/sagernet/sing/common/network"
  17. "github.com/sagernet/sing/common/x/list"
  18. mDNS "github.com/miekg/dns"
  19. )
  20. var _ adapter.DNSTransport = (*TLSTransport)(nil)
  21. func RegisterTLS(registry *dns.TransportRegistry) {
  22. dns.RegisterTransport[option.RemoteTLSDNSServerOptions](registry, C.DNSTypeTLS, NewTLS)
  23. }
  24. type TLSTransport struct {
  25. dns.TransportAdapter
  26. logger logger.ContextLogger
  27. dialer N.Dialer
  28. serverAddr M.Socksaddr
  29. tlsConfig tls.Config
  30. access sync.Mutex
  31. connections list.List[*tlsDNSConn]
  32. }
  33. type tlsDNSConn struct {
  34. tls.Conn
  35. queryId uint16
  36. }
  37. func NewTLS(ctx context.Context, logger log.ContextLogger, tag string, options option.RemoteTLSDNSServerOptions) (adapter.DNSTransport, error) {
  38. transportDialer, err := dns.NewRemoteDialer(ctx, options.RemoteDNSServerOptions)
  39. if err != nil {
  40. return nil, err
  41. }
  42. tlsOptions := common.PtrValueOrDefault(options.TLS)
  43. tlsOptions.Enabled = true
  44. tlsConfig, err := tls.NewClient(ctx, options.Server, tlsOptions)
  45. if err != nil {
  46. return nil, err
  47. }
  48. serverAddr := options.DNSServerAddressOptions.Build()
  49. if serverAddr.Port == 0 {
  50. serverAddr.Port = 853
  51. }
  52. return &TLSTransport{
  53. TransportAdapter: dns.NewTransportAdapterWithRemoteOptions(C.DNSTypeTLS, tag, options.RemoteDNSServerOptions),
  54. logger: logger,
  55. dialer: transportDialer,
  56. serverAddr: serverAddr,
  57. tlsConfig: tlsConfig,
  58. }, nil
  59. }
  60. func (t *TLSTransport) Start(stage adapter.StartStage) error {
  61. if stage != adapter.StartStateStart {
  62. return nil
  63. }
  64. return dialer.InitializeDetour(t.dialer)
  65. }
  66. func (t *TLSTransport) Close() error {
  67. t.access.Lock()
  68. defer t.access.Unlock()
  69. for connection := t.connections.Front(); connection != nil; connection = connection.Next() {
  70. connection.Value.Close()
  71. }
  72. t.connections.Init()
  73. return nil
  74. }
  75. func (t *TLSTransport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
  76. t.access.Lock()
  77. conn := t.connections.PopFront()
  78. t.access.Unlock()
  79. if conn != nil {
  80. response, err := t.exchange(message, conn)
  81. if err == nil {
  82. return response, nil
  83. }
  84. }
  85. tcpConn, err := t.dialer.DialContext(ctx, N.NetworkTCP, t.serverAddr)
  86. if err != nil {
  87. return nil, err
  88. }
  89. tlsConn, err := tls.ClientHandshake(ctx, tcpConn, t.tlsConfig)
  90. if err != nil {
  91. tcpConn.Close()
  92. return nil, err
  93. }
  94. return t.exchange(message, &tlsDNSConn{Conn: tlsConn})
  95. }
  96. func (t *TLSTransport) exchange(message *mDNS.Msg, conn *tlsDNSConn) (*mDNS.Msg, error) {
  97. conn.queryId++
  98. err := WriteMessage(conn, conn.queryId, message)
  99. if err != nil {
  100. conn.Close()
  101. return nil, E.Cause(err, "write request")
  102. }
  103. response, err := ReadMessage(conn)
  104. if err != nil {
  105. conn.Close()
  106. return nil, E.Cause(err, "read response")
  107. }
  108. t.access.Lock()
  109. t.connections.PushBack(conn)
  110. t.access.Unlock()
  111. return response, nil
  112. }