#!/bin/bash
# DNS主域名服務
# user li 20250325# 檢查當前用戶是否為root用戶
# 因為配置DNS服務通常需要較高的權限,只有root用戶才能進行一些關鍵操作
if [ "$USER" != "root" ]; then# 如果不是root用戶,輸出錯誤信息echo "錯誤:非root用戶,權限不足!"# 退出腳本,返回狀態碼0exit 0
fi# 防火墻與高級權限部分
# 停止并禁用防火墻服務,因為防火墻可能會阻止DNS服務的網絡通信
# 使用 && 連接命令,只有前一個命令執行成功才會執行下一個命令
systemctl stop firewalld && systemctl disable firewalld && echo "防火墻已經關閉"# 修改SELinux配置文件,將SELinux設置為禁用狀態
# sed -i 表示直接在原文件上進行修改
# s/SELINUX=*/SELINUX=disabled/g 是sed的替換命令,將SELINUX= 開頭的內容替換為SELINUX=disabled
# setenforce 0 是臨時禁用SELinux
sed -i 's/SELINUX=*/SELINUX=disabled/g' /etc/selinux/config && setenforce 0 && echo "關閉selinux"# 安裝BIND相關工具
# BIND(Berkeley Internet Name Domain)是常用的DNS服務器軟件
yum install -y bind
# 檢查上一個命令(yum install -y bind)的執行結果
if [ $? = 0 ]; then# 如果執行成功,輸出安裝成功的信息echo "安裝成功"
else# 如果執行失敗,輸出安裝失敗的信息echo "安裝失敗"# 腳本暫停5秒,方便用戶查看錯誤信息sleep 5# 退出腳本,返回狀態碼0exit 0
fi# 設置變量部分
# 提示用戶輸入DNS區域名,例如 xiaomao.com
# -e 選項允許使用反斜杠轉義字符,-p 選項用于指定提示信息
read -ep "請設置DNS區域名(如xiaomao.com):" a
# 提示用戶輸入本機IP地址
read -ep "請輸入本機IP地址:" b
# 提示用戶輸入反向解析的IP地址,例如 1.168.192
read -ep "請輸入反向解析的IP地址(如1.168.192):" c
# 將用戶輸入的本機IP地址賦值給變量 ip
ip="$b"
# 從本機IP地址中提取最后一段數字,用于反向解析
# cut -d '.' -f 4 表示以點號為分隔符,提取第4個字段
d=$(echo "$ip" | cut -d '.' -f 4)# 配置BIND主配置文件部分
# 備份原有的BIND主配置文件
cp /etc/named.conf /etc/named/conf.bak
# 修改BIND主配置文件,將監聽地址從 127.0.0.1 改為 any
# 這樣可以讓DNS服務器監聽所有可用的網絡接口
sed -i 's/listen-on port 53 { 127.0.0.1; };/listen-on port 53 { any; };/g' /etc/named.conf
# 修改BIND主配置文件,將允許查詢的地址從 localhost 改為 any
# 這樣可以讓任何客戶端都可以向該DNS服務器發起查詢請求
sed -i 's/allow-query { localhost; }/allow-query { any; }/g' /etc/named.conf# 向 /etc/named.rfc1912.zones 文件中追加正向和反向解析區域的配置信息
# 正向解析區域配置指定了域名對應的文件路徑
# 反向解析區域配置指定了反向解析對應的文件路徑
echo "zone "$a" IN {type master;file \"/var/named/$a.zone\";
};zone "$c.in-addr.arpa" IN {type master;file \"/var/named/$c.rev\";
};" >> /etc/named.rfc1912.zones# 創建正向解析區域文件
# 正向解析區域文件定義了域名到IP地址的映射關系
echo "\$TTL 86400
@ IN SOA ns.$a. admin.$a. (2025032501 ; Serial3600 ; Refresh1800 ; Retry604800 ; Expire86400 ; Minimum TTL
)
@ IN NS ns.$a.
$a. IN A $b
ns IN A $b
" > /var/named/$a.zone# 創建反向解析區域文件
# 反向解析區域文件定義了IP地址到域名的映射關系
echo "\$TTL 86400
@ IN SOA ns.$a. admin.$a. (2025032501 ; Serial3600 ; Refresh1800 ; Retry604800 ; Expire86400 ; Minimum TTL
)
@ IN NS ns.$a.
$d IN PTR $a.
" > /var/named/$c.rev# 調整權限部分
# 將正向和反向解析區域文件的所有者和所屬組設置為 named
# named 是BIND服務運行的用戶
chown named:named /var/named/$a.zone /var/named/$c.rev
# 設置正向和反向解析區域文件的權限為 640
# 即所有者有讀寫權限,所屬組有讀權限,其他用戶沒有權限
chmod 640 /var/named/$a.zone /var/named/$c.rev# 啟動BIND服務并設置為開機自啟
# systemctl enable named 用于設置BIND服務開機自啟
# systemctl start named 用于啟動BIND服務
systemctl enable named && systemctl start named
# 檢查上一個命令(啟動BIND服務)的執行結果
if [ $? = 0 ]; then# 如果執行成功,輸出服務啟動成功的信息echo "服務啟動成功"
else# 如果執行失敗,輸出失敗信息echo "破產,10秒后退出"# 腳本暫停10秒,方便用戶查看錯誤信息sleep 10# 退出腳本,返回狀態碼0exit 0
fi
測試結果
現實中做dns 一般都是為了提升效率,只借助路由器的解析人多了會變得很慢。?