...制御不能な破損したDNSサーバーを補償するため。
私たちの問題:センサーデータを収集する組み込みデバイスを、主にIPv4のみのさまざまなサイトに展開します。一部のサイトでは、AAAAクエリを完全に無視するか、DNSキャッシュやファイアウォールが正しく構成されていない、または壊れているなど、ネットワークのメンテナンスが不十分です。施設部門への外部サプライヤとして、私たちは(時には消極的)IT部門にほとんど影響を与えません。すぐにDNSサーバー/ファイアウォールを修正する可能性は非常にわずかです。
デバイスへの影響は、gethostbyname()ごとに、AAAAクエリがタイムアウトするまでプロセスが待機する必要があることです。この時点で、一部のプロセスはすでに接続試行を完全にタイムアウトしています。
解決策を探しています...
- システム全体。何十ものアプリケーションを個別に再構成できない
- 非永続的かつ構成可能。IPv6が修正/ロールアウトされる場所/時期を(再)有効にする必要があります。再起動はOKです。
- ソリューションでglibcのようなコアライブラリを置き換える必要がある場合、保守用の既知のリポジトリ(Debian Testing、Ubuntu universe、EPELなど)から代替ライブラリパッケージを入手できるようにする必要があります。自己構築は多くの理由でオプションではないので、どこから始めればよいかさえわからないので、それらをまったくリストしません...
最も明白な解決策は、リゾルバライブラリを、たとえば/ etc / { resolv、nsswitch、gai } .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には、同様の関連する質問があることに注意してください。私の質問は、解決しようとしている実際の問題を詳しく説明していること、明示的な要件をリストしていること、頻繁に提案されている非実用的なソリューションをブラックリストに載せていること、単一のアプリケーションに固有のものではないという点で異なります。この議論の後、質問を投稿しました。