2020年9月12日更新:也可以不设置DDNS。各大云计算平台都提供有用于跟踪实例的DNS,比如AWS提供有“公有DNS”,点击实例,在页面下面就能看到。公有DNS是一个网址,解析记录会始终跟随实例的IP地址。Azure的这项服务叫做“DNS 名称标签”。点击实例,点击“公共 IP 地址”下面的IP地址,就会进入“配置”项。在“DNS 名称标签(可选)”这里就可以设置一个Azure官方的域名前缀,这个网址会解析到实例的IP地址,不过TTL为10分钟。可以手动通过命令ipconfig/flushdns来清除DNS缓存。

 
 

由于做业务需要大量的香港IP,一个个手动更换比较麻烦,所以我想到一种批量换IP并使用DDNS更新到域名的方案。

批量修改IP

创建虚拟机时,默认为动态IP,不要修改为静态IP。

Azure更换IP地址非常简单:

  1. 进入Azure门户-虚拟机
  2. 在虚拟机的主管理界面中批量停止虚拟机(不要点重启),不要勾选保留IP
  3. 等待虚拟机被停止后,重新启动虚拟机,这时会重新分配一个新的 IP 地址

虽然批量换IP很方便,但是需要手动把IP粘贴到代理软件上,不如注册一个域名,让它更换IP后自动更新域名解析记录,因此在代理软件上只需填写域名,IP变化后无需做任何修改。

 

部署DDNS

  1. 注册一个域名。

    域名我使用了NameCheap免费一年的.me域名。在域名管理界面,点击Advanced DNS,往下拉,找到DYNAMIC DNS

  2. image.png

    Dynamic DNS Password就是访问NameCheap域名解析API的密码,把它记录下来。

  3. 创建十台虚拟机,创建时命名为hk1-hk10,与你要设置的子域名名字相同

    image.png

  4. 在NameCheap创建A记录, Host为hk1-hk10,地址指向随意,TTL为1分钟

  5. image.png

  6. 将这一个脚本放到服务器

    # vi ddns.sh

    这是一个外国人写的脚本,我做了一些汉化修改

    #!/usr/bin/env bash
    
    ## Namecheap DDNS update client for CentOS 7
    ## Written by Ian Harrier
    ## Modified by shelike.me
    
    # FQDN处填写子域名,$(hostname)指的是主机名,把example.com改为你的网址
    # 比如你在Azure有一台名字为hk1的虚拟机,那么会将域名解析为hk1.example.com
    # 同时你需要在NameCheap添加该条目,解析A记录为任意IP
    # NAME_SERVER无需修改
    
    FQDN="$(hostname).example.com"
    PASSWORD='刚才你复制的 Dynamic DNS Password'
    NAME_SERVER='dns1.registrar-servers.com'
    
    echo -n "----- 程序开始运行 -----"
    
    IPv4_CURRENT=$(curl -s v4.ident.me)
    echo
    echo "当前的IP地址为: $IPv4_CURRENT"
    
    IPv4_DDNS=$(dig @$NAME_SERVER $FQDN A +short)
    echo "域名解析记录为: $IPv4_DDNS"
    
    if [[ "$IPv4_CURRENT" == "$IPv4_DDNS" ]]; then
    	echo -n "解析记录已为最新"
    	echo
    	echo -n "----- 程序结束 -----"
    	exit 0
    else
    	echo "IP地址不匹配,正在更新"
    fi
    
    # If $FQDN is in the format 'domain.tld' (i.e. one occurrence of '.')
    if [[ $(echo $FQDN | awk 'BEGIN{FS="."} {print NF?NF-1:0}') == 1 ]]; then
    	HOST='@'
    	DOMAIN=$FQDN
    fi
    
    # If $FQDN is in the format 'subdomain.domain.tld' (i.e. two occurrences of '.')
    if [[ $(echo $FQDN | awk 'BEGIN{FS="."} {print NF?NF-1:0}') == 2 ]]; then
    	HOST=$(echo $FQDN | awk -F "." '{print $1}')
    	DOMAIN=$(echo $FQDN | awk -F "." '{print $2 "." $3}')
    fi
    
    UPDATE_RESULT=$(curl -s "https://dynamicdns.park-your-domain.com/update?host=$HOST&domain=$DOMAIN&password=$PASSWORD&ip=$IPv4_CURRENT")
    
    UPDATE_ERRORS=$(xmllint --xpath "string(//ErrCount)" - <<<"$UPDATE_RESULT")
    if [[ $UPDATE_ERRORS -gt 0 ]]; then
    	echo "发生了 $UPDATE_ERRORS 个错误:"
    	for (( i = 1; i <= $UPDATE_ERRORS; i++ )); do
    		echo -n " $i. "
    		xmllint --xpath "string(//Err$i)" - <<<"$UPDATE_RESULT"
    	done
    	echo
    else
    echo "更新成功!"
    fi
    
    echo -n "----- 程序结束 -----"
    echo
    
    exit 0
    
  7. 最后,设置计划任务

  8. # crontab -e

    加入此条

    */1 * * * * root /root/ddns.sh >/dev/null 2>&1

 

批量部署

批量部署时,无需手动一个一个服务器添加计划任务,所有服务器直接运行一条命令即可。
把脚本放到一个文件中,将此条计划任务语句添加到脚本倒数第二行

echo "*/1 * * * * root /root/ddns.sh >/dev/null 2>&1" >> /etc/crontab

使用 Notepad++Vim 将脚本转换为unix格式,然后把脚本放到你的网站上(此处用example.com示例),批量部署时只需要一条命令:

# wget https://example.com/ddns.sh && chmod +x ddns.sh && sh ddns.sh

 
 
参考:https://blog.harrier.us/updating-namecheap-ddns-from-centos-7/


程序猿,攻城狮,给社会主义添 Bug