mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-29 13:05:46 +00:00
net/dns/resolver: add support for <IPv4>.via-<site-id>
Currently we only support "via-<site-id>.<IPv4>", however that does not work with Google Chrome which parses `http://via-1.10.0.0.1` as a search string and not as a URL. This commit introduces "<IPv4>.via-<site-id>" (`http://10.0.0.1.via-1`) which is parsed correctly by Chrome. Updates #3616 Signed-off-by: Maisem Ali <maisem@tailscale.com>
This commit is contained in:
parent
69b535c01f
commit
80157f3f37
@ -261,7 +261,6 @@ func (r *Resolver) Close() {
|
|||||||
// bound on per-query resource usage.
|
// bound on per-query resource usage.
|
||||||
const dnsQueryTimeout = 10 * time.Second
|
const dnsQueryTimeout = 10 * time.Second
|
||||||
|
|
||||||
|
|
||||||
func (r *Resolver) Query(ctx context.Context, bs []byte, from netaddr.IPPort) ([]byte, error) {
|
func (r *Resolver) Query(ctx context.Context, bs []byte, from netaddr.IPPort) ([]byte, error) {
|
||||||
metricDNSQueryLocal.Add(1)
|
metricDNSQueryLocal.Add(1)
|
||||||
select {
|
select {
|
||||||
@ -617,11 +616,16 @@ func (r *Resolver) resolveLocal(domain dnsname.FQDN, typ dns.Type) (netaddr.IP,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseViaDomain synthesizes an IP address for quad-A DNS requests of
|
// parseViaDomain synthesizes an IP address for quad-A DNS requests of the form
|
||||||
// the form 'via-<X>.<IPv4-address>', where X is a decimal, or hex-encoded
|
// `<IPv4-address>.via-<X>` and the deprecated form `via-<X>.<IPv4-address>`,
|
||||||
// number with a '0x' prefix.
|
// where X is a decimal, or hex-encoded number with a '0x' prefix.
|
||||||
//
|
//
|
||||||
// This exists as a convenient mapping into Tailscales 'Via Range'.
|
// This exists as a convenient mapping into Tailscales 'Via Range'.
|
||||||
|
//
|
||||||
|
// TODO(maisem/bradfitz/tom): `<IPv4-address>.via-<X>` was introduced
|
||||||
|
// (2022-06-02) to work around an issue in Chrome where it would treat
|
||||||
|
// "http://via-1.1.2.3.4" as a search string instead of a URL. We should rip out
|
||||||
|
// the old format in early 2023.
|
||||||
func (r *Resolver) parseViaDomain(domain dnsname.FQDN, typ dns.Type) (netaddr.IP, bool) {
|
func (r *Resolver) parseViaDomain(domain dnsname.FQDN, typ dns.Type) (netaddr.IP, bool) {
|
||||||
fqdn := string(domain.WithoutTrailingDot())
|
fqdn := string(domain.WithoutTrailingDot())
|
||||||
if typ != dns.TypeAAAA {
|
if typ != dns.TypeAAAA {
|
||||||
@ -630,18 +634,29 @@ func (r *Resolver) parseViaDomain(domain dnsname.FQDN, typ dns.Type) (netaddr.IP
|
|||||||
if len(fqdn) < len("via-X.0.0.0.0") {
|
if len(fqdn) < len("via-X.0.0.0.0") {
|
||||||
return netaddr.IP{}, false // too short to be valid
|
return netaddr.IP{}, false // too short to be valid
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(fqdn, "via-") {
|
|
||||||
return netaddr.IP{}, false
|
|
||||||
}
|
|
||||||
|
|
||||||
firstDot := strings.Index(fqdn, ".")
|
var siteID string
|
||||||
if firstDot < 0 {
|
var ip4Str string
|
||||||
return netaddr.IP{}, false // missing dot delimiters
|
if strings.HasPrefix(fqdn, "via-") {
|
||||||
|
firstDot := strings.Index(fqdn, ".")
|
||||||
|
if firstDot < 0 {
|
||||||
|
return netaddr.IP{}, false // missing dot delimiters
|
||||||
|
}
|
||||||
|
siteID = fqdn[len("via-"):firstDot]
|
||||||
|
ip4Str = fqdn[firstDot+1:]
|
||||||
|
} else {
|
||||||
|
lastDot := strings.LastIndex(fqdn, ".")
|
||||||
|
if lastDot < 0 {
|
||||||
|
return netaddr.IP{}, false // missing dot delimiters
|
||||||
|
}
|
||||||
|
suffix := fqdn[lastDot+1:]
|
||||||
|
if !strings.HasPrefix(suffix, "via-") {
|
||||||
|
return netaddr.IP{}, false
|
||||||
|
}
|
||||||
|
siteID = suffix[len("via-"):]
|
||||||
|
ip4Str = fqdn[:lastDot]
|
||||||
}
|
}
|
||||||
|
|
||||||
siteID := fqdn[len("via-"):firstDot]
|
|
||||||
ip4Str := fqdn[firstDot+1:]
|
|
||||||
|
|
||||||
ip4, err := netaddr.ParseIP(ip4Str)
|
ip4, err := netaddr.ParseIP(ip4Str)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return netaddr.IP{}, false // badly formed, dont respond
|
return netaddr.IP{}, false // badly formed, dont respond
|
||||||
|
@ -343,9 +343,12 @@ func TestResolveLocal(t *testing.T) {
|
|||||||
{"ns-nxdomain", "test3.ipn.dev.", dns.TypeNS, netaddr.IP{}, dns.RCodeNameError},
|
{"ns-nxdomain", "test3.ipn.dev.", dns.TypeNS, netaddr.IP{}, dns.RCodeNameError},
|
||||||
{"onion-domain", "footest.onion.", dns.TypeA, netaddr.IP{}, dns.RCodeNameError},
|
{"onion-domain", "footest.onion.", dns.TypeA, netaddr.IP{}, dns.RCodeNameError},
|
||||||
{"magicdns", dnsSymbolicFQDN, dns.TypeA, netaddr.MustParseIP("100.100.100.100"), dns.RCodeSuccess},
|
{"magicdns", dnsSymbolicFQDN, dns.TypeA, netaddr.MustParseIP("100.100.100.100"), dns.RCodeSuccess},
|
||||||
{"via_hex", dnsname.FQDN("via-0xff.1.2.3.4."), dns.TypeAAAA, netaddr.MustParseIP("fd7a:115c:a1e0:b1a:0:ff:102:304"), dns.RCodeSuccess},
|
{"via_hex", dnsname.FQDN("via-0xff.1.2.3.4."), dns.TypeAAAA, netaddr.MustParseIP("fd7a:115c:a1e0:b1a:0:ff:1.2.3.4"), dns.RCodeSuccess},
|
||||||
{"via_dec", dnsname.FQDN("via-1.10.0.0.1."), dns.TypeAAAA, netaddr.MustParseIP("fd7a:115c:a1e0:b1a:0:1:a00:1"), dns.RCodeSuccess},
|
{"via_dec", dnsname.FQDN("via-1.10.0.0.1."), dns.TypeAAAA, netaddr.MustParseIP("fd7a:115c:a1e0:b1a:0:1:10.0.0.1"), dns.RCodeSuccess},
|
||||||
{"via_invalid", dnsname.FQDN("via-."), dns.TypeA, netaddr.IP{}, dns.RCodeRefused},
|
{"x_via_hex", dnsname.FQDN("4.3.2.1.via-0xff."), dns.TypeAAAA, netaddr.MustParseIP("fd7a:115c:a1e0:b1a:0:ff:4.3.2.1"), dns.RCodeSuccess},
|
||||||
|
{"x_via_dec", dnsname.FQDN("1.0.0.10.via-1."), dns.TypeAAAA, netaddr.MustParseIP("fd7a:115c:a1e0:b1a:0:1:1.0.0.10"), dns.RCodeSuccess},
|
||||||
|
{"via_invalid", dnsname.FQDN("via-."), dns.TypeAAAA, netaddr.IP{}, dns.RCodeRefused},
|
||||||
|
{"via_invalid_2", dnsname.FQDN("2.3.4.5.via-."), dns.TypeAAAA, netaddr.IP{}, dns.RCodeRefused},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
Loading…
Reference in New Issue
Block a user