[喵咪开源软件推荐(5)]开源DNS服务-bind
哈喽大家好呀!~~ 今天又为大家带来了一个有趣的东西就是DNS服务器,稍微了解网络的童鞋都知道我们在使用域名访问一个网站的时候是通过公共DNS服务器解析到IP地址的,比如谷歌的8.8.8.8 比如 114.114.114.114 都是大家耳熟能详的DNS IP 地址, 那么我们在开发中DNS有什么用呢?怎么大家一个DNS服务呢?就是我们今天博文的主要内容了,话不多说让我们来对DNS一探究竟吧!
附上:
喵了个咪的博客:
1.DNS是什么
DNS协议运行在UDP协议之上,使用端口号53.有自己域名或使用过域名解析的童鞋应该常常接触到如下解析方式:
A记录:将域名指向一个IPv4地址(例如:10.10.10.10),需要增加A记录CNAME记录:如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录MX记录:建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录NS记录:域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录SRV记录:记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)
这种域名的解析方式就是对DNS进行的配置,所有的域名先回经过DNS服务器获取到这个域名需要做什么(比如指向到IP 192.168.0.1 我们称之为寻址) 或者是其他的寻址方式
一般DNS是在我们网络配置中可以配置一个主DNS一个备DNS,一般都有默认的DNS配置,我们也可以使用自己的DNS服务,拥有自己的DNS服务就相当于拥有了所有的域名你可以吧任何域名指导不同的地方,比如对baidu.com指向到你自己的服务器上面,访问baidu.com就是访问你自己的服务器(前提是必须要配置使用你的DNS服务才会有效)
2.DNS可以运用到那些场景?
2.1 环境迁移
为什么要写这篇文章主要也是在工作中有使用到自建DNS服务得到的启发向分享给大家,场景是这样的
运营服务器需要迁移,方案是先准备一个一比一的环境验证没问题了迁移数据改变域名指向,这里面就遇到一个问题了,服务器准备好了域名怎么配置呢?当然不能使用运营的域名第一版思路是在所有的域名前面加一级 RES.xxxx.com 这样,这样虽然能够解决问题但是会在面临两个问题,
- 如果使用RES域名那么在迁移的时候又要进行大量的配置文件修改 没法保证验证完成后迁移时最小改动
- 如果使用RES域名 那么端(APP端和WEB端) 都要改配置文件代码 —我们公司光APP就块10多个还要打包ROM
就上面这个问题看来成本很高,并且这个成本付出了价值之存在于对新的环境进行验证而已后续这些配置文件也好打包好的端也好都没有价值,并且还有重复的配置工作量
在这个前提上在想什么样子是最好的呢?首先端不用改,服务器的配置最好一步到位,但是我们又只有一套xxxx.com 域名,那么如果有两套不就好了吗? 如果正常使用是指向到运营的服务,但是在特定网络下比如一个WIFI下就可以指向到新的服务器那不就是两全其美了吗?
这个时候就需要自建DNS来对xxxx.com域名解析到新的服务器环境,然后让访问的时候DNS解析找自建的DNS解析就可以达到端不变还是请求xxxx.com服务器也不变还是监听xxxx.com,然后使用自建DNS解析的网络环境就可以访问到新的环境了
2.2 测试临时解析
很多时候域名都会被统一的管理起来,一般开发人员很难直接使用域名解析服务,一般是交给运维同事,这个时候就出现了一个问题,新的一个程序是新的域名需要做解析,给了运维一个解析的IP发现解析后用不了,然后来回调了很多次花了很多时间(正常的域名解析都要2-10分钟才能生效,频繁的解析可能会到2个小时),如果有自己的DNS就可以每个人都能去进行DNS解析又不影响到外面正在使用的客户,当解析完成后测试好了在交给运维同事会更好
2.3 批量hosts
有的时候我们需要更改一下本机的hosts来对一些域名更换指向,比如科学上谷歌等之类的,如果每个人都需要去搞hosts就太麻烦了,可以使用自建DNS服务来统一更改
3.使用bind搭建自己的DNS服务器
有了上面的结论笔者就开始找开源的DNS服务软件,最终是找到了bind这个相对比较简单的LIUNX DNS服务,我们来看看怎么使用这套服务
DNS服务器IP地址:192.168.1.20 服务器版本:centos6.8 64位
3.1 安装bind搭建解析
- 安装bind:
yum -y install bind*
- 修改配置文件
cp /etc/named.conf /etc/named.conf.bakvi /etc/named.conf
修改为如下:
options { listen-on port 53 { any; }; // 监听在主机的53端口上。any代表监听所有的主机 directory "/var/named"; // 如果此档案底下有规范到正反解的zone file 档名时,该档名预设应该放置在哪个目录底下 // 下面三项是服务的相关统计信息 dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; // 谁可以对我的DNS服务器提出查询请求。any代表任何人 recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; forwarders { // 指定上层DNS服务器 8.8.8.8; }; bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic";};logging { channel default_debug { file "data/named.run"; severity dynamic; };};zone "." IN { type hint; file "named.ca";};include "/etc/named.rfc1912.zones";include "/etc/named.root.key";
- 自定义域名解析
vi /etc/named.rfc1912.zoneszone "baidu.com" IN { // 定义要解析主域名 type master; file "baidu.com.zone"; // 具体相关解析的配置文件保存在 /var/named/baidu.com.zone 文件中};
- 自定义baidu.com.zone文件对百度进行解析
vi /var/named/baidu.com.zone# 内容如下$TTL 86400@ IN SOA ns.baidu.com. root ( 1 ; serial 1D ; refresh 1H ; retry 1W ; expire 0 ) ; minimum @ IN NS ns.baidu.com.ns IN A 192.168.1.20www IN A 192.168.1.20bbs IN A 192.168.1.20
其中 ns.baidu.com 代表当前dns服务器名称。所以 ns.baidu.com 一定要解析到自己本身
- 修改权限
chown root:named /var/named/baidu.com.zone
- 重启服务
service named restart
追加解析后注意也要重启服务,遇到如下异常执行命令yum install mysql安装mysql即可
Starting named: /usr/sbin/named-sdb: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
- 防火墙开发端口
vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT
修改DNS服务指向测试解析情况
当我们准备好服务之后,这个时候我们服务器还是在使用默认的DNS服务器进行解析这个时候我们需要配置有限使用本地的DNS解析服务来进行解析
# 注意:云主机需要注释掉**options timeout:1 attempts:1 rotate single-request-reopenvim /etc/resolv.confnameserver 192.168.1.20
然后使用ping baidu.com 就指向到了192.168.1.20了
[root@ ~]# ping www.baidu.comPING www.baidu.com (192.168.1.20) 56(84) bytes of data.64 bytes from (192.168.1.20): icmp_seq=1 ttl=64 time=0.017 ms64 bytes from (192.168.1.20): icmp_seq=2 ttl=64 time=0.034 ms64 bytes from (192.168.1.20): icmp_seq=3 ttl=64 time=0.033 ms
4 总结
使用自建DNS可以对任何的域名进行指向可以解决一些特定场景的特定问题,在这里分享给大家,如果大家喜欢可以继续关注喵咪的博客,后续会带来更多有趣的技术文章…
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!