Use DoT as fallback (#1597)

* Use DoT as fallback / add cache

* Stage

* merge

* fix lint

* Fallback server

* use fallback

* add nxdomain

* Address comments
This commit is contained in:
Pascal Vizeli 2020-03-27 00:38:54 +01:00 committed by GitHub
parent 3010bd4eb6
commit d0db466e67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 15 deletions

View File

@ -2,4 +2,6 @@
# ============================================================================== # ==============================================================================
# Start Service service # Start Service service
# ============================================================================== # ==============================================================================
export LD_PRELOAD="/usr/local/lib/libjemalloc.so.2"
exec python3 -m supervisor exec python3 -m supervisor

View File

@ -34,7 +34,6 @@ DOCKER_NETWORK = "hassio"
DOCKER_NETWORK_MASK = ip_network("172.30.32.0/23") DOCKER_NETWORK_MASK = ip_network("172.30.32.0/23")
DOCKER_NETWORK_RANGE = ip_network("172.30.33.0/24") DOCKER_NETWORK_RANGE = ip_network("172.30.33.0/24")
DNS_SERVERS = ["dns://1.1.1.1", "dns://9.9.9.9"]
DNS_SUFFIX = "local.hass.io" DNS_SUFFIX = "local.hass.io"
LABEL_VERSION = "io.hass.version" LABEL_VERSION = "io.hass.version"

View File

@ -1,15 +1,31 @@
.:53 { .:53 {
log log
errors errors
loop
hosts /config/hosts { hosts /config/hosts {
fallthrough fallthrough
} }
template ANY AAAA local.hass.io hassio { template ANY AAAA local.hass.io hassio {
rcode NOERROR rcode NOERROR
} }
forward . $servers { forward . {{ locals | join(" ") }} dns://127.0.0.1:5353 {
except local.hass.io except local.hass.io
policy sequential policy sequential
health_check 5s
}
fallback REFUSED . dns://127.0.0.1:5353
fallback SERVFAIL . dns://127.0.0.1:5353
fallback NXDOMAIN . dns://127.0.0.1:5353
cache 10
}
.:5353 {
log
errors
forward . tls://1.1.1.1 tls://1.0.0.1 {
tls_servername cloudflare-dns.com
except local.hass.io
health_check 10s health_check 10s
} }
cache 30
} }

View File

@ -4,13 +4,13 @@ from contextlib import suppress
from ipaddress import IPv4Address from ipaddress import IPv4Address
import logging import logging
from pathlib import Path from pathlib import Path
from string import Template
from typing import Awaitable, List, Optional from typing import Awaitable, List, Optional
import attr import attr
import jinja2
import voluptuous as vol import voluptuous as vol
from .const import ATTR_SERVERS, ATTR_VERSION, DNS_SERVERS, DNS_SUFFIX, FILE_HASSIO_DNS from .const import ATTR_SERVERS, ATTR_VERSION, DNS_SUFFIX, FILE_HASSIO_DNS
from .coresys import CoreSys, CoreSysAttributes from .coresys import CoreSys, CoreSysAttributes
from .docker.dns import DockerDNS from .docker.dns import DockerDNS
from .docker.stats import DockerStats from .docker.stats import DockerStats
@ -42,6 +42,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
self.coresys: CoreSys = coresys self.coresys: CoreSys = coresys
self.instance: DockerDNS = DockerDNS(coresys) self.instance: DockerDNS = DockerDNS(coresys)
self.forwarder: DNSForward = DNSForward() self.forwarder: DNSForward = DNSForward()
self.coredns_template: Optional[jinja2.Template] = None
self._hosts: List[HostEntry] = [] self._hosts: List[HostEntry] = []
@ -116,6 +117,12 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
# Start DNS forwarder # Start DNS forwarder
self.sys_create_task(self.forwarder.start(self.sys_docker.network.dns)) self.sys_create_task(self.forwarder.start(self.sys_docker.network.dns))
# Initialize CoreDNS Template
try:
self.coredns_template = jinja2.Template(COREDNS_TMPL.read_text())
except OSError as err:
_LOGGER.error("Can't read coredns.tmpl: %s", err)
# Run CoreDNS # Run CoreDNS
with suppress(CoreDNSError): with suppress(CoreDNSError):
if await self.instance.is_running(): if await self.instance.is_running():
@ -208,24 +215,17 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
"""Write CoreDNS config.""" """Write CoreDNS config."""
dns_servers: List[str] = [] dns_servers: List[str] = []
# Load Template
try:
corefile_template: Template = Template(COREDNS_TMPL.read_text())
except OSError as err:
_LOGGER.error("Can't read coredns template file: %s", err)
raise CoreDNSError() from None
# Prepare DNS serverlist: Prio 1 Manual, Prio 2 Local, Prio 3 Fallback # Prepare DNS serverlist: Prio 1 Manual, Prio 2 Local, Prio 3 Fallback
local_dns: List[str] = self.sys_host.network.dns_servers or ["dns://127.0.0.11"] local_dns: List[str] = self.sys_host.network.dns_servers or ["dns://127.0.0.11"]
servers: List[str] = self.servers + local_dns + DNS_SERVERS servers: List[str] = self.servers + local_dns
_LOGGER.debug( _LOGGER.debug(
"config-dns = %s, local-dns = %s , backup-dns = %s", "config-dns = %s, local-dns = %s , backup-dns = CloudFlare DoT",
self.servers, self.servers,
local_dns, local_dns,
DNS_SERVERS,
) )
# Make sure, they are valid
for server in servers: for server in servers:
try: try:
dns_url(server) dns_url(server)
@ -235,7 +235,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
_LOGGER.warning("Ignore invalid DNS Server: %s", server) _LOGGER.warning("Ignore invalid DNS Server: %s", server)
# Generate config file # Generate config file
data = corefile_template.safe_substitute(servers=" ".join(dns_servers)) data = self.coredns_template.render(locals=dns_servers)
try: try:
self.corefile.write_text(data) self.corefile.write_text(data)