web-dev-qa-db-ja.com

linux dnsmasq:ttlを増やすにはどうすればよいですか?

解決されたエントリのTTL)を指定することは可能ですか?言い換えると、解決されたエントリに対して受信したTTLをオーバーライドして、それらをより高くすることは可能ですか?

理由:dnsmasqがwww.google.comを頻繁に解決しようとしているのが私の好みではありません。

5
jldupont

簡単にできないと思います。 TTLはGoogleのネームサーバーによって設定されており、負荷分散の目的で低く設定されています。

キャッシュサイズを増やすと役立つ可能性がありますが、Googleのような超短TTLの場合はおそらく役に立ちません。

非公式に、TTLオーバーライド機能を提供するパッチがいくつかあります。これらは dnsmasq-discussメーリングリスト で見つけたので、自分で作成したい場合は、試してみてください(メーリングリストのアーカイブで、より新しいバージョンのパッチを確認できます)。 :

7
quack quixote

Dnsmasq Cソースコードの整数オーバーフローのバグを悪用することで、再コンパイルすることなく、実際に3600秒の--min-cache-ttlチェックをバイパスできます。動作する値は次のとおりです。

CLI経由:-min-cache-ttl = 6442450943

Dnsmasq.conf経由:min-cache-ttl = 6442450943

なぜこれが機能するのですか?さて、dnsmasq Cコードは、3600秒の符号付き整数値定数を指定します。これは、ユーザーがオーバーライド値として指定したものと比較およびチェックされます。値が3600より大きい場合、ユーザー入力は無視され、代わりに定数3600が使用されます。このオーバーライド値もsignedintですが、コードの数行後、デーモンの初期化時に入力ttl値がunsigned longintにキャストされます。

一見すると、入力ファイルまたは構成ファイルで値を-20億に設定するだけではないのではないかと思うかもしれません。さて、早期に中止して終了する最初のdnsmasq入力チェックがあります。ただし、+ 40億を超える整数をラップすると、ゼロから開始します。さらに+20億+1を追加すると、最初のチェックをバイパスしながら、有効な負の数に折り返すことができます。

では、なぜこれが機能するのでしょうか。符号付き整数の範囲は約-20億から+20億であるのに対し、符号なし整数の範囲は0から+40億であるためです。入力解析後のdnsmasqチェックによって負の値として解釈されるように、約+20億のマークでラップアラウンドする値を取得する必要があります。本質的に、値が-20億として否定的に解釈されるため、ttl> 3600のチェックに合格します。 -20億は確かに<3600です。しかし、コードの2番目の部分が-20億を変換すると、入力ttlが-2ではなく約2 ^ 31 + 1(符号なし)に変換されます。 ^ 31 + 1(署名済み)。

もちろん、この方法で指定できるのは非常に大きなttl値のみです。このようなttl値はまったく合理的ではないため、これは誰にとっても役に立たない可能性があります。しかし、それは巧妙なトリックです(dnsmasqバグ)。一時的な解決策としてデバッグやいじりにのみ役立つ場合でも、これが誰かに役立つことを願っています。これがあなたの状況でうまくいくかうまくいかない場合は、遠慮なくコメントしてください。楽しい! :)

0
25931858