一、简述DNS服务器原理,并搭建主-辅服务器。
域名系统:Domain Name System,互联网的一项服务,采用分布式集群工作方式。主要实现域名和IP地址的相互映射,使人更方面地访问互联网。使用TCP/UDP 53端口。
DNS常见资源记录类型:
- 主机记录(A记录):RFC 1035定义,A记录是用于名称解析的重要记录,它将特定的主机名映射到对应主机的IP地址上。
- 别名记录(CNAME记录): RFC 1035定义,CNAME记录用于将某个别名指向到某个A记录上,常应用于CDN。
- IPv6主机记录(AAAA记录): RFC 3596定义,与A记录对应,用于将特定的主机名映射到一个主机的IPv6地址。
- 域名服务器记录(NS记录) :用来指定该域名由哪个DNS服务器来进行解析。DNS服务器NS记录地址一般出现形式为:ns1.domain.com、ns2.domain.com等。 简要来讲,NS记录是指定由哪个DNS服务器解析域名。
- NAPTR记录:RFC 3403定义,它提供了正则表达式方式去映射一个域名。
DNS服务器工作原理:
DNS查询有两种方式:递归和迭代。
DNS客户端和设置使用的本地DNS服务器一般是递归查询模式,本地DNS服务器负责全权处理客户端的DNS查询请求,直到返回最终结果。DNS服务器之间一般采用迭代查询模式。
以查询 www.xxx.org 为例:
1. 客户端发送查询报文"www.xxx.org"至DNS服务器,DNS服务器首先检查自身缓存,如果存在记录则直接返回结果。
2. 如果记录老化或不存在,则:
2.1 DNS服务器向根域名服务器发送查询报文"www.xxx.org",根域名服务器返回顶级域 .org 的域名服务器地址。
2.2 DNS服务器向 .org 域的顶级域名服务器发送查询报文"www.xxx.org",得到二级域 .xxx.org 的权威域名服务器地址。
2.3 DNS服务器向 .xxx.org 域的权威域名服务器发送查询报文"query www.xxx.org",得到主机 www 的A记录,存入自身缓存并返回给客户端。
搭建主-辅服务器 -- 基于VMware centos7环境
- 安装DNS软件
bind:服务器(必选)
bind-libs:相关库(依赖,yum安装bind会自动带上)
bind-utils: 客户端(建议安装)
bind-chroot: 安全包,将dns相关文件放至 /var/named/chroot/(按需,常规不安装)
[root@centos2 ~]# yum install -y bind bind-utils
- DNS服务器配置
2.1 修改 /etc/named.conf -- 只列出关注修改内容
主
options {
//listen-on port 53 { 127.0.0.1; }; --修改监听端口为localhost 或者直接注释掉
listen-on port 53 { localhost; };
//allow-query { localhost; }; -- 修改为any允许任何主机使用DNS或者直接注释掉
allow-query { any; };
allow-transfer { 10.0.0.222; };
//allow-transfer 指定允许的辅DNS抓取从同步DNS配置信息
};
//配置文件包含了 /etc/named.rfc1912.zones 使用该文件来配置DNS zone信息
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
辅
options {
//listen-on port 53 { 127.0.0.1; }; --修改监听端口为localhost 或者直接注释掉
listen-on port 53 { localhost; };
//allow-query { localhost; }; -- 修改为any允许任何主机使用DNS或者直接注释掉
allow-query { any; };
allow-transfer { none; };
//allow-transfer none拒绝其他主机同步DNS配置信息
};
//配置文件包含了 /etc/named.rfc1912.zones 使用该文件来配置DNS zone信息
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
2.2 修改 /etc/named.rfc1912.zones 文件
主
//正向解析zone
zone "test.org" IN {
type master;
file "named.test.org.zone";
};
//逆向解析zone
zone "0.0.10.in-addr.arpa" IN {
type master;
file "0.0.10.in-addr.arpa.zone";
};
辅
zone "test.org" IN {
type slave;
masters { 10.0.0.221; };
file "slaves/test.org.slave.zone";
};
2.3 编辑zone指定文件
named.test.org.zone(主正文件)
配置好zone文件权限和属主(tips:复制模板,如下)
[root@centos1 named]# cp -a named.localhost named.test.org.zone
[root@centos1 named]# ll named.test.org.zone
-rw-r----- 1 root named 152 Jun 21 2007 named.test.org.zone
[root@centos1 named]#
正向解析文件 named.test.org.zone 内容
[root@centos1 named]# vim named.test.org.zone
$TTL 1D
@ IN SOA master admin.test.org. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS master
master IN A 10.0.0.221
www IN A 10.0.0.223
@ IN MX 10 mail1
mail1 IN A 10.0.0.221
* IN A 10.0.0.223
@ IN A 10.0.0.223
[root@centos1 named]#
正向解析验证
[root@centos6 ~]# curl test.org
www.test.org
[root@centos6 ~]# dig www.test.org
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> www.test.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22331
...略
逆向解析文件 0.0.10.in-addr.arpa.zone 内容
[root@centos1 named]# cat 0.0.10.in-addr.arpa.zone
$TTL 1D
@ IN SOA ns1 admin.test.org. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1
ns1 A 10.0.0.221
223 PTR www.test.org.
221 PTR mail.test.org.
[root@centos1 named]#
逆向解析验证
[root@centos6 ~]# dig -x 10.0.0.223
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -x 10.0.0.223
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37878
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
...略
slaves/test.org.slave.zone(辅)
Note:辅DNS服务器该文件不用创建,在上一步配置完毕rndc reload重新加载配置后会自动生成。
辅助DNS服务器验证:
[root@centos6 ~]# dig www.test.org @10.0.0.222
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> www.test.org @10.0.0.222
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41136
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
2.4 补充配置文件 allow-transfer 参数作用效果
未应用前
[root@centos4 ~]# dig -t axfr test.org @10.0.0.221
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t axfr test.org @10.0.0.221
;; global options: +cmd
test.org. 86400 IN SOA master.test.org. admin.test.org. 0 86400 3600 604800 10800
test.org. 86400 IN A 10.0.0.223
test.org. 86400 IN MX 10 mail1.test.org.
test.org. 86400 IN NS master.test.org.
*.test.org. 86400 IN A 10.0.0.223
mail1.test.org. 86400 IN A 10.0.0.221
master.test.org. 86400 IN A 10.0.0.221
www.test.org. 86400 IN A 10.0.0.223
test.org. 86400 IN SOA master.test.org. admin.test.org. 0 86400 3600 604800 10800
;; Query time: 0 msec
;; SERVER: 10.0.0.221#53(10.0.0.221)
;; WHEN: Wed Feb 02 10:11:51 CST 2022
;; XFR size: 9 records (messages 1, bytes 244)
应用后
[root@centos4 ~]# dig -t axfr test.org @10.0.0.221
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t axfr test.org @10.0.0.221
;; global options: +cmd
; Transfer failed.
[root@centos4 ~]#
二、搭建并实现智能DNS。
备注:为避免其他因素影响,配置前先关闭防火墙,selinux。建议配置好时间同步。
1、通过添加网卡或临时命令来模拟第二个网络段
例如原IP:10.0.0.226
临时添加:ip a a 192.0.0.226/24 dev eth0
2、DNS服务器安装bind bind-utils软件(yum 安装,具体参考之前主从DNS搭建过程,此处不再描述)
3、在 /etc/named.conf 配置文件添加自定义的ACL(注意:先定义后使用,acl项一般在option前面定义)
acl bjnet {
10.0.0.0/24;
};
//模拟地区bj网络段
acl sznet {
192.0.0.0/24;
};
//模拟地区sz网络段
4、view视图定义(作用:将自定义ACL和ZONE数据库实现对应关系,从而实现智能DNS)
Note1:一个bind服务器可以定义多个view,每个view中可定义一个或多个zone
Note2:多个view可能需要对同一zone区域进行解析,但是需使用不同的zone解析文件,且所有zone只能定义在view里面
- 在 /etc/named.conf 定义view视图,并去掉根域的zone定义,将其挪到view定义的zone文件里面
view bjnetview {
match-clients { bjnet; };
include "/etc/named.bjnet.zones";
};
view sznetview {
match-clients { sznet; };
include "/etc/named.sznet.zones";
};
/*
zone "." IN {
type hint;
file "named.ca";
};
*/
5、zone文件配置内容(注意文件权限)
- 文件 /etc/named.bjnet.zones
复制模板过来修改,添加如下内容:
zone "." IN {
type hint;
file "named.ca";
};
zone "test.org" IN {
type master;
file "named.test.org.bjnet";
};
zone "0.0.10.in-addr.arpa" IN {
type master;
file "0.0.10.in-addr.arpa.bjnet";
};
- 文件 /etc/named.sznet.zones
复制模板过来修改,添加如下内容:
zone "." IN {
type hint;
file "named.ca";
};
zone "test.org" IN {
type master;
file "named.test.org.sznet";
};
zone "0.0.192.in-addr.arpa" IN {
type master;
file "0.0.192.in-addr.arpa.sznet";
};
6、创建zone文件里面定义的数据库解析文件
- 文件 /var/named/named.test.org.bjnet bj区域正向解析文件
$TTL 1D
@ IN SOA master admin.test.org. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS master
master IN A 10.0.0.221
www CNAME websrv
websrv IN A 10.0.0.223
@ IN MX 10 mail1
mail1 IN A 10.0.0.221
* IN A 10.0.0.223
@ IN A 10.0.0.223
- 文件 /var/named/0.0.10.in-addr.arpa.bjnet bj区域逆向解析文件
$TTL 1D
@ IN SOA ns1 admin.test.org. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1
ns1 A 10.0.0.221
223 PTR www.test.org.
221 PTR mail.test.org.
- 文件 /var/named/named.test.org.sznet sz区域正向解析文件
$TTL 1D
@ IN SOA master admin.test.org. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS master
master IN A 192.0.0.221
www CNAME websrv
websev IN A 192.0.0.223
@ IN MX 10 mail1
mail1 IN A 192.0.0.221
* IN A 192.0.0.223
@ IN A 192.0.0.223
- 文件 /var/named/0.0.192.in-addr.arpa.sznet sz区域逆向解析文件
$TTL 1D
@ IN SOA ns1 admin.test.org. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1
ns1 A 192.0.0.221
223 PTR www.test.org.
221 PTR mail.test.org.
7、客户端验证:
bj区域模拟
[root@centos6 ~]# dig www.test.org @10.0.0.221
或者修改DNS只保留10.0.0.221后ping域名
PING websrv.test.org (10.0.0.223) 56(84) bytes of data.
64 bytes from www.test.org (10.0.0.223): icmp_seq=1 ttl=64 time=0.215 ms
64 bytes from www.test.org (10.0.0.223): icmp_seq=2 ttl=64 time=1.48 ms
64 bytes from www.test.org (10.0.0.223): icmp_seq=3 ttl=64 time=1.98 ms
64 bytes from www.test.org (10.0.0.223): icmp_seq=4 ttl=64 time=3.93 ms
--- websrv.test.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3010ms
rtt min/avg/max/mdev = 0.215/1.903/3.931/1.336 ms
[root@centos6 ~]#
sz区域模拟
[root@centos6 ~]# dig www.test.org @192.0.0.221
或者修改DNS只保留192.0.0.221后ping域名
[root@centos6 ~]# ping www.test.org -c4
PING websrv.test.org (192.0.0.223) 56(84) bytes of data.
64 bytes from www.test.org (192.0.0.223): icmp_seq=1 ttl=64 time=0.667 ms
64 bytes from www.test.org (192.0.0.223): icmp_seq=2 ttl=64 time=1.50 ms
64 bytes from www.test.org (192.0.0.223): icmp_seq=3 ttl=64 time=1.63 ms
64 bytes from www.test.org (192.0.0.223): icmp_seq=4 ttl=64 time=1.65 ms
--- websrv.test.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3023ms
rtt min/avg/max/mdev = 0.667/1.365/1.655/0.408 ms
[root@centos6 ~]#
三、使用iptable实现: 放行ssh,telnet, ftp, web服务80端口,其他端口服务全部拒绝
添加iptables配置:
[root@cent70 ~]# iptables -R INPUT 1 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT
[root@cent70 ~]# iptables -A INPUT -j REJECT
验证:
[root@cent71 ~]# nc -zvn 10.0.0.160 22
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.160:22.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@cent71 ~]# nc -zvn 10.0.0.160 21
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.160:21.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@cent71 ~]# nc -zvn 10.0.0.160 23
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.160:23.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@cent71 ~]# nc -zvn 10.0.0.160 53
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection refused.
[root@cent71 ~]# nc -zvn 10.0.0.160 80
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.160:80.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@bupt71 ~]#
四、NAT原理总结
NAT:网络地址转换,通过结合PAT来实现内网跟外网的访问。主要分为SNAT和DNAT。
SNAT:源NAT,通常指由内网发起的网络访问请求,在访问外部网络时需要将内网的私网地址转换为公网地址的过程。
DNAT:目NAT,通常指外网发起的访问请求或者资源请求回应,数据在通过防火墙访问内网时,需要将数据包里面的目标地址由公网地址转换为私网地址的过程。
五、iptables实现SNAT和DNAT,并对规则持久保存
SNAT
基本格式:
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
范例:
1、将内网172.16.0.0 SNAT 为 10.0.0.18地址
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -j SNAT --to-source 10.0.0.18
2、将内网172.16.0.0 SNAT 为 10.0.0.18-20地址范围
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -j SNAT --to-source 10.0.0.18-c10.0.0.20
3、MASQUERADE :基于nat表的target,适用于动态的公网IP,如:拨号网络
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -j MASQUERADE
DNAT
基本格式:
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT -- to-destination InterSeverIP[:PORT]
范例:
1、将访问10.0.0.18 80端口服务转到 1721.6.0.7 80端口
iptables -t nat -A PREROUTING -d 10.0.0.18 ! -s 172.16.0.0/24 -p tcp --dport 80 -j DNAT --to-destination 172.16.0.7:80
2、REDIRECT本地转发,将访问172.16.0.7本地的8080端口转为 80端口
iptables -t nat -A PREROUTING -d 172.16.0.7 -p tcp --dport 8080 -j REDIRECT --
to-ports 80
保存iptables策略
方法1:centos7,8 上可通过yum安装 iptables-service,安装后如下保存和服务启动命令即可:
iptables-save > /etc/sysconfig/iptables
systemctl enable --now iptables.service
方法2:/etc/rc.d/rc.local文件中添加脚本路径
1、通过iptables-save > /path/filename 保存iptables策略
2、在/etc/rc.d/rc.local文件中添加 iptables-restore < /path/filename
通过以上配置即可实现开机自动加载iptables的规则
注意:rc.local 文件要具备 +x 权限