某种情况下如openstack或者openshift/kubernetes软件部署过程由于需要标准的 域名系统(DNS UPDATE)RFC 2136中的动态更新功能, 但是现有的阿里云/华为云均不提供该规范,大多理由为安全问题.
此时需要自建DDNS解决此问题.
需要配置自有DNS服务器,参考配置DNS服务器脚本. 操作系统基于centos 7.5
在阿里云万网的DNS服务器新建2条记录:
ns.ddns.xxxxx.com -- A记录 --IPV4指向需要安装的DNS服务器IP
http://ns.ddns.xxxxx.com
此时ddns子域名下的所有解析全部转移到这台DNS服务器进行解析服务.
首先,我们需要生成一个Key,用于更新记录的授权。这里使用了HMAC-MD5算法来生成Key。运行:
128-n HOST ddnsxxxxx |
执行完成后会在当前目录生成2个文件,
Kddnsxxxxx.+157+43433.key Kddnsxxxxx.+157+43433.private
打开其中的private,复制key出来.
more Kddnsxxxxx.+157+43433.privatePrivate-key-format: v1.3157(HMAC_MD5)Key: MjR1T1Bdwi9NaxiT+5yIYA==Bits: AAA=201812070222572018120702225720181207022257 |
在/etc/named.conf中,zone “ddns.xxxxxx.com”之前加上:secret内容就是刚才复制出来的key值.
"ddnskey"{algorithm hmac-md5;"MjR1T1Bdwi9NaxiT+5yIYA==";}; |
然后继续修改文件末尾zone的定义:
"ddns.xxxxx.com"IN {type master;"ddns.xxxxx.com.zone";allow-update { key ddnskey; };}; |
同时,selinux也有可能限制named写入文件,需要关闭:
true |
设置完成后。重启named:
systemctl restart named |
使用nsupdate命令对DNS进行更新:
# nsupdate127.0.0.153> key ddnskey MjR1T1Bdwi9NaxiT+5yIYA==2002.2.2.2> send |
测试update结果
@localhost9.9.4-RedHat-9.9.4-72@localhost;; global options: +cmd;; Got answer:281561112;; OPT PSEUDOSECTION:04096;; QUESTION SECTION:;; ANSWER SECTION:20013.37.27.291;; AUTHORITY SECTION:120;; ADDITIONAL SECTION:12039.106.92.70msec127.0.0.1#53(127.0.0.1)0710:41:49201897 |
别忘记开通防火墙,包括主机的 53 udp/tcp,还有云主机的upd/tcp 53都开通.
同时做一次异地机器测试,检查DNS是否在其他dns服务器有复制.通过nslookup 检查TTL值,检查ns名称是否正确.
/tool dns-update dns-server=39.108.90.77key-name="ddnskey"key="MjR1T1Bdwi9NaxiT+5yIYA=="name=abcdefg address="3.4.5.6"zone="ddns.xxxxx.com"ttl=200 |
更详细routerOS脚本在这里ddnsscript.txt,


# :log info "DDNS: Begin":local ddnsuser "ddns-key":local ddnspass "q1B3kUxxWioLEVh74h8g==":local ddnshost "vpn":local ddnszone "ddns.iqyuan.com":local ddnsinterface "pppoe-2F":local ddnns "vpn.ddns.iqyuan.com":global ddnslastip# :global ddnslastip [:resolve $ddnns]:global ddnsip [ /ip address get [/ip address find interface=$ddnsinterface] address ]# log info $ddnslastip# log info ( [:pick $ddnsip 0 [:find $ddnsip "/"]]):if ([:typeof [:global ddnslastip]] = nil ) do={ :global ddnslastip 0.0.0.0/0 } else={ :set ddnslastip $ddnslastip }:if ([:typeof [:global ddnsip]] = nil ) do={:log info (" DDNS: No ip address present on $ddnsinterface , please check ")} else={:if ($ddnsip != $ddnslastip) do={# :log info "DDNS: DDNS!"/tool dns-update dns-server=39.108.90.77 key-name=$ddnsuser key=$ddnspass name=$ddnshost address=[:pick $ddnsip 0 [:find $ddnsip "/"] ] ttl=200 zone=$ddnszone:log info ( "shuaxin DDNS" . $ddnsip):global ddnslastip $ddnsip} else={# :log info "DDNS: IP"}}#:log info "DDNS: End"