AAAAルックアップを無効にする方法


35

...制御不能な破損したDNSサーバーを補償するため。

私たちの問題:センサーデータを収集する組み込みデバイスを、主にIPv4のみのさまざまなサイトに展開します。一部のサイトでは、AAAAクエリを完全に無視するか、DNSキャッシュやファイアウォールが正しく構成されていない、または壊れているなど、ネットワークのメンテナンスが不十分です。施設部門への外部サプライヤとして、私たちは(時には消極的)IT部門にほとんど影響を与えません。すぐにDNSサーバー/ファイアウォールを修正する可能性は非常にわずかです。

デバイスへの影響は、gethostbyname()ごとに、AAAAクエリがタイムアウトするまでプロセスが待機する必要があることです。この時点で、一部のプロセスはすでに接続試行を完全にタイムアウトしています。

解決策を探しています...

  • システム全体。何十ものアプリケーションを個別に再構成できない
  • 非永続的かつ構成可能。IPv6が修正/ロールアウトされる場所/時期を(再)有効にする必要があります。再起動はOKです。
  • ソリューションでglibcのようなコアライブラリを置き換える必要がある場合、保守用の既知のリポジトリ(Debian Testing、Ubuntu universe、EPELなど)から代替ライブラリパッケージを入手できるようにする必要があります。自己構築は多くの理由でオプションではないので、どこから始めればよいかさえわからないので、それらをまったくリストしません...

最も明白な解決策は、リゾルバライブラリを、たとえば/ etc / { resolvnsswitchgai } .confを介して、AAAAレコードを照会しないように構成することです。ここでno-inet6提案されている resolv.confオプションは、まさに私が探しているものです。残念ながら、少なくとも私たちのシステムには実装されていません(Debian 7ではlibc6-2.13-38 + deb7u4、Ubuntu 14.04ではlibc6-2.19-0ubuntu6.3)。

それではどうですか?SFや他の場所で提案されている次の方法がありますが、どれも機能しません。

  • /etc/modprobe.d/でipv6 LKMをブラックリストに登録するなどして、IPv6を完全に無効にしますsysctl -w net.ipv6.conf.all.disable_ipv6=1。(好奇心から:なぜリゾルバーはIPv6が無効になっているAAAAを要求するのですか?
  • options inet6/etc/resolv.confから削除します。それはそもそも存在していなかった、inet6最近ではデフォルトで単純に有効になっています。
  • options single-request/etc/resolv.confでの設定。これにより、AクエリとAAAAクエリが並列ではなく順次にのみ実行されるようになります。
  • precedence/etc/gai.confの変更。これはDNSクエリには影響せず、複数の返信の処理方法にのみ影響します。
  • 外部リゾルバを使用する(または破損したDNSサーバーを回避するローカルリゾルバデーモンを実行する)ことは役立ちますが、通常は会社のファイアウォールポリシーによって許可されていません。また、内部リソースにアクセスできなくなる可能性があります。

別のいアイデア:

  • localhostでDNSキャッシュを実行します。すべての非AAAAクエリを転送するように設定しますが、AAAAAクエリにNOERRORまたはNXDOMAINで応答するようにします(対応するAクエリの結果に応じて)。ただし、これを行うことができるDNSキャッシュを認識していません。
  • いくつかの巧妙なiptables u32マッチ、またはOndrej Caletkaのiptables DNSモジュールを使用してAAAAクエリを照合し、それらをicmp-reject(リゾルバーlibがどのように反応しますか)するか、または応答するローカルDNSサーバーにリダイレクトします空のNOERRORを持つすべて。

SEには、同様の関連する質問があることに注意してください。私の質問は、解決しようとしている実際の問題を詳しく説明していること、明示的な要件をリストしていること、頻繁に提案されている非実用的なソリューションをブラックリストに載せていること、単一のアプリケーションに固有のものではないという点で異なります。この議論の後、質問を投稿しました。


13
PS:SFに関する一般的な信念に反して、DNSが機能している場合でも、IPv4のみのネットワークのマシンでIPv6 / AAAAを無効にするのには、いくつかの正当な理由があります。DNSリゾルバーの負荷をほぼ50%削減します。接続の起動時間を短縮します(DNSキャッシュが大幅に遅れている場合)。セキュリティと安定性を強化するために、非機能機能を無効にするベストプラクティスに従ってください。確かに、IPv6が利用可能になったときにIPv6を再度有効にするのを忘れると、私のシステムはIPv6のロールアウトを妨げるIPv4レガシーバラストになります。リストされたプロをこの詐欺と比較検討することを許可する必要があります。
ニルストートマン14年

localhostで完全なリゾルバを実行しない理由は何ですか?そうすれば、他の人の(一見)信頼できないDNSリゾルバへの依存を完全に排除できます。
サンダーステファン14年

@SanderSteffann会社のファイアウォールポリシーは通常、それを許可しません。しかし、他の場所ではオプションです。後で質問に追加します。
ニルストートマン14年

3
@joeqwertyサイトでIPv6がサポートされているかどうかについては、想定していません。DNSサーバーは標準に準拠しているものと想定しています。また、残念ながら一部のIT部門に、インフラストラクチャを適切に構成するスキルがありません。それについて鈍くてすみません。
ニルストートマン14年

4
私はあなたが言っていることを理解しています。あなたのボックスをネットワーク上で機能させる必要があります。その逆ではなく、それがあなたがここで求めていることです。ITの分野で顧客を非難し、顧客を尊重しないと、私は少し困惑します。それらは私たちのパンとバターです。良くも悪くも、それを尊重し、尊重する必要があります。私たちの顧客は私たちのビジネスの妨げではなく、彼らが私たちのビジネスの理由です。
joeqwerty 14年

回答:


9

の使用を停止しgethostbyname()ます。getaddrinfo()代わりに使用する必要があり、何年も使用されているはずです。マニュアルページでもこれについて警告しています。

gethostbyname *()、gethostbyaddr *()、herror()、およびhstrerror()関数は廃止されました。代わりに、アプリケーションはgetaddrinfo(3)、getnameinfo(3)、gai_strerror(3)を使用する必要があります。

ここまで見て実証Cにおける迅速なサンプルプログラムでのみ名前のレコードは、とWiresharkのキャプチャがあることを示す唯一のレコード検索がネットワーク上で行ってきました。

特に、Aレコードの参照のみai_familyを行うAF_INET場合に設定する必要があります。このサンプルプログラムは、返されたIPアドレスのみを出力します。getaddrinfo()発信接続を行う方法のより完全な例については、manページを参照してください。

Wiresharkのキャプチャ、172.25.50.3は、ローカルDNSリゾルバです。キャプチャはそこで取得されたため、その発信クエリと応答も表示されます。Aレコードのみが要求されたことに注意してください。AAAAルックアップはこれまで行われていません。

#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <stdio.h>

int main(void) {
    struct addrinfo hints;
    struct addrinfo *result, *rp;
    int s;
    char host[256];

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;

    s = getaddrinfo("www.facebook.com", NULL, &hints, &result);
    if (s != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
        exit(EXIT_FAILURE);
    }

    for (rp = result; rp != NULL; rp = rp->ai_next) {
        getnameinfo(rp->ai_addr, rp->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
        printf("%s\n", host);
    }
    freeaddrinfo(result);
}

面白い!どのアプリケーションがAAAAリクエストをトリガーするかを調査します。それが私たちだけの場合は、私たちの開発者にあなたの提案を伝えます。しかし、多くのDebian / Ubuntuパッケージ化ソフトウェアがこの問題に苦しんでいるという強い予感があり、それらにパッチを適用するつもりはありません。
ニルストエットマン

あなたのアプリケーションはおそらく最も重要なものです。他のすべてを修正できなくても、状況は改善される可能性があります。
マイケルハンプトン

4

疑わしい場合は、ソースコードを参照してください。それでは、見てみましょう... gethostbyname()は面白そうです。これは、私たちが見ているものを正確に説明しています。最初にIPv6を試し、次に答えが得られない場合はIPv4にフォールバックします。このRES_USE_INET6フラグは何ですか?それを遡って、res_setoptions()から来ています。これがresolv.conf読み込まれる場所です。

そして....それは私がアイデアから外れている。にRES_USE_INET6設定されていない場合、それがどのように設定されているかは完全に不明ですresolv.conf


RES_USE_INET6ができるで設定することoptions inet6の中でresolv.conf。私の問題は、コンパイル時に一度設定する設定を解除できないことだと思いますが、最近ではすべての主要なディストリビューションがそれを行っているようです(正しい?)。したがって、そのための機能要求はoptions no_inet6上記で述べました。
ニルストートマン14年

1
残念ながら、コードからわかるように、にはno_inet6オプションがありませんres_setoptions()。ただし、(no-)からわかるip6-dotintように、追加するのは簡単です。ディストリビューションによってデフォルトで設定されているという理論をテストするために、パッケージのソースファイルを取得し、「バージン」に一度コンパイルして(パッケージが動作を複製することを確認するため){ STRnLEN ("no-inet6"), 1, ~RES_USE_INET6 },options[]配列に以下を追加して、でそのオプションを設定すると、問題はなくなりますresolv.conf
BMDan 14年

1
最後に:価値のあることのために、localhostでDNSキャッシュを実行することでこれを解決します(上記参照)。コアシステムライブラリのハッキングバージョンを維持するよりも、ハッキングされた独自のDNSプロキシ/キャッシュを維持する方がはるかに簡単です。
BMDan 14年

3

ローカルリゾルバとしてBINDを使用できます。AADをフィルタリングするオプションがあります。

https://kb.isc.org/article/AA-00576/0/Filter-AAAA-option-in-BIND-9-.html


2
それは組み込みデバイスにとってはかなり重いものです。
マイケルハンプトン

ありがとう、BindのAAAAフィルターを知らなかった。マイケルが言及したように、Bindのフットプリントが大きいため、おそらく私たちにとっては解決策ではありません。しかし、他のシナリオでAAAA応答を除外したい人にとっては、実行可能な方法かもしれません。Ubuntuは実際には、少なくとも14.04で「--enable-filter-aaaa」を使用してバインドをビルドします。Debianについてはわかりません。-も参照してくださいipamworldwide.blogspot.co.uk/2011/09/...
ニルスToedtmann

1
私は14.04にいますが、このフィルタリングオプションは利用できないようです。
-Zitrax

0

PDNS-recursorをセットアップして、/ etc / resolv.confに設定し、「AAAA」ルックアップを拒否しようとしましたか?のようなものを使用するquery-local-address6=


1
query-local-address6=(クエリを送信するIPv6アドレス-IPv6を無効にしても、AAAA要求はIPv4を介して解決されることに注意してください)また、AAAAクエリをフィルタリングする他の設定(doc.powerdns.com/html/built-in-recursor.html)を特定できません。その情報がなければ、あなたの答えはあまり役に立ちません:(
Nils Toedtmann 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.