Welcome to Snooda's Blog
bind9发送notify通知slave dns主动更新
[| 2012/08/31 00:47]
台湾vps已经不靠谱了。于是开始迁移至香港,台湾vps决定放弃。这时遇到了问题,就是dns又变成了单点。
所幸服务商提供了slave dns功能,这个还是很少见的,不过这个功能对于我来说实在太有用了。
估计也是这个服务太过小众,服务商的功能也是bug多多,发了无数ticket才搞定。
首先是管理页面就有问题,添加slave dns记录后刷新页面,记录就消失了。也不生效。通知他们修正了下,搞定了。
然后发现添加记录倒是成功了,但没有slave dns来拉取记录。而这时我操作太激进,把ns记录都切换过来了,结果导致落到slave dns上的请求都返回空记录了,发现后急忙切换回来。发ticket通知他们,告诉我要在allow-transfer里把所有的服务器ip都加上,试了下,似乎nslookup - slave dns ip 使用指定dns后还能成功了。很高兴。
但过了一会发现请求还是落到了主dns上,并且有很大概率的失败,于是再次联系客服。客服说在添加slave dns记录时我的master dns ip没有记录上,重新添加不行,后来客服搞了一下,可能修复了bug,可以了。
然后发现slave似乎不支持notify请求,我用rndc reload更新记录时没有slave来请求。
先是添加also-notify,通知所有slave dns,因为默认是通知所有ns记录里的服务器,不过我并没有用到全部slave server,所以要手动添加其他服务器收到通知。
发现还是无效,猜测可能是出口ip不对,于是添加notify-source指定了notify时的来源ip。
重启bind9, 成功了。
所幸服务商提供了slave dns功能,这个还是很少见的,不过这个功能对于我来说实在太有用了。
估计也是这个服务太过小众,服务商的功能也是bug多多,发了无数ticket才搞定。
首先是管理页面就有问题,添加slave dns记录后刷新页面,记录就消失了。也不生效。通知他们修正了下,搞定了。
然后发现添加记录倒是成功了,但没有slave dns来拉取记录。而这时我操作太激进,把ns记录都切换过来了,结果导致落到slave dns上的请求都返回空记录了,发现后急忙切换回来。发ticket通知他们,告诉我要在allow-transfer里把所有的服务器ip都加上,试了下,似乎nslookup - slave dns ip 使用指定dns后还能成功了。很高兴。
但过了一会发现请求还是落到了主dns上,并且有很大概率的失败,于是再次联系客服。客服说在添加slave dns记录时我的master dns ip没有记录上,重新添加不行,后来客服搞了一下,可能修复了bug,可以了。
然后发现slave似乎不支持notify请求,我用rndc reload更新记录时没有slave来请求。
先是添加also-notify,通知所有slave dns,因为默认是通知所有ns记录里的服务器,不过我并没有用到全部slave server,所以要手动添加其他服务器收到通知。
发现还是无效,猜测可能是出口ip不对,于是添加notify-source指定了notify时的来源ip。
重启bind9, 成功了。
bind9不支持rrset-order的fixed模式
[| 2012/05/13 23:44]
本来想用自建dns,设置两条ns记录,其中速度较快的dns服务器排在前面作为主dns,比较慢的放在后面做备份。
结果发现实践中两条记录是随机顺序返回的,查了下需要rrset-order参数来指定方式,有如下三种:
fixed 以它们在域文件中的顺序排序
random 以随机顺序被返回
cyclic 以环顺序被返回
显然对于我的需求是使用fixed模式,结果启用了后提示我默认不开启此模式,查了下原来从bind9开始默认编译不启动这个选项了,除非编译的时候手动加参数打开,而我用apt安装的bind9,所以该选项未开放,即使我这里支持了,上级域的dns也不能设置这个选项,很可能是随机返回结果的,悲剧。看来之前的设想满足不了,dns也要木桶原理了。
结果发现实践中两条记录是随机顺序返回的,查了下需要rrset-order参数来指定方式,有如下三种:
fixed 以它们在域文件中的顺序排序
random 以随机顺序被返回
cyclic 以环顺序被返回
显然对于我的需求是使用fixed模式,结果启用了后提示我默认不开启此模式,查了下原来从bind9开始默认编译不启动这个选项了,除非编译的时候手动加参数打开,而我用apt安装的bind9,所以该选项未开放,即使我这里支持了,上级域的dns也不能设置这个选项,很可能是随机返回结果的,悲剧。看来之前的设想满足不了,dns也要木桶原理了。
将dns服务器bind9进行chroot以提高安全性
[| 2012/05/13 20:27]
今天开始搭dns服务器,主dns采用最快的台湾vps,辅dns暂时先使用老博客服务器。
为了服务器安全性,需要进行一下chroot,避免bind被攻破后整个服务器被黑。
centos自带了bind9的chroot软件包,可以自动将bind进行chroot启动,而debian就差了一点,需要手动搞,所幸debian自己带有官方chroot教程,所以照着做也并不难。
先修改/etc/default/bind9,改成:OPTIONS="-u bind -t /var/bind9/chroot"
然后建立各种chroot的目标目录:mkdir -p /var/bind9/chroot/{etc,dev,var/cache/bind,var/run/bind/run}
为bind9的chroot环境创建两个虚拟设备:空和随机数
mknod /var/bind9/chroot/dev/null c 1 3
mknod /var/bind9/chroot/dev/random c 1 8
chmod 660 /var/bind9/chroot/dev/{null,random}
将bind的默认配置文件移动到目标地址:mv /etc/bind /var/bind9/chroot/etc
为了保持兼容性,仍在原位置为其建立软链: ln -s /var/bind9/chroot/etc/bind /etc/bind
修改一下权限: chown -R bind:bind /etc/bind/*
然后修改一下启动脚本里面pid文件的位置: PIDFILE=/var/bind9/chroot/var/run/named/named.pid
注意,这里需要是在named目录下的named.pid文件,我之前把这个目录设置成bind了,结果发现放不进去,改成named才行,怀疑bind的代码里面写死了。
然后通知rsyslog添加一个监听句柄: echo "\$AddUnixListenSocket /var/bind9/chroot/dev/log" > /etc/rsyslog.d/bind-chroot.conf
debian默认只装了syslog,而不是增强版的rsyslog,需要安装一下。
然后运行: /etc/init.d/rsyslog restart; /etc/init.d/bind9 start
查看进程和pid文件均存在的话,表示chroot成功了
为了服务器安全性,需要进行一下chroot,避免bind被攻破后整个服务器被黑。
centos自带了bind9的chroot软件包,可以自动将bind进行chroot启动,而debian就差了一点,需要手动搞,所幸debian自己带有官方chroot教程,所以照着做也并不难。
先修改/etc/default/bind9,改成:OPTIONS="-u bind -t /var/bind9/chroot"
然后建立各种chroot的目标目录:mkdir -p /var/bind9/chroot/{etc,dev,var/cache/bind,var/run/bind/run}
为bind9的chroot环境创建两个虚拟设备:空和随机数
mknod /var/bind9/chroot/dev/null c 1 3
mknod /var/bind9/chroot/dev/random c 1 8
chmod 660 /var/bind9/chroot/dev/{null,random}
将bind的默认配置文件移动到目标地址:mv /etc/bind /var/bind9/chroot/etc
为了保持兼容性,仍在原位置为其建立软链: ln -s /var/bind9/chroot/etc/bind /etc/bind
修改一下权限: chown -R bind:bind /etc/bind/*
然后修改一下启动脚本里面pid文件的位置: PIDFILE=/var/bind9/chroot/var/run/named/named.pid
注意,这里需要是在named目录下的named.pid文件,我之前把这个目录设置成bind了,结果发现放不进去,改成named才行,怀疑bind的代码里面写死了。
然后通知rsyslog添加一个监听句柄: echo "\$AddUnixListenSocket /var/bind9/chroot/dev/log" > /etc/rsyslog.d/bind-chroot.conf
debian默认只装了syslog,而不是增强版的rsyslog,需要安装一下。
然后运行: /etc/init.d/rsyslog restart; /etc/init.d/bind9 start
查看进程和pid文件均存在的话,表示chroot成功了