resolve_conn.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package dialer
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-dns"
  7. "github.com/sagernet/sing/common"
  8. "github.com/sagernet/sing/common/buf"
  9. M "github.com/sagernet/sing/common/metadata"
  10. N "github.com/sagernet/sing/common/network"
  11. )
  12. func NewResolvePacketConn(ctx context.Context, router adapter.Router, strategy dns.DomainStrategy, conn net.PacketConn) N.NetPacketConn {
  13. if udpConn, ok := conn.(*net.UDPConn); ok {
  14. return &ResolveUDPConn{udpConn, ctx, router, strategy}
  15. } else {
  16. return &ResolvePacketConn{conn, ctx, router, strategy}
  17. }
  18. }
  19. type ResolveUDPConn struct {
  20. *net.UDPConn
  21. ctx context.Context
  22. router adapter.Router
  23. strategy dns.DomainStrategy
  24. }
  25. func (w *ResolveUDPConn) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error) {
  26. n, addr, err := w.ReadFromUDPAddrPort(buffer.FreeBytes())
  27. if err != nil {
  28. return M.Socksaddr{}, err
  29. }
  30. buffer.Truncate(n)
  31. return M.SocksaddrFromNetIP(addr), nil
  32. }
  33. func (w *ResolveUDPConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  34. defer buffer.Release()
  35. if destination.IsFqdn() {
  36. addresses, err := w.router.Lookup(w.ctx, destination.Fqdn, w.strategy)
  37. if err != nil {
  38. return err
  39. }
  40. return common.Error(w.UDPConn.WriteToUDPAddrPort(buffer.Bytes(), M.SocksaddrFrom(addresses[0], destination.Port).AddrPort()))
  41. }
  42. return common.Error(w.UDPConn.WriteToUDPAddrPort(buffer.Bytes(), destination.AddrPort()))
  43. }
  44. func (w *ResolveUDPConn) Upstream() any {
  45. return w.UDPConn
  46. }
  47. type ResolvePacketConn struct {
  48. net.PacketConn
  49. ctx context.Context
  50. router adapter.Router
  51. strategy dns.DomainStrategy
  52. }
  53. func (w *ResolvePacketConn) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error) {
  54. _, addr, err := buffer.ReadPacketFrom(w)
  55. if err != nil {
  56. return M.Socksaddr{}, err
  57. }
  58. return M.SocksaddrFromNet(addr), err
  59. }
  60. func (w *ResolvePacketConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  61. defer buffer.Release()
  62. if destination.IsFqdn() {
  63. addresses, err := w.router.Lookup(w.ctx, destination.Fqdn, w.strategy)
  64. if err != nil {
  65. return err
  66. }
  67. return common.Error(w.WriteTo(buffer.Bytes(), M.SocksaddrFrom(addresses[0], destination.Port).UDPAddr()))
  68. }
  69. return common.Error(w.WriteTo(buffer.Bytes(), destination.UDPAddr()))
  70. }
  71. func (w *ResolvePacketConn) Upstream() any {
  72. return w.PacketConn
  73. }