応答が512バイトより大きく切り捨てられた場合、DNSクエリを実行できません。

応答が512バイトより大きく切り捨てられた場合、DNSクエリを実行できません。

状態:

  • Azureで実行されているLinuxマシン
  • パブリックドメインを見つけると、112件の結果が返されました。
  • パケット応答サイズは1905バイトです。

ケース1:

  • Google DNS 8.8.8.8に尋ねました。要約されていない応答を返しました。すべてがうまくいった。

ケース2:

  • Azure DNS 168.63.129.16 に要求 - 切り捨てられた応答を返し、TCP に切り替えようとしましたが、「サーバーアドレスに接続できません」エラーで失敗します。しかし、「sudo」を使って質問を実行すると、完璧に動作します。

問題は常に再現できます。

  1. sudoなし:

    $ dig  aerserv-bc-us-east.bidswitch.net @8.8.8.8
    
    ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> aerserv-bc-us-east.bidswitch.net @8.8.8.8
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49847
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 112, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 512
    ;; QUESTION SECTION:
    ;aerserv-bc-us-east.bidswitch.net. IN   A
    
    ;; ANSWER SECTION:
    aerserv-bc-us-east.bidswitch.net. 119 IN CNAME  bidcast-bcserver-gce-sc.bidswitch.net.
    bidcast-bcserver-gce-sc.bidswitch.net. 119 IN CNAME bidcast-bcserver-gce-sc-multifo.bidswitch.net.
    bidcast-bcserver-gce-sc-multifo.bidswitch.net. 59 IN A 35.211.189.137
    bidcast-bcserver-gce-sc-multifo.bidswitch.net. 59 IN A 35.211.205.98
    --------
    bidcast-bcserver-gce-sc-multifo.bidswitch.net. 59 IN A 35.211.28.65
    bidcast-bcserver-gce-sc-multifo.bidswitch.net. 59 IN A 35.211.213.32
    
    ;; Query time: 12 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Thu Oct 03 22:28:09 EEST 2019
    ;; MSG SIZE  rcvd: 1905
    
    
    [azureuser@testserver~]$ dig  aerserv-bc-us-east.bidswitch.net
    ;; Truncated, retrying in TCP mode.
    ;; Connection to 168.63.129.16#53(168.63.129.16) for aerserv-bc-us-east.bidswitc                                                                                                                               h.net failed: timed out.
    ;; Connection to 168.63.129.16#53(168.63.129.16) for aerserv-bc-us-east.bidswitch.net failed: timed out.
    
    ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> aerserv-bc-us-east.bidswitch.net
    ;; global options: +cmd
    ;; connection timed out; no servers could be reached
    ;; Connection to 168.63.129.16#53(168.63.129.16) for aerserv-bc-us-east.bidswitch.net failed: timed out.
    
  2. sudoの使用:

    [root@testserver ~]# dig  aerserv-bc-us-east.bidswitch.net
    ;; Truncated, retrying in TCP mode.
    
    ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> aerserv-bc-us-east.bidswitch.net
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8941
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 112, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 1280
    ;; QUESTION SECTION:
    ;aerserv-bc-us-east.bidswitch.net. IN   A
    
    ;; ANSWER SECTION:
    aerserv-bc-us-east.bidswitch.net. 120 IN CNAME  bidcast-bcserver-gce-sc.bidswitch.net.
    bidcast-bcserver-gce-sc.bidswitch.net. 120 IN CNAME bidcast-bcserver-gce-sc-multifo.bidswitch.net.
    bidcast-bcserver-gce-sc-multifo.bidswitch.net. 60 IN A 35.211.56.153
    .......
    bidcast-bcserver-gce-sc-multifo.bidswitch.net. 60 IN A 35.207.61.237
    bidcast-bcserver-gce-sc-multifo.bidswitch.net. 60 IN A 35.207.23.245
    
    ;; Query time: 125 msec
    ;; SERVER: 168.63.129.16#53(168.63.129.16)
    ;; WHEN: Thu Oct 03 22:17:18 EEST 2019
    ;; MSG SIZE  rcvd: 1905
    

私はインターネットで見つけたものすべてを確認しましたが、応答パケットのサイズが大きすぎて、rootアカウントで実行した場合やsudo権限で実行したときに応答が切り捨てられた場合にのみ、これが期待どおりに機能する理由の説明が表示されませんでした。 DNS クエリが UDP から TCP に切り替えられるように強制します。

/etc/resolv.confに "options edns0"、 "options use-vc"、または "options edns0 use-vc"を追加しても役に立ちません。

CentOS 7.x、Ubuntu 16.04、18.04で同じ動作

アップデート:カールとTelnetでテストした結果の動作は同じです。 sudoを使用するか、rootアカウントで実行するか、sudoなしで失敗するか、標準アカウントで実行してください。

UDPからTCPに切り替えるときにスーパーユーザー権限が必要な理由についての洞察を提供し、いくつかのソリューション(存在する場合)を提供するのに役立つ人はいますか?

修正する:

  • この投稿が長いことを知っていますが、答える前にすべてを読んでください。
  • ファイアウォールはすべてを許可するように設定されています。
  • 私が持っているすべてのテスト環境では、TCPとUDPポート53が開いています。
  • SELinux / AppArmorが無効になっています。

アップデート2:

Debian9(カーネル4.19.0-0.bpo.5-cloud-amd64)はsudoなしでうまく機能します。 RHEL8 (カーネル 4.18.0-80.11.1.el8_0.x86_64) はうまく機能しますが、sudo がない場合は遅延時間が大きくなります (最大 30 秒)。

アップデート3:テストできたが機能していないディストリビューションのリスト:

  • RHEL 7.6、カーネル3.10.0-957.21.3.el7.x86_64
  • CentOS 7.6、カーネル 3.10.0-862.11.6.el7.x86_64
  • Oracle7.6、カーネル4.14.35-1902.3.2.el7uek.x86_64
  • Ubuntu14.04、カーネル3.10.0-1062.1.1.el7.x86_64
  • Ubuntu16.04、カーネル4.15.0-1057-azure
  • Ubuntu18.04、カーネル5.0.0-1018-azure
  • Ubuntu19.04、カーネル5.0.0-1014-azure
  • SLES12-SP4、カーネル 4.12.14-6.23-azure
  • SLES15、カーネル 4.12.14-5.30-azure

したがって、デフォルトで問題なくテストされた唯一のディストリビューションはDebian 9です。 RHEL 8 は待ち時間が長いため、タイムアウトが発生する可能性があるため、完全に動作するとは想定できません。

これまでDebian 9と私がテストした他のディストリビューションの間の最大の違いはsystemdです(Debian 9にはありません)...これが原因であるかどうかを確認する方法がわかりません。

ありがとうございます!

ベストアンサー1

これがうまくいく理由についての洞察を提供し、いくつかの解決策(存在する場合)を提供するのに役立つ人はいますか?

短い答え:

作成されたプライマリAzure VMに破損したDNSがあります。systemd-resolved追加の設定が必要です。sudo systemctl status systemd-resolvedこれはすぐに確認されます。/etc/resolv.confポイント127.0.0.53- 設定されていないローカルスタブレゾルバ。

ローカルスタブリゾルバがsystemd-resolved設定されていません。レスポンダが設定されていないため、ヒット後に127.0.0.53尋ねる人はいません。ああ。 Ubuntu 18.04に合わせて設定する方法を確認するには、最後にスキップしてください。

その結論がどのように導出されたのか疑問に思ったら、長い答えを読んでください。

長い答え:

DNS応答が512バイトを超えると切り捨てられる理由:

TCP [RFC793]は常にゾーン全体の送信(AXFRを使用)で使用され、通常はDNSプロトコルの元の512バイト制限を超えるサイズのメッセージに使用されます。

源泉:https://www.rfc-editor.org/rfc/rfc7766

分析する:

これは思ったよりも難しいです。そのため、OPの有利なポイントでテストできるように、AzureでUbuntu 18.04 VMを起動しました。

私の出発点は、DNSクエリをブロックするものがないことを確認することです。

sudo iptables -nvx -L
sudo apparmor_status

すべてのチェーン店はiptablesデフォルトポリシーは次のように設定されます。受け入れるしかし、アパモアに設定実装するDNSとは何の関係もありません。したがって、現在のホストでは接続や権限の問題は観察されません。

次に作るべきことどのようにDNSクエリは歯車を介してヘビのように動きます。

cat /etc/resolv.conf 

# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "systemd-resolve --status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0
search ns3yb2bs2fketavxxx3qaprsna.zx.internal.cloudapp.net

したがって、resolv.confシステムにはという名前のローカルスタブリゾルバが必要ですsystemd-resolved。状態確認体系的分析上記のヒントによれば、私たちはそれがあることがわかります間違い:

sudo systemctl status systemd-resolved

● systemd-resolved.service - Network Name Resolution
   Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-10-08 12:41:38 UTC; 1h 5min ago
     Docs: man:systemd-resolved.service(8)
           https://www.freedesktop.org/wiki/Software/systemd/resolved
           https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
           https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
 Main PID: 871 (systemd-resolve)
   Status: "Processing requests..."
    Tasks: 1 (limit: 441)
   CGroup: /system.slice/systemd-resolved.service
           └─871 /lib/systemd/systemd-resolved

Oct 08 12:42:14 test systemd-resolved[871]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.
<Snipped repeated error entries>

/etc/nsswitch.confDNSクエリを解決するために使用されるソースの注文ソースを設定します。これは私たちに何を伝えますか? :

hosts:          files dns

まあ、DNSクエリはローカルsystemd-resolvedスタブリゾルバには届きません/etc/nsswitch.conf。 。

systemd-resolvedスタブリゾルバのフォワーダが設定されていますか? ! ? ! ?この構成を見てみましょう。/etc/systemd/resolved.conf

[Resolve]
#DNS=
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes

いいえ:systemd-resolvedローカルのip:nameマッピングが見つからないかどうかを尋ねるようにフォワーダーが設定されていません。

これらすべての最終結果は次のとおりです。

  • /etc/nsswitch.conf ローカルで利用できない場合は、DNS クエリを DNS に送信します。IP:名前次で見つけたマッピング/etc/hosts

  • 照会するDNSサーバーは、127.0.0.53まだ構成されていない構成ファイルを見て、見つけたばかりのサーバーです/etc/systemd/resolved.conf。ここでフォワーダを指定しないと、問題を正常に解決できません。

テスト:

127.0.0.53168.63.129.16を直接指定してスタブレゾルバをオーバーライドしてみました。失敗します。

dig aerserv-bc-us-east.bidswitch.net 168.63.129.16

; <<>> DiG 9.11.3-1ubuntu1.9-Ubuntu <<>> aerserv-bc-us-east.bidswitch.net 168.63.129.16
;; global options: +cmd
;; connection timed out; no servers could be reached
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 24224
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;168.63.129.16.         IN  A

;; Query time: 13 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Tue Oct 08 13:26:07 UTC 2019
;; MSG SIZE  rcvd: 42

いいえ:;; SERVER: 127.0.0.53#53(127.0.0.53)出力に見られるように、それをオーバーライドしておらず、まだ設定されていないローカルスタブリゾルバを使用しています。

ただし、次のいずれかのコマンドを使用すると、デフォルトのスタブリゾルバがオーバーライドされ、127.0.0.53結果NOERRORが正常に返されます。

sudo dig aerserv-bc-us-east.bidswitch.net @168.63.129.16

または

dig +trace aerserv-bc-us-east.bidswitch.net @168.63.129.16 

systemd-resolvedしたがって、スタブソルバーに依存するすべてのクエリは、スタブソルバーが構成されるまで失敗するしかありません。

解決策:

私の第一——間違った- 信仰はTCP/53ブロック済み:フル '切り捨て 512「少し赤いニシンです。スタブレゾルバが設定されていません。私はDNSが別の方法で設定されていると仮定しました。「決して仮定しないでください。

設定方法systemd-resolved:

Ubuntu18.04

次のhostsディレクティブを編集して、DNS検証用の最初のソースに設定します。/etc/nsswitch.confresolvesystemd-resolved

hosts:          resolve files dns

この場合、希望のフォワーダを指定するDNSには、ディレクティブ(少なくとも)を編集します。/etc/systemd/resolved.conf

[Resolve]
DNS=168.63.129.16

再起動systemd-resolved:

sudo systemctl restart systemd-resolved

RHEL 8:

Red Hat は、systemd-resolvedスタブレゾルバの設定に関するほぼすべてのタスクを実行します。彼らはシステムにそれを使用するように指示しなかっただけです!

次のhostsディレクティブを編集して、DNS検証用の最初のソースに設定します。/etc/nsswitch.confresolvesystemd-resolved

hosts:          resolve files dns

その後、再起動してくださいsystemd-resolved

sudo systemctl restart systemd-resolved

源泉:https://www.linkedin.com/pulse/config-rhel8-local-dns-caching-terrence-houlahan/

結論として:

一度systemd-resolved構成されたら、テストVMのDNSが期待どおりに機能しました。このように流れているようですが…

おすすめ記事