1 介绍
本文档将介绍如何使用 failover 脚本更新 3CX 系统 Linux DNS server (bind9)的 A 记录,使得备用服务器激活变成主动服务器。
需要注意此脚本在 Debian 和 CentOS 的 bind9 经过测试,它应该也适用于其他 Linux 发行版的 bind9 服务。区域中的文件路径和服务名称需根据实际的 Linux 发行版进行更改(在 Debian 中 DNS 服务名称为 bind9,而 CentOS 中则是 named)。
具体网络拓扑如下图所示:
为了让脚本可以正常运行,我们需要做如下步骤(只在 3CX 上传脚本不能直接运行)。
2 准备工作
在执行下列步骤之前,我们需要先确认以下选项是否提前准备好:
-
两台 3CX 服务器
-
内部 FQDN
- 如果 3CX 在安装过程中选择了内部 FQDN,那么在话机注册的时候可以选择这个接口,如下图所示:
- 如果 3CX 在安装过程中选择了内部 FQDN,那么在话机注册的时候可以选择这个接口,如下图所示:
-
Slave 服务器还原了 Master 服务器的配置
- 正常情况下 Master 机还是需要做好备份计划,Slave 机做好还原计划。本次也是测试,所以只要 Slave 机还原了 Master 机的配置就可以了。
-
-
Linux DNS 服务器
- 先测试域名解析是否正确
- 再让话机使用内部 FQDN 注册,看是否成功。
-
DHCP 服务器
- 给话机,3CX 服务器,DNS 服务器分配 IP 地址和 DNS。
3 使用密钥对登陆 DNS 服务器
在整个 Failover 过程中,Slave 服务器需要修改 DNS 服务器中的 A 记录并重启 bind9 服务,所以需要让 Slave 不通过账号密码的方式以 root 的身份登陆到 DNS 服务器中。
3.1 解除 root 登陆限制
因为 Debian 是不允许直接用 root 身份登陆的,所以我们要先取消这个限制。以 root 身份登陆到 DNS 服务器上,编辑 /etc/ssh/sshd_config 文件。
# 把 PermitRootLogin without-password 改成 PermitRootLogin yes
# PermitRootLogin without-password
PermitRootLogin yes
修改完后保存,并重启 sshd 服务。
systemctl restart sshd
CentOS 不需要这一步
3.2 创建密钥对
以 root 身份登陆到 Slave 服务器。修改用户为 phonesystem。
su phonesystem
移动到该用户的 home 路径,并查看路径。路径应该为 /var/lib/3cxpbx 。
cd ~
pwd
创建密钥对:
ssh-keygen
不要输任何内容,直接回车跳过即可。接着会看到如下图的情形:
创建为密钥对后会在当前目录下生成 .ssh 文件夹,文件夹下有私钥和公钥。输入以下命令把公钥复制到 DNS 的服务器上。。
ssh-copy-id -i /var/lib/3cxpbx/.ssh/id_rsa.pub root@10.168.0.52
在过程中输入 yes 确认,并输入 DNS 服务器的 root 密码。
完成后,我们就可以用 ssh root@10.168.0.52 不输入密码登陆 DNS 服务器了。
测试成功后就可以进行下一步了。
4 配置脚本
具体的步骤可以参考 3CX 的向导:https://www.3cx.com/docs/failover/
我们把下列脚本保存为 updatedns.sh 文件:
#!/bin/bash
#echo “$(whoami)” > /tmp/logUpdate.txt
#echo “$(cd “$(dirname “$1″)” && pwd)/$(basename “$1″)” >> /tmp/logUpdate.txt
DNS_USER=”root”
DNS_IP=”10.168.0.52″
DNS_SSH_PORT=”22″
OLD_A_RECORD_IP=”10.168.0.53″
NEW_A_RECORD_IP=”10.168.0.54″
####
##When using centos /var/named ….
##When using debian /etc/bind ….
####
DNS_ZONE_FILE=”/var/lib/bind/named.58voip.3cx”
#DNS_ZONE_FILE=”/etc/bind/db.3cx.eu”
####
##When using debian replace for SERVICE=”bind9″
##When using centos replace for SERVICE=”http://linuxha.58voip.3cx:5000named”
####
SERVICE=”bind9″
PBX_DNS_NAME=”linuxha.58voip.3cx”
REPLACE_COMMAND=”sed -i ‘$ s/$OLD_A_RECORD_IP/$NEW_A_RECORD_IP/g'”
echo “THE DNS FOR THIS MACHINE IS:” > /tmp/updateDnsScript.log
cat /etc/resolv.conf >> /tmp/updateDnsScript.log
echo >> /tmp/updateDnsScript.log
echo “A SMALL PING BEFORE RUNNING THE SCRIPT (CHECK WHAT YOUR DNS CURRENTLY
RESOLVES FOR YOUR PBX $PBX_DNS_NAME):” >> /tmp/updateDnsScript.log
ping -c 1 $PBX_DNS_NAME >> /tmp/updateDnsScript.log
ssh -p $DNS_SSH_PORT $DNS_USER@$DNS_IP “echo YOUR DNS MACHINE IS:
;hostname;echo;echo YOUR DNS FILE BEFORE RUNNING THE SCRIPT: ;cat $DNS_ZONE_FILE;echo; $REPLACE_COMMAND $DNS_ZONE_FILE;echo YOUR DNS FILE AFTER RUNNING THE SCRIPT:\(CHECK THE LAST LINE IT SHOULD CHANGE TO THE NEW IP ADDRESS\)
;cat $DNS_ZONE_FILE; systemctl restart $SERVICE;echo; echo I JUST RESTARTED THE DNS
SERVICE PLEASE CHECK IN THE STATUS FOR THE active since \(IT SHOULD BE
MILLISECONDS\);systemctl status $SERVICE;echo;” >> /tmp/updateDnsScript.log
echo “A SMALL PING AFTER RUNNING THE SCRIPT (CHECK THAT YOUR PBX $PBX_DNS_NAME
RESOLVES TO THE NEW IP ADDRESS):” >> /tmp/updateDnsScript.log
sleep 1s
ping -c 1 $PBX_DNS_NAME >> /tmp/updateDnsScript.log
需要修改的参数有这么几项:
- DNS_USER:登陆的 DNS 服务器的用户名。
- DNS_IP:DNS 服务器的 IP 地址。
- DNSSSHPORT:SSH 端口。
- OLDARECORD_IP:Master 服务器的 IP 地址。
- NEWARECORD_IP:Slave 服务器的 IP 地址。
- DNSZONEFILE:DNS Zone 文件的路径。
- SERVICE:服务名。Debian 是 bind9,CentOS 是 named。
- PBXDNSNAME:内部的 FQDN。
备注:
在 DNS Zone 配置文件中,需要把修改的内部 FQDN 放在最后一条,脚本才能正常生效。
接着把这个脚本上传到 Slave 服务器上就可以了。
4.1 关于单独运行脚本和日志排查问题
- 脚本上传以后在这个路径:
- /var/lib/3cxpbx/Instance1/Scripts/updatedns.sh
- 所以,我们在正式测试之前单独运行一下脚本测试是否生效是个很好的办法。如果单独运行脚本没有问题,我们可以再到 3CX 上测试。
- 如果要运行脚本,可以以 phonesystem 身份直接运行脚本。也可以用 root 身份运行以下命令:
- runuser -l phonesystem -c “/var/lib/3cxpbx/Instance1/Scripts/updatedns.sh”
-
脚本运行以后会生成一个日志,你可以用它来检查运行是否正常。这个日志的路径是:/tmp/updateDnsScript.log 。日志可以查看以下信息:
- 查看 Slave 服务器的 DNS。这样你可以确认 Slave 使用的 DNS 是否正确。
- 在脚本执行前运行 Ping 。所以你也可以确定 DNS 指向的老 IP 地址是否正确。
- 在脚本执行前会显示 DNS zone 文件的内容。这样你可以看到 zone 文件是否正确。
- 脚本会显示 DNS 服务器的 DNS 服务状态。所以你也可以确认服务在脚本运行后是否重启。
- 在脚本执行后也会运行 Ping。你可以确认 DNS 是否正确的切换过来了。
下面放一段日志大概的样子,供大家参考:
THE DNS FOR THIS MACHINE IS:
search 3cx.us
nameserver 172.16.11.38
A SMALL PING BEFORE RUNNING THE SCRIPT (CHECK WHAT YOUR DNS CURRENTLY RESOLVES FOR
YOUR PBX yeisonfailover.3cx.eu):
PING yeisonfailover.3cx.eu (172.16.11.4) 56(84) bytes of data.
64 bytes from 172.16.11.4: icmp_seq=1 ttl=64
time=0.391 ms
— yeisonfailover.3cx.eu ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.391/0.391/0.391/0.000 ms
YOUR DNS MACHINE IS:
centosdns.3cx.eu
YOUR DNS FILE BEFORE RUNNING THE SCRIPT:
$TTL
604800
@ IN SOA localhost. centosdns.3cx.eu. (
2007122901 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS centosdns.3cx.eu.
@ IN MX 10 mail.3cx.eu.
centosdns IN A 172.16.11.38
mail IN A 172.16.11.38
firewall IN A 172.16.11.1
www IN CNAME firewall
yeisonfailover 1 IN A 172.16.11.4
YOUR DNS FILE AFTER RUNNING THE SCRIPT:(CHECK THE LAST LINE IT SHOULD CHANGE TO THE NEW
IP ADDRESS)
$TTL
604800
@ IN SOA localhost. centosdns.3cx.eu. (
2007122901 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS centosdns.3cx.eu.
@ IN MX 10 mail.3cx.eu.
centosdns IN A 172.16.11.38
mail IN A 172.16.11.38
firewall IN A 172.16.11.1
www IN CNAME firewall
yeisonfailover 1 IN A 172.16.11.5
I JUST RESTARTED THE DNS SERVICE PLEASE CHECK IN THE STATUS FOR THE active since (IT SHOULD
BE MILLISECONDS)
● named.service – Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2017-07-05
12:46:53 COT; 14ms ago
Process:
9073 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID (code=exited,
status=0/SUCCESS)
Process:
9084 ExecStart=/usr/sbin/named -u named $OPTIONS (code=exited, status=0/SUCCESS)
Process:
9081 ExecStartPre=/bin/bash -c if [ ! “$DISABLE_ZONE_CHECKING” == “yes” ]; then
/usr/sbin/named-checkconf -z /etc/named.conf; else echo “Checking of zone files is disabled”; fi (code=exited,
status=0/SUCCESS)
Main PID:
9086 (named)
CGroup: /system.slice/named.service
└─9086 /usr/sbin/named -u named
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: zone 0.in-addr.arpa/IN: loaded serial 0
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
Jul 05 12:46:53 centosdns.3cx.eu systemd[1]: Started Berkeley Internet Name Domain (DNS).
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: zone 3cx.eu/IN: loaded serial 2007122901
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: zone localhost.localdomain/IN: loaded serial 0
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: zone localhost/IN: loaded serial 0
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: zone
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: all zones loaded
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: running
Jul 05 12:46:53 centosdns.3cx.eu named[9086]: zone 3cx.eu/IN: sending notifies (serial 2007122901)
A SMALL PING AFTER RUNNING THE SCRIPT (CHECK THAT YOUR PBX yeisonfailover.3cx.eu RESOLVES TO
THE NEW IP ADDRESS):
PING yeisonfailover.3cx.eu (172.16.11.5) 56(84) bytes of data.
64 bytes from yeisonfailover2.3cx.us (172.16.11.5): icmp_seq=1 ttl=64
time=0.033 ms
— yeisonfailover.3cx.eu ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.033/0.033/0.033/0.000 ms
~