覆蓋 TTL 設置外部 DNS 記錄
我有一個綁定版本,如下所示
9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6.1.2
我有兩個特定於域的轉發器,即 test.example.com 和 internal-test.example.cloud.com
需要解析域“test.example.com”中的特定 cname 的本地 DNS 客戶端或解析器將由我的本地 DNS 伺服器轉發到配置的轉發器,並且它們的響應也被記憶體。一切都很好,沒問題。但是,我的問題是對於 Fordwared 查詢,外部 DNS 伺服器正在回复 60 的 TTL 值。所以我的內部 DNS 伺服器正在記憶體該響應僅 60 秒。有什麼方法可以覆蓋我的內部 DNS 伺服器的 TTL 嗎?對於該特定域。
/etc/named.conf 看起來如下
options { directory "/var/named"; allow-transfer{"none";}; allow-query {localhost; any;}; dump-file "/var/log/named_dump.db"; max-cache-ttl 300; }; zone "test.example.com" IN { type forward; forwarders {11.1.2.17; 11.1.3.59;}; forward only; }; zone "internal-test.example.cloud.com" IN { type forward; forwarders {11.1.2.17; 11.1.3.59;}; forward only; }; zone "domain.local" in { type master; file "domain.local"; }; [root@dchockal ~]# dig test.example.com ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6.1.2 <<>> test.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31197 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;test.example.com. IN A ;; ANSWER SECTION: test.example.com. 60 IN CNAME internal-test.example.cloud.com. internal-test.example.cloud.com. 60 IN A 121.1.2.22 internal-test.example.cloud.com. 60 IN A 121.1.2.23 internal-test.example.cloud.com. 60 IN A 121.1.4.24 internal-test.example.cloud.com. 60 IN A 121.1.4.25 ;; Query time: 133 msec ;; SERVER: 11.4.152.28#53(11.4.152.28) ;; WHEN: Thu Dec 15 15:31:22 2016 ;; MSG SIZE rcvd: 175
我不認為 BIND 具有該功能 - 僅減少 TTL (
cache-max-ttl
),而不增加(cache-min-ttl
似乎不適用於我的 BIND,但您可以試一試,看看它是否適用於您的版本)。但我們可以創建自己的權威域。這樣做之後,我們可以在該域中為外部域創建 CNAME 記錄。test.mydomain.com CNAME test.example.com.
然後,查詢
test.mydomain.com
解析為 的 IP 地址test.example.com
,並且可以根據需要配置 TTL。理論上,我們可以重寫 BIND 記憶體的區域,然後將其創建為本地區域文件,設置 TTL,然後重新啟動 BIND;但是,這太可怕了。
該軟體
dnsmasq
有一個選項,--min-cache-ttl=<time>
,其中time
小於或等於 3600 秒。手冊有警告。--min-cache-ttl=<time> Extend short TTL values to the time given when caching them. Note that artificially extending TTL values is in general a bad idea, do not do it unless you have a good reason, and understand what you are doing. Dnsmasq limits the value of this option to one hour, unless recompiled.
您的問題看起來好像您知道自己在做什麼。Unbound 也有這個功能。
cache-min-ttl: <seconds> Time to live minimum for RRsets and messages in the cache. Default is 0. If the minimum kicks in, the data is cached for longer than the domain owner intended, and thus less queries are made to look up the data. Zero makes sure the data in the cache is as the domain owner intended, higher values, especially more than an hour or so, can lead to trouble as the data in the cache does not match up with the actual data any more.
或許將 BIND 替換為 Unbound 或 dnsmasq,或者將其中之一用作 BIND 的轉發器。
BIND 無法做到這一點,它不被視為好的做法。但也許您可以更新到 BIND 9.10.4?在這種情況下,您可以使用 -
prefetch
選項。這將迫使 BIND 在其 TTL 到期前不久更新常用域上的記憶體數據(可能可用於特定區域,但我無法測試,因為此版本的 BIND 在 Raspbian 上尚不可用)。可以在此處找到有關該選項的更多資訊:例如,
options { ... prefetch 2 9; };
將強制對目前在記憶體中的任何域進行記憶體更新,在其 TTL 的最後 2 秒內進行查詢,並且通常具有超過 9 秒的 TTL。
順便說一句:如果您更新,請確保它是正確的 BIND 9.10.4。-mechanism
prefetch
是在 9.10 中引入的,但有一個醜陋的錯誤,僅從 9.10.4 開始修復:https://kb.isc.org/article/AA-01315/0/prefetch-performance-in-BIND-9.10.html