新四季網

dns的工作過程(DNS從入門到放棄系列)

2023-07-26 20:02:05 4

根據集群搭建PowerDNS生產環境。

架構圖

安裝環境

伺服器時區和時間統一:

# Ubuntu 22.04.1 LTS同步網絡時間和更改時區root@dnsdist01:/etc/powerdns# dateWed Dec 14 02:28:44 AM UTC 2022root@dnsdist01:/etc/powerdns# timedatectlroot@dnsdist01:/etc/powerdns# timedatectl list-timezonesroot@dnsdist01:/etc/powerdns# timedatectl set-timezone Asia/Shanghairoot@dnsdist01:/etc/powerdns# apt install ntpdateroot@dnsdist01:/etc/powerdns# ntpdate -u ntp.aliyun.com

負載均衡器和遞歸伺服器配置:

# 192.168.10.100和192.168.10.110中部署dnsdist和pdns-recursor (負載均衡器和遞歸伺服器)root@dnsdist01:~# hostnamectl --static hostname "dnsdist01" # 192.168.10.100root@dnsdist02:~# hostnamectl --static hostname "dnsdist02" # 192.168.10.110# 安裝dnsdistcat >/etc/apt/sources.list.d/pdns.list</etc/apt/preferences.d/pdns<<EOFPackage: pdns-*Pin: origin repo.powerdns.comPin-Priority: 600EOFcurl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add - && sudo apt-get update && sudo apt-get install dnsdistsystemctl status dnsdist.servicesystemctl stop dnsdist.servicesystemctl start dnsdist.service# 安裝pdns-recursorcat >/etc/apt/sources.list.d/pdns.list</etc/apt/preferences.d/pdns<<EOFPackage: pdns-*Pin: origin repo.powerdns.comPin-Priority: 600EOFcurl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add - && sudo apt-get update && sudo apt-get install pdns-recursorsystemctl status pdns-recursor.servicesystemctl stop pdns-recursor.servicesystemctl start pdns-recursor.service

由於默認啟動埠都是53,故pdns-recursor安裝好後並沒有啟動成功,這裡由於dnsdist和pdns-recursor部署在同一臺機器中,故pdns-recursor的服務埠需要進行更改,在這裡我更改為553埠。在下面的配置文件中說明。

說明Ubuntu 22.04.1 LTS網絡問題:

# 如果系統53埠被systemd-resolved佔用systemctl stop systemd-resolved.servicesystemctl disable systemd-resolved.service# 修改/etc/resolv.conf文件/etc/resolv.confnameserver 192.168.10.254 # 可寫網關IP或公共DNSoptions edns0 trust-adsearch .# 網卡信息network: ethernets: ens33: addresses: - 192.168.10.100/24 nameservers: addresses: - 192.168.10.254 search: [] routes: - to: default via: 192.168.10.254 version: 2

配置環境

伺服器192.168.10.100的配置如下:

# dnsdist配置文件路徑 /etc/dnsdist/dnsdist.conf-- 關閉安全更新 默認setSecurityPollSuffix("secpoll.powerdns.com") 安全漏洞會提醒setSecurityPollSuffix("")-- 設置本地監聽地址為192.168.10.100的53埠 默認127.0.0.1 如果要啟用IPv6需要設置IPv6的地址和埠setLocal('192.168.10.100:53')-- 允許列表內的IP來進行解析setacl({'192.168.0.0/16', '172.18.0.0/16'}) -- dnsdist是一個負載均衡器 它本身不做任何 DNS 解析或服務 因此它需要下遊伺服器 設置QPS-- 新增伺服器192.168.10.100:553,qps限制為10newServer({address="192.168.10.100:553", qps=10})-- 新增伺服器192.168.10.110:553,qps限制為10newServer({address="192.168.10.110:553", qps=10})-- 新增伺服器114.114.114.114,並使用本機的192.168.10.100與其進行通信--,})-- 設置服務負載方式為QPS查詢 https://dnsdist.org/guides/serverselection.htmlsetServerPolicy(firstAvailable)-- 開啟內置Web服務和API Prometheus監控指標需要調用Webserver("127.0.0.1:8083")-- 設置Web服務安全 只允許指定的IP訪問 如192.168.10.0/24這個網段訪問 不允許網段內的某個地址訪問setWebserverConfig({password="supersecretpassword",,})-- supersecretpassword和supersecretAPIkey 自己設定安全的字符串 123這種就不建議了 可以使用密碼生成器生成複雜的密碼-- DoH默認不啟用-- addDOHLocal('127.0.0.1:8053', '/etc/ssl/certs/example.com.pem', '/etc/ssl/private/example.com.key', "/",service-meta\\"; type=\\"text/html\\""}})-- DoT默認不啟用-- addTLSLocal('127.0.0.1:8053', {'/etc/ssl/certs/example.com.rsa.pem', '/etc/ssl/certs/example.com.ecdsa.pem'}, {'/etc/ssl/private/example.com.rsa.key', '/etc/ssl/private/example.com.ecdsa.key'})

上面的配置,192.168.10.100和192.168.10.110都默認該配置,修改下setLocal的IP位址即可。

遞歸伺服器配置:

# 訪問白名單 如果設置 則只允許這些逗號分隔的網絡掩碼遞歸 默認只允許訪問RFC 1918私有 IP 地址allow-from=127.0.0.0/8, 10.0.0.0/8, 100.64.0.0/10, 169.254.0.0/16, 192.168.0.0/16, 172.16.0.0/12# 可以把CIDR寫入到文件中 文件中必須每行一個CIDR 不允許逗號分隔 不寫絕對路徑 是下面include-dir指定conf配置文件路徑# allow-from-file=primit-acl.conf# 目錄路徑 默認/etc/powerdns 如果編譯安裝的就是指定的SYSCONFDIR變量路徑config-dir=/etc/powerdns# 根提示文件 默認/usr/share/dns/root.hints 例如將所有查詢轉發給另外一臺遞歸器時 可以關閉跟提示hint-file=/usr/share/dns/root.hints# 其他配置文件的目錄include-dir=/etc/powerdns/recursor.d# 服務監聽地址 默認127.0.0.1 IPv6的地址加埠需要方括號括起來IPv6地址local-address=192.168.10.100# 監聽埠 默認53local-port=553# 轉發域 如需要把內部域名轉發到權威伺服器中解析 格式 域名=IP:[埠] 可指定埠 不加冒號和埠就默認轉發指定IP的53埠# forward-zones=example.org=203.0.113.210:5300;127.0.0.1, powerdns.com=127.0.0.1;198.51.100.10:530;[2001:DB8::1:3]:5300forward-zones=example.org=192.168.10.130:53;192.168.10.140:53# 轉發域文件 每行只能寫一個域名 不可以逗號分隔 # 當轉發域域名比較多時 forward-zones單行寫就不夠方便 可讀性差 可直接寫入到單獨的文件中# forward-zones-file=primit-forward-zone.conf# 優先遞歸查詢權威伺服器 如果查詢不到 允許遞歸到公共DNS查詢forward-zones-recurse=.=223.5.5.5;114.114.114# lua腳本高級配置支持lua-config-file=/etc/powerdns/recursor.lua# 公共域名後綴列表public-suffix-list-file=/usr/share/publicsuffix/public_suffix_list.dat# 禁止記錄查詢的記錄和答案quiet=yes# 禁用安全更新 默認值security-poll-suffix=secpoll.powerdns.com 不允許安全更新security-poll-suffix=# 版本回復禁用 安全version-string="not currently available"# Web服務和API啟用 默認未啟用webserver=yes# 默認172.0.0.1webserver-address=192.168.10.100# 默認8082webserver-port=8082# Web訪問密碼webserver-password=pdnsrecursorpassword# api-keyapi-key=changeme# 日誌 文件格式化顯示logging-facility=0# 默認等級 6 信息loglevel=6# 默認本地緩存最大時間 單位秒max-negative-ttl=3600

原始文件進行備份:

mv /etc/powerdns/recursor.conf /etc/powerdns/recursor.conf.bakvim /etc/powerdns/recursor.conf# 複製上面的配置信息到該文件中

配置做好後,重啟服務:

# 重啟遞歸伺服器systemctl restart pdns-recursor.servicesystemctl status pdns-recursor.service# 重啟負載均衡器systemctl restart dnsdist.servicesystemctl status dnsdist.service

最終執行netstat命令查詢進程信息:

服務監聽

或者ss命令查看:

伺服器192.168.10.110也是同上一樣的配置,示例如下:

# dnsdist配置文件路徑 /etc/dnsdist/dnsdist.conf-- 關閉安全更新 默認setSecurityPollSuffix("secpoll.powerdns.com") 安全漏洞會提醒setSecurityPollSuffix("")-- 設置本地監聽地址為192.168.10.110的53埠 默認127.0.0.1setLocal('192.168.10.110:53')-- 設置訪問控制列表 https://dnsdist.org/advanced/acl.html 不設置就允許所有來源IP訪問setACL({'192.168.0.0/16', '172.18.0.0/16'})-- dnsdist是一個負載均衡器 它本身不做任何 DNS 解析或服務 因此它需要下遊伺服器 設置QPS-- https://dnsdist.org/guides/serverselection.html--, qps=10})-- 新增伺服器192.168.10.110:553 qps限制為10newServer({address="192.168.10.110:553", qps=10})-- 新增伺服器192.168.10.100:553 qps限制為10newServer({address="192.168.10.100:553", qps=10})-- 新增伺服器114.114.114.114 並使用本機的192.168.10.100與其進行通信--,})-- 開啟內置Web服務和APIwebserver("127.0.0.1:8083")-- 設置Web服務安全 只允許指定的IP訪問 如192.168.10.0/24這個網段訪問 不允許網段內的某個地址訪問setWebserverConfig({password="supersecretpassword",,})

dnsdist服務配置文件如上,下面配置遞歸伺服器配置:

# 訪問白名單 如果設置 則只允許這些逗號分隔的網絡掩碼遞歸 默認只允許訪問RFC 1918私有 IP 地址allow-from=127.0.0.0/8, 10.0.0.0/8, 100.64.0.0/10, 169.254.0.0/16, 192.168.0.0/16, 172.16.0.0/12# 可以把CIDR寫入到文件中 文件中必須每行一個CIDR 不允許逗號分隔 不寫絕對路徑 是下面include-dir指定conf配置文件路徑# allow-from-file=primit-acl.conf# 目錄路徑 默認/etc/powerdns 如果編譯安裝的就是指定的SYSCONFDIR變量路徑config-dir=/etc/powerdns# 根提示文件 默認/usr/share/dns/root.hints 例如將所有查詢轉發給另外一臺遞歸器時 可以關閉跟提示hint-file=/usr/share/dns/root.hints# 其他配置文件的目錄include-dir=/etc/powerdns/recursor.d# 服務監聽地址 默認127.0.0.1 IPv6的地址加埠需要方括號括起來IPv6地址local-address=192.168.10.110# 監聽埠 默認53local-port=553# 轉發域 如需要把內部域名轉發到權威伺服器中解析 格式 域名=IP:[埠] 可指定埠 不加冒號和埠就默認轉發指定IP的53埠# forward-zones=example.org=203.0.113.210:5300;127.0.0.1, powerdns.com=127.0.0.1;198.51.100.10:530;[2001:DB8::1:3]:5300forward-zones=example.org=192.168.10.130:53;192.168.10.140:53# 轉發域文件 每行只能寫一個域名 不可以逗號分隔# forward-zones-file=primit-forward-zone.conf# 優先遞歸查詢權威伺服器 如果查詢不到 允許遞歸到公共DNS查詢forward-zones-recurse=.=223.5.5.5;114.114.114# lua腳本高級配置支持lua-config-file=/etc/powerdns/recursor.lua# 公共域名後綴列表public-suffix-list-file=/usr/share/publicsuffix/public_suffix_list.dat# 禁止記錄查詢的記錄和答案quiet=yes# 禁用安全更新 默認值security-poll-suffix=secpoll.powerdns.com 不允許安全更新security-poll-suffix=# 版本回復禁用 安全version-string="not currently available"# Web服務和API啟用 默認未啟用webserver=yes# 默認172.0.0.1webserver-address=192.168.10.110# 默認8082webserver-port=8082# Web訪問密碼webserver-password=pdnsrecursorpassword# api-keyapi-key=changeme# 日誌 文件格式化顯示logging-facility=0# 默認等級 6 信息loglevel=6# 默認本地緩存最大時間 單位秒max-negative-ttl=3600

之前一個遞歸伺服器配置好後,dnsdist下遊伺服器只有一個UP,當兩個遞歸伺服器都配置好後,重啟dnsdist伺服器後,dnsdist的兩個下遊伺服器都UP

下遊伺服器都顯示UP狀態。

權威伺服器配置和安裝:

資料庫主從

資料庫一主一叢,利用keepalived進行故障切換:

兩臺機器 A 和 B,A 為主庫,負責讀寫,B 為從庫,負責讀數據。

如果 A 庫發生故障,B 庫成為主庫負責讀寫,修復故障後,A 成為從庫,主庫 B 同步數據到從庫 A。

上圖是從樓仔的原創文章截取過來,可直接到樓仔知乎查看。

主庫搭建和配置:192.168.10.120上搭建主庫同時搭建主PowerDNS Authoritative Server,正式環境建議使用RDS或者單獨機器搭建資料庫。

# apt-get安裝MySQL 5.7.40root@pdns01:/home/scops# apt update# 下載apt倉庫的安裝包,Ubuntu的安裝包是.deb文件wget https://dev.MySQL.com/get/mysql-apt-config_0.8.12-1_all.deb

彈出框中選擇:ubuntu bionic (Ubuntu18.04系統的代號是bionic,選擇18.04的版本庫用來安裝)

MySQL 5.7.40

彈出框中選擇:MySQL Server & Cluster

彈出框中選擇:mysql-5.7

mysql-5.7選擇

當前版本選擇MySQL 5.7

如上圖,確定當前版本是選擇mysql-5.7,點擊OK

# 首先導入倉庫的密鑰信息apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29# 更新倉庫信息apt update# 檢查是否成功配置MySQL5.7的倉庫apt-cache policy mysql-server

找到MySQL 5.7

# 使用apt安裝mysql客戶端和mysql服務端apt install -f -y mysql-client=5.7* mysql-community-server=5.7*

輸入密碼

​上圖彈出框中輸入root密碼並選擇ok,密碼任意,這裡設置中以hua321代替。

MySQL 5.7安裝好後,MySQL啟動默認配置文件路徑為:/etc/mysql/my.cnf,說明下/etc/mysql目錄下配置文件信息:

配置文件目錄

上圖中,my.cnf.fallback 是備份的回滾文件,其他都是有作用的。

my.cnf 是符號連結,指向 /etc/alternatives/my.cnf,但是這個文件也是個符號連結,文件指向 /etc/mysql/mysql.cnf,故最終文件是mysql.cnf,如果my.cnf做修改mysql.cnf是同步的。

my.cnf裡面沒有具體參數,而是包含兩個文件夾,並把不同模塊配置分文件方式放在不同文件夾中:

!includedir /etc/mysql/conf.d/!includedir /etc/mysql/mysql.conf.d/# 所以下面我們主要需要修改/etc/mysql/mysql.conf.d/mysqld.cnf文件,這個文件中主要配置伺服器參數配置

並且自動新建了systemd管理服務:mysql.service

# MySQL 5.7的狀態和啟停守護進程管理工具systemctl status mysql.servicesystemctl stop mysql.servicesystemctl start mysql.servicesystemctl restart mysql.service

主節點啟動配置文件配置:

# 登錄主節點資料庫root@pdns01:/etc/mysql# mysql -uroot -pEnter password: # 輸入上面的root密碼# 在主庫上 設置一個複製使用的帳戶 並授予replication slave這裡創建一個複製用戶dnstosyn允許從伺服器IP 192.168.10.130的主機進行連接mysql> grant replication slave,replication client on *.* to 'dnstosyn'@'192.168.10.130' identified by 'powerdns666';mysql> FLUSH PRIVILEGES;

主節點資料庫配置文件參數修改:

[mysqld]# 進程文件路徑pid-file = /var/run/mysqld/mysqld.pid# 套接字文件路徑socket = /var/run/mysqld/mysqld.sock# 數據目錄datadir = /var/lib/mysql# 錯誤日誌路徑log-error = /var/log/mysql/error.log# 默認只接受來自本地主機的連接# bind-address = 127.0.0.1# 禁用符號連接 為了安全symbolic-links = 0# [必須]配置唯一的server-id,不設置MySQL5.7以上會報錯 這裡以IP位址主機位標識 不重複即可server-id = 120# mysql會根據這個配置自動設置log_bin為on狀態,即開啟binlog 指定binlog的存儲位置,日誌格式為二進位log_bin=/var/log/mysql/master-bin# 二進位日誌記錄格式,並且可以是 STATEMENT,ROW 或 MIXED 三選一binlog_format=row# 需要同步的二進位資料庫名 (有多個的話,配置多個binlog-do-db) binlog-do-db = powerdns# 默認情況下備份是主庫的全部操作都會備份到從庫,實際可能需要忽略某些庫,可以在主庫中增加如下配置:# 不同步哪些資料庫(多個寫多行)# binlog-ignore-db = mysql# binlog-ignore-db = information_schema# binlog-ignore-db = performance_schema# binlog-ignore-db = sys# 自動清理 7 天前的log文件,可根據需要修改expire-logs-days=7# 如果是 1 ,則 mysqld 僅使用 IPNumbers;在這種情況下,授權 table 中的所有Host列值都必須是 IP 地址# skip_name_resolve=1# 並發連接數 默認100 一般小於1000即可 默認151max_connections=1000# 更改字符集init_connect='SET collation_connection = utf8_unicode_ci'init_connect='SET NAMES utf8'character-set-server = utf8collation-server = utf8_unicode_ciskip-character-set-client-handshake

驗證主庫信息:

mysql> show master status;mysql> reset master;mysql> show processlist;mysql> flush logs;

從節點資料庫配置:

[mysqld]pid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sockdatadir = /var/lib/mysqllog-error = /var/log/mysql/error.log# By default we only accept connections from localhost# bind-address = 127.0.0.1# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0# 必須 不設置MySQL5.7以上會報錯 這裡以IP位址主機位標識 不重複即可server-id=130# mysql會根據這個配置自動設置log_bin為on狀態,即開啟binlog 指定binlog的存儲位置,日誌格式為二進位relay_log=/var/log/mysql/mysql-relay-bin# 設置只讀權限read_only=on# 需要同步的資料庫名(多資料庫使用逗號,隔開)replicate-do-db=powerdns# 自動清理 7 天前的log文件,可根據需要修改expire-logs-days=7#設定需要複製的表#replicate-do-table=table_name#設定需要忽略的複製表#replicate-ignore-table=table_name# 如果是 1 ,則 mysqld 僅使用 IPNumbers;在這種情況下,授權 table 中的所有Host列值都必須是 IP 地址# skip_name_resolve=1# 並發連接數 默認100 一般小於1000即可 默認151max_connections=1000

檢查從節點資料庫:

# 要設置從庫與主庫進行通信複製 使用必要的連接信息配置從庫 在從庫上執行以下代碼CHANGE MASTER TO MASTER_HOST='192.168.10.120',MASTER_PORT=3306,MASTER_USER='dnstosyn',MASTER_PASSWORD='powerdns666',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=306;# 從節點資料庫啟動slave線程mysql> start slave;mysql> show slave status;mysql> show processlist;

設置從節點複製帳戶

​如上圖所示,如果沒有設置,打開從節點是沒有用的。

查看從庫伺服器狀態:mysql> show slave status\G;

需要保證Slave_SQL_Running和Slave_IO_Running是Yes狀態,主從複製才正常。

# 查看主庫伺服器的運行狀態show master status; # 查看從庫伺服器主機列表show slave hosts; # 獲取binlog文件列表show binary logs; # 只查看第一個binlog文件的內容show binlog events; # 查看指定binlog文件的內容show binlog events in 'mysql-bin.000001'; # 啟動從庫複製線程start slave; # 停止從庫複製線程stop slave;# 重置從庫複製線程reset slave;

Slave_SQL_Running配置問題:通過使用命令show slave status\G; 發現,Slave_SQL_Running的配置項為NO,需要修改為YES。

mysql> stop slave;Query OK, 0 rows affected (0.00 sec)mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;Query OK, 0 rows affected (0.00 sec)mysql> start slave;Query OK, 0 rows affected (0.00 sec)

最後檢查主從通信的複製狀態:

Slave_IO_State # 從站的當前狀態Slave_IO_Running: Yes # 讀取主程序二進位日誌的I/O線程是否正在運行Slave_SQL_Running: Yes # 執行讀取主伺服器中二進位日誌事件的SQL線程是否正在運行,與I/O線程一樣Seconds_Behind_Master # 是否為0,0就是已經同步了

在主庫中增加powerdns的默認表單結構:PowerDNS Authoritative Nameserver 4.7版本默認模板

# 創建資料庫powerdnsmysql> CREATE DATABASE powerdns CHARACTER SET utf8 COLLATE utf8_general_ci;# 切換到powerdns資料庫mysql> use powerdns;# SQL語句創建表結構CREATE TABLE domains ( id INT AUTO_INCREMENT, name VARCHAR(255) NOT NULL, master VARCHAR(128) DEFAULT NULL, last_check INT DEFAULT NULL, type VARCHAR(8) NOT NULL, notified_serial INT UNSIGNED DEFAULT NULL, account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, options VARCHAR(64000) DEFAULT NULL, catalog VARCHAR(255) DEFAULT NULL, PRIMARY KEY (id)) Engine=InnoDB CHARACTER SET 'latin1';CREATE UNIQUE INDEX name_index ON domains(name);CREATE INDEX catalog_idx ON domains(catalog);CREATE TABLE records ( id BIGINT AUTO_INCREMENT, domain_id INT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, type VARCHAR(10) DEFAULT NULL, content VARCHAR(64000) DEFAULT NULL, ttl INT DEFAULT NULL, prio INT DEFAULT NULL, disabled TINYINT(1) DEFAULT 0, ordername VARCHAR(255) BINARY DEFAULT NULL, auth TINYINT(1) DEFAULT 1, PRIMARY KEY (id)) Engine=InnoDB CHARACTER SET 'latin1';CREATE INDEX nametype_index ON records(name,type);CREATE INDEX domain_id ON records(domain_id);CREATE INDEX ordername ON records (ordername);CREATE TABLE supermasters ( ip VARCHAR(64) NOT NULL, nameserver VARCHAR(255) NOT NULL, account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL, PRIMARY KEY (ip, nameserver)) Engine=InnoDB CHARACTER SET 'latin1';CREATE TABLE comments ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, name VARCHAR(255) NOT NULL, type VARCHAR(10) NOT NULL, modified_at INT NOT NULL, account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, comment TEXT CHARACTER SET 'utf8' NOT NULL, PRIMARY KEY (id)) Engine=InnoDB CHARACTER SET 'latin1';CREATE INDEX comments_name_type_idx ON comments (name, type);CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);CREATE TABLE domainmetadata ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, kind VARCHAR(32), content TEXT, PRIMARY KEY (id)) Engine=InnoDB CHARACTER SET 'latin1';CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);CREATE TABLE cryptokeys ( id INT AUTO_INCREMENT, domain_id INT NOT NULL, flags INT NOT NULL, active BOOL, published BOOL DEFAULT 1, content TEXT, PRIMARY KEY(id)) Engine=InnoDB CHARACTER SET 'latin1';CREATE INDEX domainidindex ON cryptokeys(domain_id);CREATE TABLE tsigkeys ( id INT AUTO_INCREMENT, name VARCHAR(255), algorithm VARCHAR(50), secret VARCHAR(255), PRIMARY KEY (id)) Engine=InnoDB CHARACTER SET 'latin1';CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

查看主庫表:

powerdns表結構

查看從庫是否同步該表結構,檢查發現表結構一致,從這代表主從複製搭建完成,特別記住這裡實現的是單向複製,也就是主庫的數據同步到從庫。如果需要實現雙向複製,自己自行了解,在Local DNS場景不建議使用。

keepalived切換

# Ubuntu 22.04.1 LTS安裝Keepalived 也在192.168.10.120和192.168.10.130上安裝apt-cache madison keepalivedapt install keepalived# 配置文件cp /usr/share/doc/keepalived/samples/keepalived.conf.sample /etc/keepalived/keepalived.conf# 主 192.168.10.120! Configuration File for keepalivedglobal_defs { router_id MySQL_HA script_user root root}vrrp_script chk_mysql_port { script "/etc/keepalived/chk_mysql.sh" interval 2 weight -5 fall 2 rise 1}vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 50 nopreempt priority 101 advert_int 1 authentication { auth_type PASS auth_pass hua.com } virtual_ipaddress { 192.168.10.10/24 } track_script { chk_mysql_port }}# 備 192.168.10.130! Configuration File for keepalivedglobal_defs { router_id MySQL_HA script_user root root}vrrp_script chk_mysql_port { script "/etc/keepalived/chk_mysql.sh" interval 2 weight -5 fall 2 rise 1}vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass hua.com } virtual_ipaddress { 192.168.10.10/24 } track_script { chk_mysql_port }}# /etc/keepalived/chk_mysql.sh 腳本#!/bin/bashcounter=$(netstat -na | grep "LISTEN" | grep "3306" | wc -l)if [ "${counter}" -eq 0 ]; then /etc/init.d/keepalived stopfi

重啟 keepalived ,發現在主伺服器192.168.10.120中有 ens33網卡上 多出虛擬IP 192.168.10.10/24

虛擬IP

至此完成MySQL Keepalived 的高可用安裝和切換。

權威伺服器安裝

權威伺服器還是在這兩臺設備上安裝,實際生成環境我是把資料庫和權威伺服器分開安裝。

安裝 PowerDNS Authoritative Nameserver 4.7.3

# 創建官方提供的repo源文件,從官方倉庫安裝,路徑:/etc/apt/sources.list.d/pdns.listcat >/etc/apt/sources.list.d/pdns.list</etc/apt/preferences.d/pdns<<EOFPackage: pdns-*Pin: origin repo.powerdns.comPin-Priority: 600EOF# 執行安裝curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add - && sudo apt-get update && sudo apt-get install pdns-server

查看管理狀態:

# 查看權威伺服器狀態systemctl status pdns.service# 啟停systemctl stop pdns.servicesystemctl start pdns.service

主從資料庫新建資料庫用戶,作為主權威伺服器讀寫資料庫使用:

mysql> grant ALL PRIVILEGES on powerdns.* to 'pdnsadmin'@'%' identified by 'powerdns4321';mysql> FLUSH PRIVILEGES;

如果MySQL資料庫使用的存儲引擎是InnoDB,建議加外鍵約束:

查看powerdns資料庫使用什麼存儲引擎:show table status from powerdns;

ALTER TABLE records ADD CONSTRAINT `records_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;ALTER TABLE comments ADD CONSTRAINT `comments_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;ALTER TABLE domainmetadata ADD CONSTRAINT `domainmetadata_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;ALTER TABLE cryptokeys ADD CONSTRAINT `cryptokeys_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

主權威伺服器配置文件:

cp /etc/powerdns/pdns.conf /etc/powerdns/pdns.conf.bak# 配置pdns.conf# 關閉安全更新security-poll-suffix=# 啟用APIapi=yes# 用於訪問 REST API 的靜態預共享身份驗證密鑰api-key=Qno9k64Vkkkyfz1LtC3klk# 訪問控制allow-axfr-ips=0.0.0.0/0allow-dnsupdate-from=0.0.0.0/0allow-notify-from=0.0.0.0/0allow-unsigned-notify=yesallow-unsigned-autoprimary=yesalso-notify=192.168.10.120,192.168.10.120# 不允許區域傳輸 資料庫進行主從複製disable-axfr=no# 作為守護進程運行daemon=yes# 在守護進程中運行guardian=no# 是否是主伺服器primary=yes# 啟動權限setgid=pdnssetuid=pdns# 是否是從伺服器secondary=no# 開啟詳細查詢日誌log-dns-details=yes# 不啟用所有查詢日誌log-dns-queries=no# 日誌級別loglevel=6# 日誌加上時間戳log-timestamp=yes# 不同日誌分類存儲logging-facility=0# 記錄query查詢query-logging=yes# 啟用webserverwebserver=yes# webserver監聽地址webserver-address=127.0.0.1# webserver監聽埠webserver-port=8081# pdns進程監聽地址 啟用IPv4local-address=0.0.0.0# pdns進程監聽埠local-port=53# MySQL資料庫配置launch=gmysql# MySQL資料庫地址 這裡寫VIP位址gmysql-host= 192.168.10.10# MySQL資料庫埠 默認3306gmysql-port=3306# 要連接的資料庫名gmysql-dbname=powerdns# 資料庫用戶gmysql-user=pdnsadmin# 資料庫密碼gmysql-password=powerdns4321

從權威伺服器配置文件:

# 關閉安全更新security-poll-suffix=# 啟用APIapi=yes# 用於訪問 REST API 的靜態預共享身份驗證密鑰api-key=Qno9k64Vkkkyfz1LtC3klk# 訪問控制allow-axfr-ips=0.0.0.0/0allow-dnsupdate-from=0.0.0.0/0allow-notify-from=0.0.0.0/0allow-unsigned-notify=yesallow-unsigned-autoprimary=yesalso-notify=192.168.10.120,192.168.10.120# 不允許區域傳輸 資料庫進行主從複製disable-axfr=no# 作為守護進程運行daemon=yes# 在守護進程中運行guardian=no# 是否是主伺服器primary=no# 啟動權限setgid=pdnssetuid=pdns# 是否是從伺服器secondary=yes# 輔助節點檢查區域更新秒數 默認60xfr-cycle-interval=60# 開啟詳細查詢日誌log-dns-details=yes# 不啟用所有查詢日誌log-dns-queries=no# 日誌級別loglevel=6# 日誌加上時間戳log-timestamp=yes# 不同日誌分類存儲logging-facility=0# 記錄query查詢query-logging=yes# 啟用webserverwebserver=yes# webserver監聽地址webserver-address=127.0.0.1# webserver監聽埠webserver-port=8081# pdns進程監聽地址 啟用IPv4local-address=0.0.0.0# pdns進程監聽埠local-port=53# MySQL資料庫配置launch=gmysql# MySQL資料庫地址 這裡寫VIP位址gmysql-host= 192.168.10.10# MySQL資料庫埠 默認3306gmysql-port=3306# 要連接的資料庫名gmysql-dbname=powerdns# 資料庫用戶gmysql-user=pdnsadmin# 資料庫密碼gmysql-password=powerdns4321

安裝MySQL模塊依賴包:主從權威伺服器都需要安裝,不然pdns啟動不起來。

apt install pdns-backend-mysql

錯誤解決:

root@pdns01:/etc/keepalived# mysql -h 192.168.10.10 -u pdnsadmin -pEnter password: ERROR 1129 (HY000): Host '192.168.10.120' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

指向這個命令解決:

mysql -u root -p -e 'flush hosts'Enter password: FLUSH HOSTS;

在192.168.10.120和192.168.10.130中啟動pdns,權威伺服器至此搭建完成:

# 配置文件完成修改 重啟PDNSsystemctl restart pdns.service# 查看狀態systemctl status pdns.service

總結

圖中所畫使用了7臺伺服器,實際我在文章搭建是使用了5臺伺服器,其中Web管理權威伺服器的PDNS-Admin 服務還未搭建,將在下篇做搭建演示。

故文章中只使用了4臺伺服器,其中在192.168.10.100和192.168.10.110兩臺伺服器同時搭建了dnsdist、pdns-recursor。

而在192.168.10.120和192.168.10.130中同時搭建了MySQL、Keepalived、和PowerDNS Authoritative Nameserver。其中資料庫一主一從,做單向主從複製,Keepalived做資料庫高可用,故障切換;PowerDNS Authoritative Nameserver權威伺服器配置為主從架構。

至此架構圖中最核心的組件和服務搭建完成,一套內部生成環境中使用的Local DNS就此完成;補充說明:實際生成環境資料庫建議單獨部署,不要和權威伺服器搭建在同一臺伺服器,或者使用雲資料庫;如RDS等,可用性更好。

下一篇單獨介紹下PDNS-Admin的搭建,這套Web管理權威伺服器的增刪改查系統,同時演示使用drill命令的基本操作和今天搭建的三套DNS組件管理工具,下一篇也將是DNS系列終篇,敬請期待。

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了