From patchwork Tue Oct 1 11:36:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Michael Tremer X-Patchwork-Id: 2453 Return-Path: Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail01.haj.ipfire.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by web04.haj.ipfire.org (Postfix) with ESMTPS id 46jHKR3rtbz3yqH for ; Tue, 1 Oct 2019 11:36:27 +0000 (UTC) Received: from mail02.haj.ipfire.org (mail02.haj.ipfire.org [172.28.1.201]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384 client-signature ECDSA (P-384) client-digest SHA384) (Client CN "mail02.haj.ipfire.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mail01.ipfire.org (Postfix) with ESMTPS id 46jHKQ4FKyz2pM; Tue, 1 Oct 2019 11:36:26 +0000 (UTC) Received: from mail02.haj.ipfire.org (localhost [127.0.0.1]) by mail02.haj.ipfire.org (Postfix) with ESMTP id 46jHKQ3Jgyz2ycx; Tue, 1 Oct 2019 11:36:26 +0000 (UTC) Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail01.haj.ipfire.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mail02.haj.ipfire.org (Postfix) with ESMTPS id 46jHKN2v5Dz2ycx for ; Tue, 1 Oct 2019 11:36:24 +0000 (UTC) Received: from ipfire.tremer.co.uk (unknown [89.34.167.132]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) by mail01.ipfire.org (Postfix) with ESMTPSA id 46jHKN0vkDz2cB; Tue, 1 Oct 2019 11:36:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ipfire.org; s=201909rsa; t=1569929784; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=a0Qt74kwYSsYX0XGQM26Wpmz58FEeu1e3psJPwyWFNQ=; b=LlIzgbdwwXmidGBUUX6MRBvEd2oBMCoPd9NomeAy3NwIW3WBr4Z8n/YkrZeGEuP2gzpheh ZUOigiNuSe8GejudEutNJ6ArpVdDqfKmyHLSTv7ylGVXkK7IQWUMRzXKAxbyM40frKKy+W tWvs71MWg7y8bvsnb3o3nRMKFUVkoDTBmYCY5Zm1OhibDXgxwdWebm4lbQsEvKSsL6sVck WiwymizOjDTwoL0E22OvQgrjmj9jSl3YtTO3CPprOnnaJrZWKIF9z7KHb63OwcqHTFBVLp 1hWnGBvrH0YWWmPzQBp0GRcZmfxyCM8CWz5WWoMuVBBSQMKOpOnrRtccsQJXAA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=ipfire.org; s=201909ed25519; t=1569929784; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=a0Qt74kwYSsYX0XGQM26Wpmz58FEeu1e3psJPwyWFNQ=; b=SG6xXdWE5oNv1vYScx+2lvAQ/C1wgbgx0njZqwzFOhVSJQtB0eO/kn98WZ23hL8O07iPgG yuvAAoCt7Nqx96CQ== From: Michael Tremer To: development@lists.ipfire.org Subject: [PATCH v2] unbound: Add option to force using TCP for upstream servers Date: Tue, 1 Oct 2019 12:36:16 +0100 Message-Id: <20191001113616.17950-1-michael.tremer@ipfire.org> MIME-Version: 1.0 Authentication-Results: mail01.ipfire.org; auth=pass smtp.auth=ms smtp.mailfrom=michael.tremer@ipfire.org X-BeenThere: development@lists.ipfire.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: IPFire development talk List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michael Tremer Errors-To: development-bounces@lists.ipfire.org Sender: "Development" Some users have problems to reach DNS servers. This change adds an option which allows to force using TCP for upstream name servers. This is a good workaround for users behind a broken Fritz!Box in modem mode which does not allow resolving any records of the root zone. The name server tests in the script will also only use TCP. Signed-off-by: Michael Tremer --- src/initscripts/system/unbound | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/initscripts/system/unbound b/src/initscripts/system/unbound index dbcfc951f..d195fd325 100644 --- a/src/initscripts/system/unbound +++ b/src/initscripts/system/unbound @@ -15,6 +15,7 @@ TEST_DOMAIN_FAIL="dnssec-failed.org" INSECURE_ZONES= USE_FORWARDERS=1 ENABLE_SAFE_SEARCH=off +FORCE_TCP=off # Cache any local zones for 60 seconds LOCAL_TTL=60 @@ -25,6 +26,12 @@ EDNS_DEFAULT_BUFFER_SIZE=4096 # Load optional configuration [ -e "/etc/sysconfig/unbound" ] && . /etc/sysconfig/unbound +DIG_ARGS=() + +if [ "${FORCE_TCP}" = "on" ]; then + DIG_ARGS+=( "+tcp" ) +fi + ip_address_revptr() { local addr=${1} @@ -199,6 +206,14 @@ write_forward_conf() { ( config_header + # Force using TCP for upstream servers only + if [ "${FORCE_TCP}" = "on" ]; then + echo "# Force using TCP for upstream servers only" + echo "server:" + echo " tcp-upstream: yes" + echo + fi + local insecure_zones="${INSECURE_ZONES}" local enabled zone server servers remark disable_dnssec rest @@ -391,7 +406,7 @@ ns_is_online() { local ns=${1} shift - dig @${ns} +nodnssec A ${TEST_DOMAIN} $@ >/dev/null + dig "${DIG_ARGS[@]}" @${ns} +nodnssec A ${TEST_DOMAIN} $@ >/dev/null } # Resolving ${TEST_DOMAIN_FAIL} will fail if the nameserver is validating @@ -399,11 +414,11 @@ ns_is_validating() { local ns=${1} shift - if ! dig @${ns} A ${TEST_DOMAIN_FAIL} $@ | grep -q SERVFAIL; then + if ! dig "${DIG_ARGS[@]}" @${ns} A ${TEST_DOMAIN_FAIL} $@ | grep -q SERVFAIL; then return 1 else # Determine if NS replies with "ad" data flag if DNSSEC enabled - dig @${ns} +dnssec SOA ${TEST_DOMAIN} $@ | awk -F: '/\;\;\ flags\:/ { s=1; if (/\ ad/) s=0; exit s }' + dig "${DIG_ARGS[@]}" @${ns} +dnssec SOA ${TEST_DOMAIN} $@ | awk -F: '/\;\;\ flags\:/ { s=1; if (/\ ad/) s=0; exit s }' fi } @@ -413,28 +428,33 @@ ns_forwards_DNSKEY() { local ns=${1} shift - dig @${ns} DNSKEY ${TEST_DOMAIN} $@ | grep -qv SOA + dig "${DIG_ARGS[@]}" @${ns} DNSKEY ${TEST_DOMAIN} $@ | grep -qv SOA } ns_forwards_DS() { local ns=${1} shift - dig @${ns} DS ${TEST_DOMAIN} $@ | grep -qv SOA + dig "${DIG_ARGS[@]}" @${ns} DS ${TEST_DOMAIN} $@ | grep -qv SOA } ns_forwards_RRSIG() { local ns=${1} shift - dig @${ns} +dnssec A ${TEST_DOMAIN} $@ | grep -q RRSIG + dig "${DIG_ARGS[@]}" @${ns} +dnssec A ${TEST_DOMAIN} $@ | grep -q RRSIG } ns_supports_tcp() { local ns=${1} shift - dig @${ns} +tcp A ${TEST_DOMAIN} $@ >/dev/null || return 1 + # If TCP is forced we know by now if the server responds to it + if [ "${FORCE_TCP}" = "on" ]; then + return 0 + fi + + dig "${DIG_ARGS[@]}" @${ns} +tcp A ${TEST_DOMAIN} $@ >/dev/null || return 1 } ns_determine_edns_buffer_size() { @@ -443,7 +463,7 @@ ns_determine_edns_buffer_size() { local b for b in 4096 2048 1500 1480 1464 1400 1280 512; do - if dig @${ns} +dnssec +bufsize=${b} A ${TEST_DOMAIN} $@ >/dev/null; then + if dig "${DIG_ARGS[@]}" @${ns} +dnssec +bufsize=${b} A ${TEST_DOMAIN} $@ >/dev/null; then echo "${b}" return 0 fi @@ -464,7 +484,7 @@ get_root_nameservers() { can_resolve_root() { local ns for ns in $(get_root_nameservers); do - if dig @${ns} +dnssec SOA . $@ >/dev/null; then + if dig "${DIG_ARGS[@]}" @${ns} +dnssec SOA . $@ >/dev/null; then return 0 fi done @@ -514,7 +534,7 @@ resolve() { local ns for ns in $(read_name_servers); do local answer - for answer in $(dig +short "@${ns}" A "${hostname}"); do + for answer in $(dig "${DIG_ARGS[@]}" +short "@${ns}" A "${hostname}"); do found=1 # Filter out non-IP addresses