resolve_conn.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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(router adapter.Router, strategy dns.DomainStrategy, conn net.PacketConn) N.NetPacketConn {
  13. if udpConn, ok := conn.(*net.UDPConn); ok {
  14. return &ResolveUDPConn{udpConn, router, strategy}
  15. } else {
  16. return &ResolvePacketConn{conn, router, strategy}
  17. }
  18. }
  19. type ResolveUDPConn struct {
  20. *net.UDPConn
  21. router adapter.Router
  22. strategy dns.DomainStrategy
  23. }
  24. func (w *ResolveUDPConn) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error) {
  25. n, addr, err := w.ReadFromUDPAddrPort(buffer.FreeBytes())
  26. if err != nil {
  27. return M.Socksaddr{}, err
  28. }
  29. buffer.Truncate(n)
  30. return M.SocksaddrFromNetIP(addr), nil
  31. }
  32. func (w *ResolveUDPConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  33. defer buffer.Release()
  34. if destination.IsFqdn() {
  35. addresses, err := w.router.Lookup(context.Background(), destination.Fqdn, w.strategy)
  36. if err != nil {
  37. return err
  38. }
  39. return common.Error(w.UDPConn.WriteTo(buffer.Bytes(), M.SocksaddrFromAddrPort(addresses[0], destination.Port).UDPAddr()))
  40. }
  41. return common.Error(w.UDPConn.WriteToUDP(buffer.Bytes(), destination.UDPAddr()))
  42. }
  43. func (w *ResolveUDPConn) Upstream() any {
  44. return w.UDPConn
  45. }
  46. type ResolvePacketConn struct {
  47. net.PacketConn
  48. router adapter.Router
  49. strategy dns.DomainStrategy
  50. }
  51. func (w *ResolvePacketConn) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error) {
  52. _, addr, err := buffer.ReadPacketFrom(w)
  53. if err != nil {
  54. return M.Socksaddr{}, err
  55. }
  56. return M.SocksaddrFromNet(addr), err
  57. }
  58. func (w *ResolvePacketConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  59. defer buffer.Release()
  60. if destination.Family().IsFqdn() {
  61. addresses, err := w.router.Lookup(context.Background(), destination.Fqdn, w.strategy)
  62. if err != nil {
  63. return err
  64. }
  65. return common.Error(w.WriteTo(buffer.Bytes(), M.SocksaddrFromAddrPort(addresses[0], destination.Port).UDPAddr()))
  66. }
  67. return common.Error(w.WriteTo(buffer.Bytes(), destination.UDPAddr()))
  68. }
  69. func (w *ResolvePacketConn) Upstream() any {
  70. return w.PacketConn
  71. }