一、简述DNS服务器原理,并搭建主-辅服务器
1、DNS服务器原理
第一步:客户机提出域名解析请求,并将该请求发送给本地的域名服务器;
第二步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回;
第三步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域) 的主域名服务器的地址;
第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址;
第五步:重复第四步,直到找到正确的纪录;
第六步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户 。
2、DNS服务器的主从搭建
二台主机,一台当主服务器(192.168.27.7/24),一台当从服务器(192.168.27.17/24),配置 abc.com 域的主从架构
(1) 在两台主机上分别安装BIND服务
[root@master ~]#yuminstall-y bind #主服务器
[root@slave ~]#yuminstall-y bind #从服务器
(2) 修改主服务配置文件 /etc/named.conf
options {// listen-on port 53 { 127.0.0.1; }; #注释此项listen-on-v6 port53{ ::1; };
directory "/var/named";
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";
recursing-file"/var/named/data/named.recursing";
secroots-file"/var/named/data/named.secroots";// allow-query { localhost; }; #注释此项allow-transfer {192.168.214.17;}; #添加此项
...以下省略
(3) 新建域解析文件 /var/named/abc.com
[root@master ~]# cd /var/named/[root@master named]# vim abc.com
$TTL 1D
@ IN SOA NS1 admin (1 1D 10M 1W 1D)
NS NS1
NS1 A 192.168.27.7www A 192.168.27.7[root@master named]# chown root:named abc.com
[root@master named]# chmod640abc.com
(4) 在主服务器上域文件 /etc/named.rfc1912.zones 中添加"abc.com"域
[root@master named]# vim /etc/named.rfc1912.zones
#添加以下内容
zone "abc.com" IN {
type master;
file"abc.com";};
(5) 配置从服务器主配置文件 /etc/named.conf,并在从服务器的域文件 /etc/named.rfc1912.zones 中添加域信息
[root@slave ~]# vim /etc/named.conf
options {// listen-on port 53 { 127.0.0.1; }; #注释此项listen-on-v6 port53{ ::1; };
directory "/var/named";
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";
recursing-file"/var/named/data/named.recursing";
secroots-file"/var/named/data/named.secroots";// allow-query { localhost; }; #注释此项allow-transfer {none;}; #添加此项
...省略以下
#添加域信息如下
[root@slave ~]# vim /etc/named.rfc1912.zones
zone "abc.com" IN {
type slave;
masters {192.168.27.7;};
file"slaves/abc.com.slave";
};
(6) 启动主从服务器的DNS服务,并测试
[root@master ~]# systemctl start named
[root@slave ~]# systemctl start named
[root@master ~]# dig www.abc.com @192.168.27.7#主服务器可以解析
; <<>> DiG9.9.4-RedHat-9.9.4-72.el7 <<>> www.abc.com @192.168.27.7;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,id:18897;; flags: qr aa rd ra; QUERY: 1, ANSWER:1, AUTHORITY:1, ADDITIONAL:2;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp:4096;; QUESTION SECTION:
;www.abc.com. IN A
;; ANSWER SECTION:
www.abc.com. 86400IN A192.168.27.7;; AUTHORITY SECTION:
abc.com. 86400 IN NS NS1.abc.com.
;; ADDITIONAL SECTION:
NS1.abc.com. 86400IN A192.168.27.7;; Query time:2 msec
;; SERVER: 192.168.27.7#53(192.168.27.7)
;; WHEN: Tue Feb 0407:04:59CST2020;; MSG SIZE rcvd: 90[root@master named]# dig www.abc.com @192.168.27.17#从服务器也可以解析
; <<>> DiG9.9.4-RedHat-9.9.4-72.el7 <<>> www.abc.com @192.168.27.17;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,id:55308;; flags: qr aa rd ra; QUERY: 1, ANSWER:1, AUTHORITY:1, ADDITIONAL:2;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp:4096;; QUESTION SECTION:
;www.abc.com. IN A
;; ANSWER SECTION:
www.abc.com. 86400IN A192.168.27.7;; AUTHORITY SECTION:
abc.com. 86400 IN NS NS1.abc.com.
;; ADDITIONAL SECTION:
NS1.abc.com. 86400IN A192.168.27.7;; Query time:2 msec
;; SERVER: 192.168.27.17#53(192.168.27.17)
;; WHEN: Tue Feb 0407:05:23CST2020;; MSG SIZE rcvd: 90[root@slave ~]# ll /var/named/slaves/ #从服务器也自动生成了域解析文件
total 4-rw-r--r--1named named225Feb407:03abc.com.slave
二、搭建并实现智能DNS
二台主机,一台作为智能DNS服务器,有两个网段,NAT(192.168.27.7/24),桥接(192.168.0.104/24),一台客户端,NAT(192.168.27.17/24),桥接(192.168.0.105/24),域为 def.com ,假设通过192.168.27.0/24网段访问DNS服务器,则智能解析到 1.1.1.1,通过192.168.0.0/24网段访问DNS服务器,则智能解析到 2.2.2.2,其它网段的解析到 3.3.3.3
(1)在作为DNS服务器上安装BIND服务
[root@centos7 ~]#yuminstall-y bind
(2)在DNS服务器上主配置文件/etc/named.conf中配置 acl 和 view
[root@centos7 ~]# vim /etc/named.conf
acl net27 {
192.168.27.0/24;
};
acl net0 {
192.168.0.0/24;
};
acl othernet {
any;
};
options {// listen-on port 53 { 127.0.0.1; }; #注释此项listen-on-v6 port53{ ::1; };
directory "/var/named";
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";
recursing-file"/var/named/data/named.recursing";
secroots-file"/var/named/data/named.secroots";// allow-query { localhost; }; #注释此项...中间省略
logging {
channel default_debug {
file"data/named.run";
severity dynamic;
};
};
#此处添加view,并将 zone "."IN 这段移入/etc/named.rfc1912.zones 文件中
view view_net27{
match-clients { net27;};
include "/etc/named.rfc1912.zones.net27";
};
view view_net0{
match-clients { net0;};
include "/etc/named.rfc1912.zones.net0";
};
view view_other{
match-clients { othernet;};
include "/etc/named.rfc1912.zones";
};
include "/etc/named.root.key";
(3) 创建以上view中的include的配置域文件
[root@centos7 ~]# vim /etc/named.rfc1912.zones.net27
zone "def.com" IN {
type master;
file"def.com.zone.net27";
};
[root@centos7 ~]# vim /etc/named.rfc1912.zones.net0
zone "def.com" IN {
type master;
file"def.com.zone.net0";
};
[root@centos7 ~]# vim /etc/named.rfc1912.zones
zone "def.com" IN {
type master;
file"def.com.zone.othernet";
};
#以下为/etc/named.conf 移入的段
zone "." IN {
type hint;
file"named.ca";
};
...以下省略
(4) 创建上一步中的解析文件
[root@centos7 ~]# vim /var/named/def.com.zone.net27
$TTL 1D
@ IN SOA ns1 admin (1 1H 1H 1D 3H)
NS ns1
ns1 A 192.168.27.7www A 1.1.1.1[root@centos7 ~]# vim /var/named/def.com.zone.net0
$TTL 1D
@ IN SOA ns1 admin (1 1H 1H 3D 3H)
NS ns1
ns1 A 192.168.27.7www A 2.2.2.2[root@centos7 ~]# vim /var/named/def.com.zone.othernet
$TTL 1D
@ IN SOA ns1 admin (1 1H 1H 1D 3H)
NS ns1
ns1 A 192.168.27.7www A 3.3.3.3
(5) 配置解析文件的相关权限,并启动DNS服务
[root@centos7 ~]# cd /var/named/[root@centos7 named]# chown:named def.com.zone.*[root@centos7 named]# chmod640def.com.zone.*[root@centos7 named]# ll def.com.zone.*-rw-r-----1root named84Feb418:07 def.com.zone.net0-rw-r-----1root named84Feb418:06 def.com.zone.net27-rw-r-----1root named84Feb418:09 def.com.zone.othernet
[root@centos7 named]# systemctl start named
(6) 在客户端上测试
[root@centos7-17~]# dig www.def.com @192.168.27.7#测试通过192.168.27.0/24网段访问,可以看到解析到1.1.1.1了;<<>> DiG9.9.4-RedHat-9.9.4-72.el7 <<>> www.def.com @192.168.27.7;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,id:40379;; flags: qr aa rd ra; QUERY: 1, ANSWER:1, AUTHORITY:1, ADDITIONAL:2;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp:4096;; QUESTION SECTION:
;www.def.com. IN A
;; ANSWER SECTION:
www.def.com. 86400IN A1.1.1.1;; AUTHORITY SECTION:
def.com. 86400 IN NS ns1.def.com.
;; ADDITIONAL SECTION:
ns1.def.com. 86400IN A192.168.27.7;; Query time:2 msec
;; SERVER: 192.168.27.7#53(192.168.27.7)
;; WHEN: Tue Feb 0418:15:32CST2020;; MSG SIZE rcvd: 90[root@centos7-17~]# dig www.def.com @192.168.0.104#测试通过192.168.0.0/24访问,解析到2.2.2.2了;<<>> DiG9.9.4-RedHat-9.9.4-72.el7 <<>> www.def.com @192.168.0.104;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,id:1252;; flags: qr aa rd ra; QUERY: 1, ANSWER:1, AUTHORITY:1, ADDITIONAL:2;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp:4096;; QUESTION SECTION:
;www.def.com. IN A
;; ANSWER SECTION:
www.def.com. 86400IN A2.2.2.2;; AUTHORITY SECTION:
def.com. 86400 IN NS ns1.def.com.
;; ADDITIONAL SECTION:
ns1.def.com. 86400IN A192.168.27.7;; Query time:1 msec
;; SERVER: 192.168.0.104#53(192.168.0.104)
;; WHEN: Tue Feb 0418:16:04CST2020;; MSG SIZE rcvd: 90[root@centos7 named]# dig www.def.com @127.0.0.1#在DNS服务器上测试不通以下两个网段访问,解析到了3.3.3.3; <<>> DiG9.9.4-RedHat-9.9.4-72.el7 <<>> www.def.com @127.0.0.1;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR,id:1314;; flags: qr aa rd ra; QUERY: 1, ANSWER:1, AUTHORITY:1, ADDITIONAL:2;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp:4096;; QUESTION SECTION:
;www.def.com. IN A
;; ANSWER SECTION:
www.def.com. 86400IN A3.3.3.3;; AUTHORITY SECTION:
def.com. 86400 IN NS ns1.def.com.
;; ADDITIONAL SECTION:
ns1.def.com. 86400IN A192.168.27.7;; Query time:1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Feb 0418:17:28CST2020;; MSG SIZE rcvd: 90
三、使用iptable实现: 放行ssh,telnet, ftp, web服务80端口,其他端口服务全部拒绝
iptables -A INPUT -p tcp -s 0/0 --dport 23 -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -s 0/0 --dport 23 -j ACCEPT
iptables -A OUTPUT -p tcp -s 0/0 --dport 20 -j ACCEPT
iptables -A OUTPUT -p tcp -s 0/0 --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp -s 0/0 --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -s 0/0 --dport 443 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
service iptables save
service iptables restart
iptables多端口允许
iptables -I INPUT -s 10.10.10.1/32 -p tcp -m tcp -m multiport --dports 20,21,2000:2500 -j ACCEPT
四、NAT原理总结
4.1 NAT的产生
由于网络的飞速发展和网络应用的极速增多,致使IPv4可用地址空间逐渐枯竭。尽管IPv6可以在根本上解决地址枯竭问题,但IPv4发展到IPv6还需要一个过渡,而这便产生了NAT。
4.2 NAT的作用
IP地址分为公网IP与私网IP。一般情况下,在互联网中,公网IP可直接访问,私网IP无法直接访问。而NAT则是将私网IP地址转换为公网IP地址(将IP报文头部的私网IP地址改为可以提供访问的公网IP地址),从而实现用户上网功能或服务器在互联网上提供服务。NAT还可以使得一个公网IP代表多个不同的内网IP,这样便节省了IP地址资源。
4.3 NAT的类型与分类
NAT分为静态转换、动态转换、端口转换
静态转换:私有地址与公有地址进行一对一的映射。这种一对一映射无法缓解可用公有地址短缺的问题。
动态转换:私有地址与公有地址进行一对多的映射。首先建立公有地址地址池,私有地址向外通信时,会从公有地址地址池中选择非在用的公有地址进行映射,当通信结束时,释放映射关系,公有地址重新恢复到地址池中待用。弊端:若私有地址向外通信,而公有地址地址池中无可用公有地址时,会等待公有地址释放后在进行通信。
端口转换:在大多数网络中,一般都使用的是IP上的某个端口(如80、443、3389等),所以不需要进行全地址映射,只需要私有地址端口映射到公有地址端口上,直接访问公有地址加端口号的形式便可以。这样可以使得一个公有地址可以对应多个私有地址,从而大大缓解了公有地址紧缺的问题。
Easy IP:为小型网络,一般为家庭、小型网吧、办公室等内部主机不多的地方。通过拨号方式获取一个临时公网IP地址进行外网的访问。
4.4 扩展:SNAT与DNAT区别
SNAT是私网访问外网时,报文中源IP地址(私网IP地址)转换为公网IP地址过程。此转换可以使用静态、动态等转换方式,且内部的多台主机共用同一公网IP地址进行外网访问。
DNAT是外网访问私网时,报文中目的IP地址(公网IP地址)转换为私网IP地址过程。此转换过程可以使用静态、动态、端口等转换方式。
4.5 实例
公司(有固定公网IP地址)上网访问某网站简易过程
PC访问www.xxxxxxx.com,由于存在域名会通过DNS服务器解析域名从而获得公网IP地址。
PC收到此网站的公网IP地址后,封装数据。源IP为PC的IP地址;目的地址为解析获得的公网IP地址;目的端口号为80。并且将此报文发送给网关设备, 网关设备收到数据报文后通过路由关系发送到出口设备。
出口设备配置有NAT转换关系,将报文中的源IP地址转换为公网IP地址。重新封装数据报文后发出。(这一步为SNAT)
数据报文到达公有网络上,由于目的IP地址为公网IP地址,通过公网路由关系转发到网站端(服务端)。
服务端收到报文后,检查到目的地址为公网IP地址。通过本端配置的NAT映射关系,与公网IP地址相匹配的映射关系中寻找私网IP地址。找到映射关系后,将目的地址转换为私网IP地址(这一步为DNAT)。在通过内部网络路由关系将数据报文转发至相应的服务器。
服务器将收到的报文通过相关计算,重新封装报文,发送给用户PC。原理不变,经过多次数据交互。最后用户PC接收到数据报文,网站就被打开了。
五、iptables实现SNAT和DNAT,并对规则持久保存
实现SNAT和DNAT都需要开启内核数据转发功能
[root@localhost ~]# vim /etc/sysctl.conf# 把下列选项改正1net.ipv4.ip_forward=0...net.ipv4.ip_forward=1
5.1 SNAT
基于nat表的target,适用于固定的公网IP
SNAT选项:
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
语法:
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
范例:
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.122.103
5.2 DNAT
nat表的target,适用于端口映射,即可重定向到本机,也可以支持重定向至不同主机的不同端口,但不支持多目标,即不支持负载均衡功能
DNAT选项:
--to-destination [ipaddr[-ipaddr]][:port[-port]]
DNAT语法:
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --todestination InterSeverIP[:PORT]
范例:
[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.122.103 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.6:80
5.3 iptables规则持久保存:
CentOS 7、8
iptables-save>/PATH/TO/SOME_RULES_FILE
CentOS 6
# 将规则覆盖保存至/etc/sysconfig/iptables文件中service iptables save
5.4 加载规则
5.4.1 CentOS 7、8 重新载入预存规则文件中规则:
iptables-restore</PATH/FROM/SOME_RULES_FILE
iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
5.4.2 CentOS 6:
service iptables restart #会自动从/etc/sysconfig/iptables 重新载入规则
5.5 开机自动重载规则
5.5.1 用脚本保存各iptables命令;让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径 /PATH/TO/SOME_SCRIPT_FILE
用规则文件保存各规则,开机时自动载入此规则文件中的规则
在/etc/rc.d/rc.local文件添加
iptables-restore</PATH/FROM/IPTABLES_RULES_FILE
5.5.2 定义Unit File, CentOS 7,8 可以安装 iptables-services 实现iptables.service
范例: CentOS 7,8 使用 iptables-services
[root@centos8 ~]# yum -y install iptables-services
[root@centos8 ~]# cp /etc/sysconfig/iptables{,.bak}
#保存现在的规则到文件中方法1
[root@centos8 ~]# /usr/libexec/iptables/iptables.init save
#保存现在的规则到文件中方法2
iptables-save > /etc/sysconfig/iptables
#开机启动
[root@centos8 ~]# systemctl enable iptables.service