公司目前有一套F5 DNS域名解析服務(wù)器黔漂,領(lǐng)導(dǎo)考慮還需要構(gòu)建一套備份用的DNS進(jìn)行域名解析進(jìn)行冷備检访,但是因為考慮到成本問題,如果再買一套新的F5 DNS服務(wù)器成本太高登澜,經(jīng)過查詢資料她按,考慮通過docker容器加bing9實現(xiàn)域名解析毁枯,以下步驟是整理后實現(xiàn)bind9+docker容器的方法
1.構(gòu)建bind9鏡像
首先準(zhǔn)備兩臺服務(wù)器嗜浮,保障可以正常訪問外網(wǎng)象缀,以便下載部署docker跪削。
Docker 要求 CentOS 系統(tǒng)的內(nèi)核版本高于 3.10 ,通過?uname -r?命令查看你當(dāng)前的內(nèi)核版本
$ uname -r
安裝依賴包?陵刹,yum-util 提供yum-config-manager功能默伍,另外兩個是devicemapper驅(qū)動依賴的
yum install -y yum-utils device-mapper-persistent-data lvm2
設(shè)置yum源
先備份一份:
cd ? /etc/yum.repos.d
cp CentOS-Base.repo CentOS-Base.repo.bak
# 替換阿里云鏡像源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
或者:
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
運行yum makecache生成緩存
運行yum update更新系統(tǒng), 這個過程會比較慢
然后安裝docker
yum install? -y? docker
啟動docker
service docker start 或者systemctl start docker
設(shè)置docker開啟自動啟動
systemctl enable docker
因為服務(wù)器是開通的公網(wǎng),所以直接進(jìn)行搜索下載centos鏡像
docker pull? centos
#構(gòu)建 啟動一個centos7基礎(chǔ)鏡像容器衰琐,然后啟動centos鏡像也糊,用于部署bind9做準(zhǔn)備
docker run --name centos7 --privileged -ti -e "container=docker" -d -v /sys/fs/cgroup:/sys/fs/cgroup centos:7 /usr/sbin/init
規(guī)劃? ? ? ? ? ? ? ? ? ? ? ? ? ? ??IP
bind9客戶端? ? ? ? ? ? ? ?172.18.0.2
bind9服務(wù)端? ? ? ? ? ? ? ?172.18.0.3
在兩個物理機(jī)上創(chuàng)建私有網(wǎng)絡(luò),默認(rèn)為橋接網(wǎng)絡(luò)
docker network create --subnet=172.18.0.0/24 private
2.# 配置容器初始化腳本羡宙,實現(xiàn)下載更新容器的centos版本狸剃,因為我的機(jī)器是需要配置代理進(jìn)行公網(wǎng)訪問,代理配置需要看個人服務(wù)器情況進(jìn)行配置
mkdir -p ~/deploy/bind9
cat > ~/deploy/bind9/init.sh <<EOF
#!/bin/bash
sed -i "/proxy=/d" /etc/yum.conf
echo "proxy=https://134.80.19.88:6001" >> /etc/yum.conf
rm -f /etc/yum.repos.d/*.repo
curl -x 134.80.19.88:6001 -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -x 134.80.19.88:6001 -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all; yum makecache fast
yum -y update
yum install -y bind which bind-utils
cp /etc/named.conf /etc/named.conf.old
cp /etc/sysconfig/named /etc/sysconfig/named.old
EOF
3.# 復(fù)制上面的腳本到容器中并執(zhí)行腳本內(nèi)容升級容器centos版本
docker cp ~/deploy/bind9/init.sh centos7:/root/
docker exec -it centos7 sh -c "bash /root/init.sh"
4.配置DNS管理工具rndc狗热,/etc/rndc.conf
# 生成rndc默認(rèn)配置數(shù)據(jù)(密鑰钞馁、rndc服務(wù)地址等)
docker exec -it centos7 bash -c "rndc-confgen" > ~/deploy/bind9/init-rndc.cnf
# 移除無用的rndc.key
docker exec -it centos7 bash -c "mv /etc/rndc.key /etc/rndc.key.nouse"
# 創(chuàng)建bind9配置文件到宿主機(jī)映射目錄
mkdir -p ~/deploy/bind9/conf
# 拷貝rndc密鑰到rndc.conf中
cat ~/deploy/bind9/init-rndc.cnf | grep -Pzo '^key "rndc-key" {\s*\n *.*;\s*\n *.*;\s*\n};' > ~/deploy/bind9/conf/rndc.conf
echo >> ~/deploy/bind9/conf/rndc.conf
cat ~/deploy/bind9/init-rndc.cnf | grep -Pzo '^options {\s*\n *.*;\s*\n *.*;\s*\n *.*;\s*\n};' >> ~/deploy/bind9/conf/rndc.conf
# 修改rndc.conf中默認(rèn)的rndc服務(wù)地址
perl -p -i -e 's/default-server .*/default-server 172.18.0.3;/g' ~/deploy/bind9/conf/rndc.conf
5. 配置/etc/named.conf
# 拷貝容器中的原始named.conf到宿主機(jī),更改文件屬性為644匿刮,目的是不需要到容器內(nèi)進(jìn)行內(nèi)容的更改僧凰,操作方便
docker cp centos7:/etc/named.conf ~/deploy/bind9/conf/named.conf
chmod 644 ~/deploy/bind9/conf/named.conf
# 獲取named-parts.conf的行范圍
start_line=`grep -n 'Use with the following in named.conf' ~/deploy/bind9/init-rndc.cnf | cut -d ':' -f 1`
start_line=`expr $start_line + 1`
end_line=`grep -n 'End of named.conf' ~/deploy/bind9/init-rndc.cnf | cut -d ':' -f 1`
end_line=`expr $end_line - 1`
# 提取named-parts.conf的行范圍、反注釋熟丸,導(dǎo)出到臨時文件
sed -n "$start_line,$end_line p" init-rndc.cnf | sed 's/^# //g' > ~/deploy/bind9/named-parts.conf
# 替換rndc監(jiān)聽地址為0.0.0.0
perl -p -i -e 's/inet .* port 953/inet 0.0.0.0 port 953/g' ~/deploy/bind9/named-parts.conf
# 替換允許訪問rndc的客戶端地址
perl -p -i -e 's/allow.*;/allow { 127.0.0.1; 172.18.0.2; } keys { "rndc-key"; };/g' ~/deploy/bind9/named-parts.conf
# 將上面修改的文件named-parts.conf?內(nèi)容追加到named.conf
cat ~/deploy/bind9/named-parts.conf >> ~/deploy/bind9/conf/named.conf
# 修改named.conf監(jiān)聽地址為any(注意不是0.0.0.0)
perl -p -i -e 's/listen-on port 53 { .*; };/listen-on port 53 { any; };/g' ~/deploy/bind9/conf/named.conf
# 修改named.conf允許的客戶端地址為any
perl -p -i -e 's/allow-query *{ .*; };/allow-query? ? { any; };/g' ~/deploy/bind9/conf/named.conf
# 禁用dnssec训措,否則授權(quán)其他DNS解析時將會出錯
perl -p -i -e 's/dnssec-enable *.*;/dnssec-enable no;/g' ~/deploy/bind9/conf/named.conf
perl -p -i -e 's/dnssec-validation *.*;/dnssec-validation no;/g' ~/deploy/bind9/conf/named.conf
# 在allow-query配置所在行后添加allow-new-zones
sed -i '/allow-new-zones/d' ~/deploy/bind9/conf/named.conf
sed -i '/allow-query *{ any; };/a\? ? ? ? allow-new-zones yes;' ~/deploy/bind9/conf/named.conf
# 配置filter-aaaa-on-v4參數(shù)
sed -i '/filter-aaaa-on-v4/d' ~/deploy/bind9/conf/named.conf
sed -i '/allow-new-zones *.*;/a\? ? ? ? filter-aaaa-on-v4 yes;' ~/deploy/bind9/conf/named.conf
# 配置二級DNS授權(quán)解析,可以通過其他解析地址進(jìn)行解析
sed -i '/forward/d' ~/deploy/bind9/conf/named.conf
sed -i '/filter-aaaa-on-v4 *.*;/a\? ? ? ? forward only;' ~/deploy/bind9/conf/named.conf
sed -i '/forward only;/a\? ? ? ? forwarders { 10.17.253.11; };' ~/deploy/bind9/conf/named.conf
# 刪除所有^M換行符
perl -p -i -e 's/\r//g' ~/deploy/bind9/conf/named.conf
# 配置日志
# 刪除原有日志定義(不可重入)
start_line=`grep -n 'logging {' ~/deploy/bind9/conf/named.conf | cut -d ':' -f 1 | head -1`
end_line=`expr $start_line + 6`
sed -i "$start_line,$end_line d" ~/deploy/bind9/conf/named.conf
echo >> ~/deploy/bind9/conf/named.conf
cat >> ~/deploy/bind9/conf/named.conf <<!
logging {
? ? ? ? channel bind.log {
? ? ? ? ? ? ? ? file "/var/lib/bind/bind.log" versions 10 size 20m;
? ? ? ? ? ? ? ? severity debug;
? ? ? ? ? ? ? ? print-category yes;
? ? ? ? ? ? ? ? print-severity yes;
? ? ? ? ? ? ? ? print-time yes;
? ? ? ? };
? ? ? ? category queries { bind.log; };
? ? ? ? category default { bind.log; };
? ? ? ? category config { bind.log; };
};
!
# 創(chuàng)建日志文件
mkdir -p ~/deploy/bind9/logs
touch ~/deploy/bind9/logs/bind.log
chmod 646 ~/deploy/bind9/logs/bind.log
6.配置/etc/sysconfig/named
# 拷貝原始容器中的named配置文件到宿主機(jī)
docker cp centos7:/etc/sysconfig/named ~/deploy/bind9/conf/named
# 添加named文件僅解析IPv4配置
sed -i '/^OPTIONS=/d' ~/deploy/bind9/conf/named
echo 'OPTIONS="-4"' >> ~/deploy/bind9/conf/named
7.復(fù)制容器內(nèi)的zone文件到宿主機(jī)光羞,可通過配置zone文件的域名進(jìn)行解析
docker cp centos7:/var/named ~/deploy/bind9/zone
chmod -R 647 ~/deploy/bind9/zone
8. 提交bind容器
# 刪除同名鏡像
docker rmi bind:9.11
# 提交一個bind9的基礎(chǔ)鏡像
docker commit centos7 bind:9.11
# 銷毀centos7容器
docker kill centos7; docker rm centos7
9. bind9服務(wù)端容器的啟動
# 基于私有網(wǎng)絡(luò)創(chuàng)建一個固定IP的bind9服務(wù)端容器
docker run --name bind9-srv --net private --ip 172.18.0.3 -p 53:53/udp --privileged -ti -e "container=docker" -d -v /sys/fs/cgroup:/sys/fs/cgroup -v /root/deploy/bind9/conf/named.conf:/etc/named.conf -v /root/deploy/bind9/conf/rndc.conf:/etc/rndc.conf -v /root/deploy/bind9/conf/named:/etc/sysconfig/named -v /root/deploy/bind9/zone:/var/named -v /root/deploy/bind9/logs/bind.log:/var/lib/bind/bind.log bind:9.11 /usr/sbin/init
# 啟動服務(wù)端的bind9容器
docker exec -it bind9-srv sh -c "systemctl enable named --now"
docker exec -it bind9-srv sh -c "systemctl status named -l"
10. bind9客戶端容器的啟動
# 基于私有網(wǎng)絡(luò)創(chuàng)建一個固定IP的bind9客戶端容器
docker run --name bind9-clnt --net private --ip 172.18.0.2 --privileged -ti -e "container=docker" -d -v /sys/fs/cgroup:/sys/fs/cgroup -v /root/deploy/bind9/conf/rndc.conf:/etc/rndc.conf bind:9.11 /usr/sbin/init
# 測試rndc連接绩鸣,查看是否可以正常進(jìn)行連接私有網(wǎng)絡(luò)
docker exec -it bind9-clnt sh -c "rndc -c /etc/rndc.conf -s 172.18.0.3 -p 953 status"
# 測試創(chuàng)建一個zone文件的域名配置,然后查看是否可以進(jìn)行域名解析
cat > ~/deploy/bind9/zone/sword.cn.zone <<!
\$TTL 86400
@ IN SOA 123.sword.cn. root.sword.cn. (
2015042313;Serial
3H;Refresh
15M;Retry
1W;Expire
1D;Minimum
);
IN NS 123.sword.cn.
123 IN A 192.168.1.9
456 IN A 192.168.1.10
789 IN A 192.168.1.11
!
更改現(xiàn)在的配置文件的屬性纱兑,要不然不能進(jìn)行正常的域名解析
chmod 755 sword.cn.zone
通過rndc 將zone域名配置寫入到容器的服務(wù)端
docker exec -it bind9-clnt sh -c "rndc -s 172.18.0.3 -p 953 addzone sword.cn '{ type master; file \"sword.cn.zone\"; };'"
# 測試已配置的zone是否可以進(jìn)行域名解析
docker exec -it bind9-clnt sh -c "nslookup 123.sword.cn 172.18.0.3"
# 測試授權(quán)的域名是否可以進(jìn)行解析
docker exec -it bind9-clnt sh -c "nslookup bass.sdboss.com 172.18.0.3"
以上就是通過構(gòu)建bind9+docker容器實現(xiàn)的域名解析步驟~