mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-12-15 19:31:45 +03:00
b31bab591d
Merge in DNS/adguard-home from 5117-backport-dns64 to master Updates #5117. Squashed commit of the following: commit 8ac88534b2da52f49facef6d623ea3504a3cd5ed Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Mon Feb 6 16:44:16 2023 +0300 all: rm todos commit 0aa66c5ecbadc3e372478ea4446f80fcc7457841 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Mon Feb 6 15:40:38 2023 +0300 all: upd dnsproxy commit 872a8efdd2759fd9dad61de9953bc87f734ca918 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Fri Feb 3 14:14:21 2023 +0300 dnsforward: imp docs commit 8efeb42cac69bbe9b8dba8c91c33b14c95397ab9 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Wed Feb 1 02:58:01 2023 +0300 all: rm dns64
50 lines
1.6 KiB
Go
50 lines
1.6 KiB
Go
package dnsforward
|
|
|
|
import (
|
|
"net"
|
|
"net/netip"
|
|
|
|
"github.com/AdguardTeam/dnsproxy/proxy"
|
|
)
|
|
|
|
// setupDNS64 initializes DNS64 settings, the NAT64 prefixes in particular. If
|
|
// the DNS64 feature is enabled and no prefixes are configured, the default
|
|
// Well-Known Prefix is used, just like Section 5.2 of RFC 6147 prescribes. Any
|
|
// configured set of prefixes discards the default Well-Known prefix unless it
|
|
// is specified explicitly. Each prefix also validated to be a valid IPv6
|
|
// CIDR with a maximum length of 96 bits. The first specified prefix is then
|
|
// used to synthesize AAAA records.
|
|
func (s *Server) setupDNS64() {
|
|
if !s.conf.UseDNS64 {
|
|
return
|
|
}
|
|
|
|
if len(s.conf.DNS64Prefixes) == 0 {
|
|
// dns64WellKnownPref is the default prefix to use in an algorithmic
|
|
// mapping for DNS64.
|
|
//
|
|
// See https://datatracker.ietf.org/doc/html/rfc6052#section-2.1.
|
|
dns64WellKnownPref := netip.MustParsePrefix("64:ff9b::/96")
|
|
|
|
s.dns64Pref = dns64WellKnownPref
|
|
} else {
|
|
s.dns64Pref = s.conf.DNS64Prefixes[0]
|
|
}
|
|
}
|
|
|
|
// mapDNS64 maps ip to IPv6 address using configured DNS64 prefix. ip must be a
|
|
// valid IPv4. It panics, if there are no configured DNS64 prefixes, because
|
|
// synthesis should not be performed unless DNS64 function enabled.
|
|
func (s *Server) mapDNS64(ip netip.Addr) (mapped net.IP) {
|
|
// Don't mask the address here since it should have already been masked on
|
|
// initialization stage.
|
|
pref := s.dns64Pref.Masked().Addr().As16()
|
|
ipData := ip.As4()
|
|
|
|
mapped = make(net.IP, net.IPv6len)
|
|
copy(mapped[:proxy.NAT64PrefixLength], pref[:])
|
|
copy(mapped[proxy.NAT64PrefixLength:], ipData[:])
|
|
|
|
return mapped
|
|
}
|