主頁 >  其他 > 各開發語言DNS快取配置建議

各開發語言DNS快取配置建議

2022-12-08 07:07:14 其他

作者:翟賀龍

一、背景

在計算機領域,涉及性能優化動作時首先應被考慮的原則之一便是使用快取,合理的資料快取機制能夠帶來以下收益:

1.縮短資料獲取路徑,熱點資料就近快取以便后續快速讀取,從而明顯提升處理效率; 2.降低資料遠程獲取頻次,緩解后端資料服務壓力、減少前端和后端之間的網路帶寬成本;

從 CPU 硬體的多級快取設計,到瀏覽器快速展示頁面,再到大行其道的 CDN、云存盤網關等商業產品,處處應用了快取理念,

在公網領域,如作業系統、瀏覽器和移動端 APP 等成熟產品所具備的快取機制,極大的消解了網路提供商如電信移動聯通、內容提供商如各大門戶平臺和 CDN 廠商直面的服務壓力,運營商的 DNS 才能從容面對每秒億萬級的 DNS 決議,網路設備集群才能輕松承擔每秒 Tbit 級的互聯網帶寬,CDN 平臺才能快速處理每秒億萬次的請求,

面對公司目前龐大且仍在不斷增長的的域名接入規模,筆者所在團隊在不斷優化集群架構、提升 DNS 軟體性能的同時,也迫切需要推動各類客戶端環境進行域名決議請求機制的優化,因此,特組織團隊成員調研、撰寫了這篇指南文章,以期為公司、客戶及合作方的前端開發運維人員給出合理建議,優化 DNS 整體請求流程,為業務增效,

本文主要圍繞不同業務和開發語言背景下,客戶端本地如何實作 DNS 決議記錄快取進行探討,同時基于筆者所在團隊對 DNS 本身及公司網路環境的掌握,給出一些其他措施,最終致力于客戶端一側的 DNS 決議請求規范化,

二、名詞解釋

1. 客戶端

本文所述客戶端,泛指所有主動發起網路請求的物件,包括但不限于服務器、PC、移動終端、作業系統、命令列工具、腳本、服務軟體、用戶 APP 等,

2. DNS

Domain Name System(Server/Service),域名系統(服務器/服務),可理解為一種類資料庫服務;

客戶端同服務端進行網路通信,是靠 IP 地址識別對方;而作為客戶端的使用者,人類很難記住大量 IP 地址,所以發明了易于記憶的域名如 www.jd.com,將域名和 IP 地址的映射關系,存盤到 DNS 可供客戶端查詢;

客戶端只有通過向 DNS 發起域名決議請求從而獲取到服務端的 IP 地址后,才能向 IP 地址發起網路通信請求,真正獲取到域名所承載的服務或內容,

參考:域名系統 域名決議流程

3. LDNS

Local DNS,本地域名服務器;公網接入環境通常由所在網路供應商自動分配(供應商有控制權,甚至可作 DNS 劫持,即篡改決議域名得到的 IP),內網環境由 IT 部門設定自動分配;

通常 Unix、類Unix、MacOS系統可通過 /etc/resolv.conf 查看自己的 LDNS,在 nameserver 后宣告,該檔案亦支持用戶自助編輯修改,從而指定 LDNS,如公網常見的公共 DNS 如谷歌 DNS、114DNS 等;純內網環境通常不建議未咨詢IT部門的情況下擅自修改,可能導致服務不可用;可參考 man resolv.conf 指令結果,

當域名決議出現例外時,同樣應考慮 LDNS 服務例外或發生決議劫持情況的可能,

參考:windows系統修改TCP/IP設定(含DNS)

4. hosts

DNS 系統可以動態的提供域名和IP的映射關系,普遍存在于各類作業系統的hosts檔案則是域名和IP映射關系的靜態記錄檔案,且通常 hosts 記錄優先于 DNS 決議,即本地無快取或快取未命中時,則優先通過 hosts 查詢對應域名記錄,若 hosts 無相關映射,則繼續發起 DNS 請求,關于 Linux 環境下此邏輯的控制,請參考下文 C/C++ 語言 DNS 快取介紹部分,

所以在實際作業中,常利用上述默認特性,將特定域名和特定 IP 映射關系寫到 hosts 檔案中(俗稱“固定 hosts”),用于繞開 DNS 決議程序,對目標 IP 作針對性訪問(其效果與 curl 的-x選項,或 wget 的 -e 指定 proxy 選項,異曲同工);

5. TTL

Time-To-Live,生存時間值,此概念在多領域適用且可能有不同意義,

本文涉及到 TTL 描述均針對資料快取而言,可直白理解為已快取資料的“有效期”,從資料被快取開始計,在快取中存在時長超過 TTL 規定時長的資料被視為過期資料,資料被再次呼叫時會立刻同權威資料源進行有效性確認或重新獲取,

因快取機制通常是被動觸發和更新,故在客戶端的快取有效期內,后端原始權威資料若發生變更,客戶端不會感知,表現為業務上一定程度的資料更新延遲、快取資料與權威資料短時不一致,

對于客戶端側 DNS 記錄的快取 TTL,我們建議值為 60s;同時如果是低敏感度業務比如測驗、或域名決議調整不頻繁的業務,可適當延長,甚至達到小時或天級別;

三、DNS 決議優化建議

1. 各語言網路庫對 DNS 快取的支持調研

以下調研結果,推薦開發人員參考,以實作自研客戶端 DNS 快取,各開發語言對 DNS 快取支持可能不一樣,在此逐個分析一下,

C/C++ 語言

(1)glibc 的 getaddrinfo 函式

Linux環境下的 glibc 庫提供兩個域名決議的函式:gethostbyname 函式和 getaddrinfo 函式,gethostbyname 是曾經常用的函式,但是隨著向 IPv6 和執行緒化編程模型的轉移,getaddrinfo 顯得更有用,因為它既決議 IPv6 地址,又符合執行緒安全,推薦使用 getaddrinfo 函式,

函式原型:

int getaddrinfo( const char *node, 
                 const char *service,
                 const struct addrinfo *hints,
                 struct addrinfo **res);

getaddrinfo 函式是比較底層的基礎庫函式,很多開發語言的域名決議函式都依賴這個函式,因此我們在此介紹一下這個函式的處理邏輯,通過 strace 命令跟蹤這個函式系統呼叫,

 

 

1)查找 nscd 快取(nscd 介紹見后文)

我們在 linux 環境下通過 strace 命令可以看到如下的系統呼叫

//連接nscd
socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(3) 

通過 unix socket 介面"/var/run/nscd/socket"連接nscd服務查詢DNS快取,

2)查詢 /etc/hosts 檔案

如果nscd服務未啟動或快取未命中,繼續查詢hosts檔案,我們應該可以看到如下的系統呼叫

//讀取 hosts 檔案
open("/etc/host.conf", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=9, ...}) = 0
...
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3
fcntl(3, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
fstat(3, {st_mode=S_IFREG|0644, st_size=178, ...}) = 0

3)查詢 DNS 服務

從 /etc/resolv.conf 配置中查詢到 DNS 服務器(nameserver)的IP地址,然后做 DNS 查詢獲取決議結果,我們可以看到如下系統呼叫

//獲取 resolv.conf 中 DNS 服務 IP
open("/etc/resolv.conf", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=25, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fef2abee000
read(3, "nameserver 114.114.114.114\n\n", 4096) = 25
...
//連到 DNS 服務,開始 DNS 查詢
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("114.114.114.114")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])

而關于客戶端是優先查找 /etc/hosts 檔案,還是優先從 /etc/resolv.conf 中獲取 DNS 服務器作查詢決議,是由 /etc/nsswitch.conf 控制:

#/etc/nsswitch.conf 部分配置
...
#hosts:     db files nisplus nis dns
hosts:      files dns
...

實際通過 strace 命令可以看到,系統呼叫 nscd socket 之后,讀取 /etc/resolv.conf 之前,會讀取該檔案

newfstatat(AT_FDCWD, "/etc/nsswitch.conf", {st_mode=S_IFREG|0644, st_size=510, ...}, 0) = 0
...
openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3

4)驗證

#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>

int gethostaddr(char * name);

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "%s $host", argv[0]);
        return -1;
    }

    int i = 0;
    for(i = 0; i < 5; i++)
    {
        int ret = -1;
        ret = gethostaddr(argv[1]);
        if (ret < 0)
        {
            fprintf(stderr, "%s $host", argv[0]);
            return -1;
        }
        //sleep(5);
    }

    return 0;
}

int gethostaddr(char* name)
{
    struct addrinfo hints;
    struct addrinfo *result;
    struct addrinfo *curr;
    int ret = -1;
    char ipstr[INET_ADDRSTRLEN];
    struct sockaddr_in  *ipv4;

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

    ret = getaddrinfo(name, NULL, &hints, &result);
    if (ret != 0)
    {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
        return ret;
    }

    for (curr = result; curr != NULL; curr = curr->ai_next)
    {
        ipv4 = (struct sockaddr_in *)curr->ai_addr;
        inet_ntop(curr->ai_family, &ipv4->sin_addr, ipstr, INET_ADDRSTRLEN);
        printf("ipaddr:%s\n", ipstr);
    }

    freeaddrinfo(result);
    return 0;
}

綜上分析,getaddrinfo 函式結合 nscd ,是可以實作 DNS 快取的,

(2)libcurl 庫的域名決議函式

libcurl 庫是 c/c++ 語言下,客戶端比較常用的網路傳輸庫,curl 命令就是基于這個庫實作,這個庫也是呼叫 getaddrinfo 庫函式實作 DNS 域名決議,也是支持 nscd DNS 快取的,

int
Curl_getaddrinfo_ex(const char *nodename,
                    const char *servname,
                    const struct addrinfo *hints,
                    Curl_addrinfo **result)
{
    ...
    error = getaddrinfo(nodename, servname, hints, &aihead);
    if(error)
        return error;
    ...
}

Java

Java 語言是很多公司業務系統開發的主要語言,通過撰寫簡單的 HTTP 客戶端程式測驗驗證 Java 的網路庫是否支持 DNS 快取,測驗驗證了 Java 標準庫中 HttpURLConnection 和 Apache httpcomponents-client 這兩個組件,

(1)Java 標準庫 HttpURLConnection

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;


public class HttpUrlConnectionDemo {

    public static void main(String[] args) throws Exception {
        String urlString = "http://example.my.com/";

        int num = 0;
        while (num < 5) {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();
            os.flush();
            os.close();

            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream is = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                System.out.println("rsp:" + sb.toString());
            } else {
                System.out.println("rsp code:" + conn.getResponseCode());
            }
            num++;
        }
    }
}

測驗結果顯示 Java 標準庫 HttpURLConnection 是支持 DNS 快取,5 次請求中只有一次 DNS 請求,

(2)Apache httpcomponents-client

import java.util.ArrayList;
import java.util.List;

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.entity.UrlEncodedFormEntity;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.NameValuePair;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.message.BasicNameValuePair;

public class QuickStart {
    public static void main(final String[] args) throws Exception {
        int num = 0;
        while (num < 5) {
            try (final CloseableHttpClient httpclient = HttpClients.createDefault()) {
                final HttpGet httpGet = new HttpGet("http://example.my.com/");
                try (final CloseableHttpResponse response1 = httpclient.execute(httpGet)) {
                    System.out.println(response1.getCode() + " " + response1.getReasonPhrase());
                    final HttpEntity entity1 = response1.getEntity();
                    EntityUtils.consume(entity1);
                }
            }
        num++;
        }
    }
}

測驗結果顯示 Apache httpcomponents-client 支持 DNS 快取,5 次請求中只有一次 DNS 請求,

從測驗中發現 Java 的虛擬機實作一套 DNS 快取,即實作在 java.net.InetAddress 的一個簡單的 DNS 快取機制,默認為快取 30 秒,可以通過 networkaddress.cache.ttl 修改默認值,快取范圍為 JVM 虛擬機行程,也就是說同一個 JVM 行程中,30秒內一個域名只會請求DNS服務器一次,同時 Java 也是支持 nscd 的 DNS 快取,估計底層呼叫 getaddrinfo 函式,并且 nscd 的快取級別比 Java 虛擬機的 DNS 快取高,

# 默認快取 ttl 在 jre/lib/security/java.security 修改,其中 0 是不快取,-1 是永久快取
networkaddress.cache.ttl=10

# 這個引數 sun.net.inetaddr.ttl 是以前默認值,目前已經被 networkaddress.cache.ttl 取代

Go

隨著云原生技術的發展,Go 語言逐漸成為云原生的第一語言,很有必要驗證一下 Go 的標準庫是否支持 DNS 快取,通過我們測驗驗證發現 Go 的標準庫 net.http 是不支持 DNS 快取,也是不支持 nscd 快取,應該是沒有呼叫 glibc 的庫函式,也沒有實作類似 getaddrinfo 函式的功能,這個跟 Go語言的自舉有關系,Go 從 1.5 開始就基本全部由 Go(.go) 和匯編 (.s) 檔案寫成的,以前版本的 C(.c) 檔案被全部重寫,不過有一些第三方 Go 版本 DNS 快取庫,可以自己在應用層實作,還可以使用 fasthttp 庫的 httpclient,

(1)標準庫net.http

package main

import (
        "flag"
        "fmt"
        "io/ioutil"
        "net/http"
        "time"
)

var httpUrl string

func main() {
    flag.StringVar(&httpUrl, "url", "", "url")
    flag.Parse()
    getUrl := fmt.Sprintf("http://%s/", httpUrl)

    fmt.Printf("url: %s\n", getUrl)
    for i := 0; i < 5; i++ {
        _, buf, err := httpGet(getUrl)
        if err != nil {
            fmt.Printf("err: %v\n", err)
            return
        }
        fmt.Printf("resp: %s\n", string(buf))
        time.Sleep(10 * time.Second)    # 等待10s發起另一個請求
    }
}

func httpGet(url string) (int, []byte, error) {
    client := createHTTPCli()
    resp, err := client.Get(url)
    if err != nil {
        return -1, nil, fmt.Errorf("%s err [%v]", url, err)
    }
    defer resp.Body.Close()

    buf, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return resp.StatusCode, buf, err
    }

    return resp.StatusCode, buf, nil
}
func createHTTPCli() *http.Client {
    readWriteTimeout := time.Duration(30) * time.Second
    tr := &http.Transport{
        DisableKeepAlives: true,  //設定短連接
        IdleConnTimeout:   readWriteTimeout,
    }
    client := &http.Client{
        Timeout:   readWriteTimeout,
        Transport: tr,
    }
    return client
}

從測驗結果來看,net.http 每次都去 DNS 查詢,不支持 DNS 快取,

(2)fasthttp 庫

fasthttp 庫是 Go 版本高性能 HTTP 庫,通過極致的性能優化,性能是標準庫 net.http 的 10 倍,其中一項優化就是支持 DNS 快取,我們可以從其原始碼看到

//主要在fasthttp/tcpdialer.go中
type TCPDialer struct {
    ...
    // This may be used to override DNS resolving policy, like this:
    // var dialer = &fasthttp.TCPDialer{
    // 	Resolver: &net.Resolver{
    // 		PreferGo:     true,
    // 		StrictErrors: false,
    // 		Dial: func (ctx context.Context, network, address string) (net.Conn, error) {
    // 			d := net.Dialer{}
    // 			return d.DialContext(ctx, "udp", "8.8.8.8:53")
    // 		},
    // 	},
    // }
    Resolver Resolver

    // DNSCacheDuration may be used to override the default DNS cache duration (DefaultDNSCacheDuration)
    DNSCacheDuration time.Duration
    ...
}

可以參考如下方法使用 fasthttp client 端

func main() {
	// You may read the timeouts from some config
	readTimeout, _ := time.ParseDuration("500ms")
	writeTimeout, _ := time.ParseDuration("500ms")
	maxIdleConnDuration, _ := time.ParseDuration("1h")
	client = &fasthttp.Client{
		ReadTimeout:                   readTimeout,
		WriteTimeout:                  writeTimeout,
		MaxIdleConnDuration:           maxIdleConnDuration,
		NoDefaultUserAgentHeader:      true, // Don't send: User-Agent: fasthttp
		DisableHeaderNamesNormalizing: true, // If you set the case on your headers correctly you can enable this
		DisablePathNormalizing:        true,
		// increase DNS cache time to an hour instead of default minute
		Dial: (&fasthttp.TCPDialer{
			Concurrency:      4096,
			DNSCacheDuration: time.Hour,
		}).Dial,
	}
	sendGetRequest()
	sendPostRequest()
}

(3)第三方DNS快取庫

這個是 github 中的一個 Go 版本 DNS 快取庫

可以參考如下代碼,在HTTP庫中支持DNS快取

r := &dnscache.Resolver{}
t := &http.Transport{
    DialContext: func(ctx context.Context, network string, addr string) (conn net.Conn, err error) {
        host, port, err := net.SplitHostPort(addr)
        if err != nil {
            return nil, err
        }
        ips, err := r.LookupHost(ctx, host)
        if err != nil {
            return nil, err
        }
        for _, ip := range ips {
            var dialer net.Dialer
            conn, err = dialer.DialContext(ctx, network, net.JoinHostPort(ip, port))
            if err == nil {
                break
            }
        }
        return
    },
}

Python

(1)requests 庫

#!/bin/python

import requests

url = 'http://example.my.com/'

num = 0
while num < 5:
    headers={"Connection":"close"}     # 開啟短連接
    r = requests.get(url,headers = headers)
    print(r.text)
    num +=1

(2)httplib2 庫

#!/usr/bin/env python
import httplib2
http = httplib2.Http()
url = 'http://example.my.com/'

num = 0
while num < 5:
    loginHeaders={
        'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.0 Chrome/30.0.1599.101 Safari/537.36',
        'Connection': 'close'  # 開啟短連接
    }
    response, content = http.request(url, 'GET', headers=loginHeaders)
    print(response)
    print(content)
    num +=1

(3)urllib2 庫

#!/bin/python

import urllib2
import cookielib

httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)

loginHeaders={
    'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.0 Chrome/30.0.1599.101 Safari/537.36',
    'Connection': 'close' # 開啟短連接
}

num = 0
while num < 5:
    request=urllib2.Request('http://example.my.com/',headers=loginHeaders)
    response = urllib2.urlopen(request)
    page=''
    page= response.read()
    print response.info()
    print page
    num +=1

Python 測驗三種庫都是支持 nscd 的 DNS 快取的(推測底層也是呼叫 getaddrinfo 函式),以上測驗時使用 HTTP 短連接,都在 python2 環境測驗,

總結

針對 HTTP 客戶端來說,可以優先開啟 HTTP 的 keep-alive 模式,可以復用 TCP 連接,這樣可以減少 TCP 握手耗時和重復請求域名決議,然后再開啟 nscd 快取,除了 Go 外,C/C++、Java、Python 都可支持 DNS 快取,減少 DNS查詢耗時,

這里只分析了常用 C/C++、Java、Go、Python 語言,歡迎熟悉其他語言的小伙伴補充,

2. Unix/類 Unix 系統常用 dns 快取服務:

在由于某些特殊原因,自研或非自研客戶端本身無法提供 DNS 快取支持的情況下,建議管理人員在其所在系統環境中部署DNS快取程式;

現介紹 Unix/類 Unix 系統適用的幾款常見輕量級 DNS 快取程式,而多數桌面作業系統如 Windows、MacOS 和幾乎所有 Web 瀏覽器均自帶 DNS 快取功能,本文不再贅述,

P.S. DNS 快取服務請務必確保隨系統開機啟動

nscd

name service cache daemon 即裝即用,通常為 linux 系統默認安裝,相關介紹可參考其 manpage:man nscdman nscd.conf

(1)安裝方法:通過系統自帶軟體包管理程式安裝,如 yum install nscd

(2)快取管理(清除):

1.service nscd restart 重啟服務清除所有快取; 2.nscd -i hosts 清除 hosts 表中的域名快取(hosts 為域名快取使用的 table 名稱,nscd 有多個快取 table,可參考程式相關 manpage)

dnsmasq

較為輕量,可選擇其作為 nscd 替代,通常需單獨安裝

(1)安裝方法:通過系統自帶軟體包管理程式安裝,如 yum install dnsmasq

(2)核心檔案介紹(基于 Dnsmasq version 2.86,較低版本略有差異,請參考對應版本檔案如 manpage 等)

(3)/etc/default/dnsmasq 提供六個變數定義以支持六種控制類功能

(4)/etc/dnsmasq.d/ 此目錄含 README 檔案,可參考;目錄內可以存放自定義組態檔

(5)/etc/dnsmasq.conf 主組態檔,如僅配置 dnsmasq 作為快取程式,可參考以下配置

listen-address=127.0.0.1                #程式監聽地址,務必指定本機內網或回環地址,避免暴露到公網環境
port=53                                 #監聽埠
resolv-file=/etc/dnsmasq.d/resolv.conf  #配置dnsmasq向自定義檔案內的 nameserver 轉發 dns 決議請求
cache-size=150                          #快取記錄條數,默認 150 條,可按需調整、適當增大
no-negcache                             #不快取決議失敗的記錄,主要是 NXDOMAIN,即域名不存在
log-queries=extra                       #開啟日志記錄,指定“=extra”則記錄更詳細資訊,可僅在問題排查時開啟,平時關閉
log-facility=/var/log/dnsmasq.log       #指定日志檔案

#同時需要將本機 /etc/resolv.conf 第一個 nameserver 指定為上述監聽地址,這樣本機系統的 dns 查詢請求才會通過 dnsmasq 代為轉發并快取回應結果,
#另 /etc/resolv.conf 務必額外配置 2 個 nameserver,以便 dnsmasq 服務例外時支持系統自動重試,注意 resolv.conf 僅讀取前 3 個 nameserver

(6)快取管理(清除):

1.kill -s HUP `pidof dnsmasq` 推薦方式,無需重啟服務 2.kill -s TERM `pidof dnsmasq`service dnsmasq stop 3.service dnsmasq force-reloadservice dnsmasq restart

(7)官方檔案:https://thekelleys.org.uk/dnsmasq/doc.html

3. 純內網業務取消查詢域名的AAAA記錄的請求

以 linux 作業系統為例,常用的網路請求命令列工具常常通過呼叫 getaddrinfo() 完成域名決議程序,如 ping、telnet、curl、wget 等,但其可能出于通用性的考慮,均被設計為對同一個域名每次決議會發起兩個請求,分別查詢域名 A 記錄(即 IPV4 地址)和 AAAA 記錄(即 IPV6 地址),

因目前大部分公司的內網環境及云上內網環境還未使用 ipv6 網路,故通常 DNS 系統不為內網域名添加 AAAA 記錄,徒勞請求域名的 AAAA 記錄會造成前端應用和后端 DNS 服務不必要的資源開銷,因此,僅需請求內網域名的業務,如決定自研客戶端,建議開發人員視實際情況,可將其設計為僅請求內網域名 A 記錄,尤其當因故無法實施本地快取機制時,

4. 規范域名處理邏輯

客戶端需嚴格規范域名/主機名的處理邏輯,避免產生大量對不存在域名的決議請求(確保域名從權威渠道獲取,避免故意或意外使用隨機構造的域名、主機名),因此類請求的回傳結果(NXDOMAIN)通常不被快取或快取時長較短,且會觸發客戶端重試,對后端 DNS 系統造成一定影響,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/539447.html

標籤:其他

上一篇:Zabbix6.0使用教程 (一)—zabbix新增功能介紹1

下一篇:【高精密時鐘】NTP網路校時服務器在WIN平臺下除錯步驟

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more