1、简述DNS服务器原理,并搭建主-辅服务器。
一、DNS是什么
DNS(Domain Name Service的缩写)的作用就是根据域名查出IP地址。IP地址是由32位二进制数字组成,人们很难记住这些IP,相反,大家愿意使用比较容易记忆的主机名字。而电脑在处理IP数据报文时,是使用IP地址的,因为它是固定长度。
DNS查询的类型对于客户端来说是递归查询,对于DNS服务器来说,绝大多数是迭代查询的。DNS名称解析中,从名称到IP的查询叫做正向解析,而从IP到名称的查询叫做反向解析。如果DNS服务器至少解析了一个或一个以上的域叫做DNS主服务器或者DNS辅助服务器,如果不负责任何解析叫做DNS缓存服务器。
现在互联网规模很大,DNS被设计成一个分布式的数据库系统,他分布的功能就是把一个大的数据库切割成很多小的数据库,来分别提供一部分数据的处理。全球一共分布了13台DNS根服务器,名字为A至M。
二、DNS的域名解析过程
用户使用浏览器输入网址时域名解析过程:
客户访问时,先查自己的hosts文件,有则返回
客户hosts中没有就去查自己的缓存,有则返回
客户缓存没有就去找dns服务器
dns服务器先找根服务器获得顶级域服务器地址
dns服务器在找顶级域服务器去获得二级域服务器地址
dns服务器从二级域服务器获得最终的IP地址
客户端从dns服务器中得到IP地址
DNS区域数据库文件
资源记录(Resource Record)的类型有以下几个:
SOA:起始授权记录,只能有一个,必须放在第一条
NS:域名服务记录,其中一个为主,可以有多个
A:IPv4地址记录
AAAA:IPv6地址记录
CNAME:别名记录
PTR:反向解析记录
MX:邮件交换器
相关测试工具及命令
dig命令
用于测试DNS系统,其不会查询hosts文件,使用格式:
dig [-t RR_TYPE] name [@SERVER] [query options]
常用的查询选项包括:
+[no]trace:跟踪解析过程;
+[no]recurse:进行递归解析;
其常用用法包括:
反向解析测试:dig -x IP
测试区域传送:dig -t [axfr|ixfr] DOMAIN [@server]
host命令
其用法类似于dig命令,使用格式为:
host [-t RR_TYPE] name SERVER_IP
nslookup命令
nslookup命令有两种使用模式,一种是命令模式,另一个交互模式。
其命令模式的使用格式为:nslookup [-options] [name] [server]
而交互模式的使用格式为:
nslookup>
server IP:以指定的IP为DNS服务器进行查询;
set q=RR_TYPE:要查询的资源记录类型;
name:要查询的名称;
rndc命令
rndc命令为named服务的控制命令,其常用的用法有以下:
rndc status:显示服务器状态
rndc reload:在不停止DNS服务器工作的情况下,重新加载配置文件和区域文件
rndc flush:清理DNS缓存
bind中的安全相关的配置
bind有四个内置的acl
none:没有一个主机;
any:任意主机;
local:本机;
localnet:本机所在的IP所属的网络;
访问控制指令:
allow-query {}; 允许查询的主机;白名单;
allow-transfer {}; 允许向哪些主机做区域传送;默认为向所有主机;
allow-recursion {}; 允许哪些主机向当前DNS服务器发起递归查询请求;
allow-update {}; DDNS,允许动态更新区域数据库文件中内容;
三、搭建主辅DNS服务器
环境说明
DNS主服务器:192.168.10.10
DNS辅服务器:192.168.10.11
DNS子域主服务器:192.168.10.12
1.设置主DNS服务器
安装软件
[root@localhost~]# yum -y install bind #安装bind
[root@localhost~]# yum -y install bind-utils #安装bind工具包
[root@localhost~]# systemctl start named #启动服务
[root@localhost~]# netstat -tunlp #查看状态
ActiveInternetconnections(only servers)
Proto Recv-QSend-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1323/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN891/sshd
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN1323/named
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN994/master
tcp6 0 0 ::1:53 :::* LISTEN1323/named
tcp6 0 0 :::22 :::* LISTEN891/sshd
tcp6 0 0 ::1:953 :::* LISTEN1323/named
tcp6 0 0 ::1:25 :::* LISTEN994/master
udp 0 0 127.0.0.1:53 0.0.0.0:* 1323/named
udp 0 0 127.0.0.1:323 0.0.0.0:* 639/chronyd
udp6 0 0 ::1:53 :::* 1323/named
udp6 0 0 ::1:323 :::* 639/chronyd
#其中53端口被监听,953端口被rndc监听
配置环境
[root@localhost ~]# vim /etc/resolv.conf #修改DNS配置文件
nameserver 192.168.10.10
[root@localhost ~]# vim /etc/named.conf
listen-on port 53 { 192.168.10.10; }; #修改监听通信地址IP
allow-query { any; }; #允许任何人连接,设置成any
dnssec-enable no;
dnssec-validation no;
#关闭dnssec,设置为no
配置解析一个正向区域
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "test.com" IN {
type master; #定义主类型
file "test.com.zone"; #这是相对路径,在/var/named下
};
建立区域数据文件
[root@localhost ~]# vim /var/named/test.com.zone
$TTL 3600
$ORIGIN test.com. #补一个后缀
@ IN SOA ns1.test.com. dnsadmin.test.com. (
2018053101
1H
10M
3D
1D )
IN NS ns1 #前面有补后缀可以简写,否则写全称最后要有点号
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 192.168.10.10
MX1 IN A 192.168.10.21
MX2 IN A 192.168.10.22
www IN A 192.168.10.10
web IN CNAME www
bbs IN A 192.168.10.23
bbs IN A 192.168.10.24
修改权限,检测语法
[root@localhost ~]# chgrp named /var/named/test.com.zone
[root@localhost ~]# chmod o= /var/named/test.com.zone
#修改新键的区域数据文件权限
[root@localhost named]# named-checkconf
[root@localhost named]# named-checkzone test.com /var/named/test.com.zone
zone test.com/IN: loaded serial 2018053101
OK
#检测语法
服务器重载配置文件和区域数据文件
[root@localhost named]# rndc status
number of zones: 101
[root@localhost named]# rndc reload
server reload successful
[root@localhost named]# rndc status
number of zones: 102
#查看状态可以看到重载后数字加1
DNS主服务器正向解析测试
[root@localhost ~]# dig -t -A www.test.com
;; Warning, ignoring invalid type -A
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t -A www.test.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18274
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.com. IN A
;; ANSWER SECTION:
www.test.com. 3600 IN A 192.168.10.10
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
;; Query time: 1 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Thu May 31 21:55:26 EDT 2018
;; MSG SIZE rcvd: 91
[root@localhost named]# dig -t A web.test.com
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A web.test.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65204
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.test.com. IN A
;; ANSWER SECTION:
web.test.com. 3600 IN CNAME www.test.com.
www.test.com. 3600 IN A 192.168.10.10
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
;; Query time: 1 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Thu May 31 21:11:25 EDT 2018
;; MSG SIZE rcvd: 109
[root@localhost ~]# host -t A bbs.test.com
bbs.test.com has address 192.168.10.23
bbs.test.com has address 192.168.10.24
[root@localhost ~]# host -t A bbs.test.com
bbs.test.com has address 192.168.10.23
bbs.test.com has address 192.168.10.24
[root@localhost ~]# host -t A bbs.test.com
bbs.test.com has address 192.168.10.24
bbs.test.com has address 192.168.10.23
配置解析一个反向区域
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "10.168.192.in-addr.arpa" IN {
type master;
file "192.168.10.zone";
};
建立反向区域数据文件
[root@localhost ~]# vim /var/named/192.168.10.zone
$TTL 3600
$ORIGIN 10.168.192.in-addr.arpa.
@ IN SOA ns1.test.com. nsadmin.test.com. (
2018060101
1H
10M
3D
12H )
IN NS ns1.test.com. #反向解析此处不能简写
10 IN PTR ns1.test.com.
21 IN PTR mx1.test.com.
22 IN PTR mx2.test.com.
23 IN PTR bbs.test.com.
24 IN PTR bbs.test.com.
10 IN PTR www.test.com.
修改反向区域文件权限,检测语法
[root@localhost named]# chgrp named /var/named/192.168.10.zone
[root@localhost named]# chmod o= /var/named/192.168.10.zone
[root@localhost named]# named-checkconf
[root@localhost named]# named-checkzone 10.168.192.in-addr.arpa /var/named/192.168.10.zone
zone 10.168.192.in-addr.arpa/IN: loaded serial 2018060101
OK
重载配置文件和区域数据文件
[root@localhost named]# rndc status
number of zones: 102
[root@localhost named]# rndc reload
server reload successful
[root@localhost named]# rndc status
number of zones: 103
主服务器反向解析测试
[root@localhost named]# dig -x 192.168.10.10
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -x 192.168.10.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25958
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;10.10.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
10.10.168.192.in-addr.arpa. 3600 IN PTR ns1.test.com.
10.10.168.192.in-addr.arpa. 3600 IN PTR www.test.com.
;; AUTHORITY SECTION:
10.168.192.in-addr.arpa. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
;; Query time: 1 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Thu May 31 22:26:03 EDT 2018
;; MSG SIZE rcvd: 129
2.设置辅DNS服务器
[root@localhost ~]# yum -y install bind bind-utils
[root@localhost ~]# systemctl start named.service
[root@localhost ~]# vim /etc/resolv.conf
nameserver 192.168.10.11
[root@localhost ~]# vim /etc/named.conf
listen-on port 53 { 192.168.10.11; };
allow-query { any; };
dnssec-enable no;
dnssec-validation no;
配置11辅服务器的正向区域
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "test.com" IN { #正向区域
type slave;
file "slaves/test.com.zone"; #区域数据文件位置
masters { 192.168.10.10; }; #定义正向区域主服务器IP
};
[root@localhost ~]# named-checkconf
来到10主服务器上去配置文件
[root@localhost ~]# vim /var/named/test.com.zone
$TTL 3600
$ORIGIN test.com.
@ IN SOA ns1.test.com. dnsadmin.test.com. (
2018053102 #每次修改文件时手动加1,从服务器才会更新
1H
10M
3D
1D )
IN NS ns1
IN NS ns2 #增加A记录指向11辅服务器
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 192.168.10.10
ns2 IN A 192.168.10.11 #辅服务器IP
MX1 IN A 192.168.10.21
MX2 IN A 192.168.10.22
www IN A 192.168.10.10
web IN CNAME www
bbs IN A 192.168.10.23
bbs IN A 192.168.10.24
[root@localhost ~]# named-checkzone test.com /var/named/test.com.zone
zone test.com/IN: loaded serial 2018053102
OK
[root@localhost ~]# rndc reload
server reload successful
[root@localhost ~]# rndc status
server is up and running
#检测语法,检测状态都正常
来到11辅服务器
[root@localhost ~]# rndc reload
server reload successful
[root@localhost slaves]# ll /var/named/slaves/
total 4
-rw-r--r-- 1 named named 533 May 31 23:17 test.com.zone
#正向区域数据文件已经同步过来
测试用11辅服务器解析网址
[root@localhost slaves]# dig -t A www.test.com @192.168.10.11
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A www.test.com @192.168.10.11
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45851
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.com. IN A
;; ANSWER SECTION:
www.test.com. 3600 IN A 192.168.10.10
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns2.test.com.
test.com. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
ns2.test.com. 3600 IN A 192.168.10.11
;; Query time: 0 msec
;; SERVER: 192.168.10.11#53(192.168.10.11)
;; WHEN: Thu May 31 23:20:16 EDT 2018
;; MSG SIZE rcvd: 125
进一步对主辅服务器进行测试,来到10主服务器
[root@localhost ~]# vim /var/named/test.com.zone
$TTL 3600
$ORIGIN test.com.
@ IN SOA ns1.test.com. dnsadmin.test.com. (
2018053103 #序列号加1
1H
10M
3D
1D )
IN NS ns1
IN NS ns2
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 192.168.10.10
ns2 IN A 192.168.10.11
MX1 IN A 192.168.10.21
MX2 IN A 192.168.10.22
www IN A 192.168.10.10
web IN CNAME www
bbs IN A 192.168.10.23
bbs IN A 192.168.10.24
pop3 IN A 192.168.10.25 #增加一条A记录
[root@localhost ~]# rndc reload
server reload successful
#重载配置
来到11辅服务器
[root@localhost ~]# systemctl status named.service
● named.service - Berkeley Internet Name Domain (DNS)
Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2018-05-31 22:38:36 EDT; 54min ago
Process: 1090 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
Process: 1087 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
Main PID: 1093 (named)
CGroup: /system.slice/named.service
└─1093 /usr/sbin/named -u named -c /etc/named.conf
May 31 23:17:11 localhost.localdomain named[1093]: zone test.com/IN: transferred serial 2018053102
May 31 23:17:11 localhost.localdomain named[1093]: transfer of 'test.com/IN' from 192.168.10.10#53: Transfer completed.../sec)
May 31 23:17:11 localhost.localdomain named[1093]: zone test.com/IN: sending notifies (serial 2018053102)
May 31 23:30:31 localhost.localdomain named[1093]: client 192.168.10.10#2372: received notify for zone 'test.com'
May 31 23:30:31 localhost.localdomain named[1093]: zone test.com/IN: refresh: unexpected rcode (REFUSED) from master 1....0#0)
May 31 23:30:31 localhost.localdomain named[1093]: zone test.com/IN: Transfer started.
May 31 23:30:31 localhost.localdomain named[1093]: transfer of 'test.com/IN' from 192.168.10.10#53: connected using 19...46792
May 31 23:30:31 localhost.localdomain named[1093]: zone test.com/IN: transferred serial 2018053103
May 31 23:30:31 localhost.localdomain named[1093]: transfer of 'test.com/IN' from 192.168.10.10#53: Transfer completed.../sec)
May 31 23:30:31 localhost.localdomain named[1093]: zone test.com/IN: sending notifies (serial 2018053103)
Hint: Some lines were ellipsized, use -l to show in full.
#辅服务器不需要reload,此时看到自动更新到新序列号,文件也传输过来了
[root@localhost ~]# dig -t A pop3.test.com @192.168.10.11
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A pop3.test.com @192.168.10.11
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24355
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;pop3.test.com. IN A
;; ANSWER SECTION:
pop3.test.com. 3600 IN A 192.168.10.25
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns1.test.com.
test.com. 3600 IN NS ns2.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
ns2.test.com. 3600 IN A 192.168.10.11
;; Query time: 1 msec
;; SERVER: 192.168.10.11#53(192.168.10.11)
;; WHEN: Thu May 31 23:54:58 EDT 2018
;; MSG SIZE rcvd: 126
配置11辅服务器反向区域
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "10.168.192.in-addr.arpa" IN {
type slave;
file "slaves/192.168.10.zone";
masters { 192.168.10.10; };
};
[root@localhost ~]# named-checkconf
配置10主服务器反向区域的数据文件
[root@localhost ~]# vim /var/named/192.168.10.zone
$TTL 3600
$ORIGIN 10.168.192.in-addr.arpa.
@ IN SOA ns1.test.com. nsadmin.test.com. (
2018060102
1H
10M
3D
12H )
IN NS ns1.test.com.
IN NS ns2.test.com. #增加PTR记录指向11辅服务器
10 IN PTR ns1.test.com.
11 IN PTR ns2.test.com. #11辅服务器名称
21 IN PTR mx1.test.com.
22 IN PTR mx2.test.com.
23 IN PTR bbs.test.com.
24 IN PTR bbs.test.com.
10 IN PTR www.test.com.
[root@localhost ~]# named-checkzone 10.168.192.in-addr.arpa /var/named/192.168.10.zone
zone 10.168.192.in-addr.arpa/IN: loaded serial 2018060102
OK
[root@localhost ~]# rndc reload
server reload successful
#检测语法,重载配置
来到11辅服务器
[root@localhost ~]# rndc reload
server reload successful
[root@localhost ~]# ll /var/named/slaves/
total 8
-rw-r--r-- 1 named named 600 Jun 1 02:23 192.168.10.zone
-rw-r--r-- 1 named named 574 Jun 1 02:10 test.com.zone
#反向区域的数据文件也已经同步过来
测试在11辅服务器反向解析IP
[root@localhost ~]# dig -x 192.168.10.10 @192.168.10.11
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -x 192.168.10.10 @192.168.10.11
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50592
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;10.10.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
10.10.168.192.in-addr.arpa. 3600 IN PTR ns1.test.com.
10.10.168.192.in-addr.arpa. 3600 IN PTR www.test.com.
;; AUTHORITY SECTION:
10.168.192.in-addr.arpa. 3600 IN NS ns2.test.com.
10.168.192.in-addr.arpa. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
ns2.test.com. 3600 IN A 192.168.10.11
;; Query time: 1 msec
;; SERVER: 192.168.10.11#53(192.168.10.11)
;; WHEN: Fri Jun 01 02:25:17 EDT 2018
;; MSG SIZE rcvd: 163
在11辅服务器测试
[root@localhost ~]# dig -x 192.168.10.25 @192.168.10.11
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -x 192.168.10.25 @192.168.10.11
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35322
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;25.10.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
25.10.168.192.in-addr.arpa. 3600 IN PTR pop3.test.com.
;; AUTHORITY SECTION:
10.168.192.in-addr.arpa. 3600 IN NS ns1.test.com.
10.168.192.in-addr.arpa. 3600 IN NS ns2.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
ns2.test.com. 3600 IN A 192.168.10.11
;; Query time: 1 msec
;; SERVER: 192.168.10.11#53(192.168.10.11)
;; WHEN: Fri Jun 01 02:36:48 EDT 2018
;; MSG SIZE rcvd: 150
手动测试区域传送功能
[root@localhost ~]# dig -t axfr test.com @192.168.10.11
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t axfr test.com @192.168.10.11
;; global options: +cmd
test.com. 3600 IN SOA ns1.test.com. dnsadmin.test.com. 2018053103 3600 600 259200 86400
test.com. 3600 IN MX 10 mx1.test.com.
test.com. 3600 IN MX 20 mx2.test.com.
test.com. 3600 IN NS ns1.test.com.
test.com. 3600 IN NS ns2.test.com.
bbs.test.com. 3600 IN A 192.168.10.23
bbs.test.com. 3600 IN A 192.168.10.24
MX1.test.com. 3600 IN A 192.168.10.21
MX2.test.com. 3600 IN A 192.168.10.22
ns1.test.com. 3600 IN A 192.168.10.10
ns2.test.com. 3600 IN A 192.168.10.11
pop3.test.com. 3600 IN A 192.168.10.25
web.test.com. 3600 IN CNAME www.test.com.
www.test.com. 3600 IN A 192.168.10.10
test.com. 3600 IN SOA ns1.test.com. dnsadmin.test.com. 2018053103 3600 600 259200 86400
;; Query time: 1 msec
;; SERVER: 192.168.10.11#53(192.168.10.11)
;; WHEN: Fri Jun 01 02:40:11 EDT 2018
;; XFR size: 15 records (messages 1, bytes 350)
[root@localhost ~]# dig -t axfr 10.168.192.in-addr.arpa @192.168.10.10
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t axfr 10.168.192.in-addr.arpa @192.168.10.10
;; global options: +cmd
10.168.192.in-addr.arpa. 3600 IN SOA ns1.test.com. nsadmin.test.com. 2018060103 3600 600 259200 43200
10.168.192.in-addr.arpa. 3600 IN NS ns1.test.com.
10.168.192.in-addr.arpa. 3600 IN NS ns2.test.com.
10.10.168.192.in-addr.arpa. 3600 IN PTR ns1.test.com.
10.10.168.192.in-addr.arpa. 3600 IN PTR www.test.com.
11.10.168.192.in-addr.arpa. 3600 IN PTR ns2.test.com.
21.10.168.192.in-addr.arpa. 3600 IN PTR mx1.test.com.
22.10.168.192.in-addr.arpa. 3600 IN PTR mx2.test.com.
23.10.168.192.in-addr.arpa. 3600 IN PTR bbs.test.com.
24.10.168.192.in-addr.arpa. 3600 IN PTR bbs.test.com.
25.10.168.192.in-addr.arpa. 3600 IN PTR pop3.test.com.
10.168.192.in-addr.arpa. 3600 IN SOA ns1.test.com. nsadmin.test.com. 2018060103 3600 600 259200 43200
;; Query time: 2 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Fri Jun 01 02:42:53 EDT 2018
;; XFR size: 12 records (messages 1, bytes 319)
这种开放式的区域传送对服务器有巨大的风险,我们需要配置访问控制,让主服务器只开放给辅服务器做传送
四、访问控制,子域授权
配置192.168.10.12子域主服务器流程:
首先到192.168.10.10主服务器中添加子域服务器的数据
[root@localhost ~]# vim /var/named/test.com.zone
$ORIGIN test.com.
@ IN SOA ns1.test.com. dnsadmin.test.com. (
2018053104 #序列号加1
1H
10M
3D
1D )
IN NS ns1
IN NS ns2
IN MX 10 mx1
IN MX 20 mx2
ops IN NS ns1.ops #增加子域服务器
ns1 IN A 192.168.10.10
ns2 IN A 192.168.10.11
MX1 IN A 192.168.10.21
MX2 IN A 192.168.10.22
www IN A 192.168.10.10
web IN CNAME www
bbs IN A 192.168.10.23
bbs IN A 192.168.10.24
ns1.ops IN A 192.168.10.12 #增加子域服务器A标记
配置12子域服务器
[root@localhost ~]# yum -y install bind bind-utils
[root@localhost ~]# systemctl start named.service
[root@localhost ~]# vim /etc/resolv.conf
nameserver 192.168.10.12
[root@localhost ~]# vim /etc/named.conf
listen-on port 53 { 127.0.0.1; 192.168.10.12; };
//allow-query { localhost; }; #注释掉这一行
dnssec-enable no;
dnssec-validation no;
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "ops.test.com" IN {
type master;
file "ops.test.com.zone";
};
#增加三级域,增加正向区域的子域
[root@localhost ~]# vim /etc/named/ops.test.com.zone
$TTL 3600
$ORIGIN ops.test.com.
@ IN SOA ns1.ops.test.com. nsadmin.ops.test.com. (
2018060101
1H
10M
1D
2H )
IN NS ns1
ns1 IN A 192.168.10.12
www IN A 192.168.10.12
[root@localhost ~]# chgrp named /var/named/ops.test.com.zone
[root@localhost ~]# chmod o= /var/named/ops.test.com.zone
[root@localhost ~]# named-checkconf
[root@localhost ~]# named-checkzone ops.test.com /var/named/ops.test.com.zone
zone ops.test.com/IN: loaded serial 2018060101
OK
[root@localhost ~]# rndc reload
server reload successful
测试
[root@localhost ~]# dig -t A www.ops.test.com @192.168.10.12
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A www.ops.test.com @192.168.10.12
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13329
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.ops.test.com. IN A
;; ANSWER SECTION:
www.ops.test.com. 3600 IN A 192.168.10.12
;; AUTHORITY SECTION:
ops.test.com. 3600 IN NS ns1.ops.test.com.
;; ADDITIONAL SECTION:
ns1.ops.test.com. 3600 IN A 192.168.10.12
;; Query time: 1 msec
;; SERVER: 192.168.10.12#53(192.168.10.12)
;; WHEN: Fri Jun 01 03:45:00 EDT 2018
;; MSG SIZE rcvd: 95
子域服务器解析www.test.com时,因自己不能解析默认会去互联网根域上去迭代查询
[root@localhost ~]# dig -t A www.test.com @192.168.10.12
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A www.test.com @192.168.10.12
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32424
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.com. IN A
;; ANSWER SECTION:
www.test.com. 3579 IN A 69.172.200.235
;; AUTHORITY SECTION:
test.com. 172779 IN NS ns66.worldnic.com.
test.com. 172779 IN NS ns65.worldnic.com.
;; ADDITIONAL SECTION:
ns65.worldnic.com. 172779 IN A 207.204.40.133
ns66.worldnic.com. 172779 IN A 207.204.21.133
;; Query time: 1 msec
;; SERVER: 192.168.10.12#53(192.168.10.12)
;; WHEN: Fri Jun 01 21:06:53 EDT 2018
;; MSG SIZE rcvd: 136
子域定义转发域到主辅服务器,test.com会转发到主辅服务器中解析
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "test.com" IN {
type forward;
forward only;
forwarders { 192.168.10.10; 192.168.10.11; };
};
#在配置文件末尾添加这段转发规则
[root@localhost ~]# rndc reload
server reload successful
[root@localhost ~]# rndc flush
#清空缓存
此时可以解析出正确的IP
[root@localhost ~]# dig -t A www.test.com @192.168.10.12
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A www.test.com @192.168.10.12
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63618
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.com. IN A
;; ANSWER SECTION:
www.test.com. 3600 IN A 192.168.10.10
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns2.test.com.
test.com. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns2.test.com. 3600 IN A 192.168.10.11
ns1.test.com. 3600 IN A 192.168.10.10
;; Query time: 6 msec
;; SERVER: 192.168.10.12#53(192.168.10.12)
;; WHEN: Fri Jun 01 21:23:08 EDT 2018
;; MSG SIZE rcvd: 125
上面是对特定区域的区域转发解析请求,也可以配置本地不能解析的全部转给其他服务器来解析的全局转发
[root@localhost ~]# vim /etc/named.conf
forward only;
forwarders { 192.168.10.10; }; #在options代码段中添加这两行指令
#并删除掉上面的区域转发规则
[root@localhost ~]# rndc reload
[root@localhost ~]# rndc flush
[root@localhost ~]# dig -t A www.test.com @192.168.10.12
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A www.test.com @192.168.10.12
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9713
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.com. IN A
;; ANSWER SECTION:
www.test.com. 3560 IN A 192.168.10.10
;; AUTHORITY SECTION:
test.com. 3560 IN NS ns2.test.com.
test.com. 3560 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns2.test.com. 3560 IN A 192.168.10.11
ns1.test.com. 3560 IN A 192.168.10.10
;; Query time: 1 msec
;; SERVER: 192.168.10.12#53(192.168.10.12)
;; WHEN: Fri Jun 01 21:47:02 EDT 2018
;; MSG SIZE rcvd: 125
配置访问控制命令
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "test.com" IN {
type master;
file "test.com.zone";
allow-transfer { slaves; };
};
[root@localhost ~]# vim /etc/named.conf
acl slaves {
192.168.10.11;
};
#在options前面加上这一段
上面的访问控制列表中没有12服务器,所以用12传输失败
[root@localhost ~]# dig -t axfr test.com @192.168.10.12
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t axfr test.com @192.168.10.12
;; global options: +cmd
; Transfer failed.
服务器只允许列表中网段主机可以执行递归查询
[root@localhost ~]# vim /etc/named.conf
acl mynet {
192.168.10.0/24;
127.0.0.0/8;
};
#在options前面加上这一段
allow-recuresion { mynet; };
#recursion yes;修改这上面这句
2、搭建并实现智能DNS。
要实现DNS服务器的智能解析,需要先理解一个概念:view
假如有台web主机,www.test.com是域名,它有两个IP,一个接内网IP为192.168.10.10,一个接外网IP为1.1.1.1。来自互联网的用户会解析成1.1.1.1,而来自内网的用户不需要解析成外网IP在连进来,只需要直接解析成内网IP192.168.10.10就可以了。这种根据客户端的不同来源将同一个主机解析成不同的结果,就叫做view。
修改主DNS的named.conf配置文件
[root@localhost ~]# vim /etc/named.conf
options {
......
};
logging {
......
};
view internal {
match-clients { 192.168.10.11; };#设置此IP解析成外网
zone "." IN {
type hint;
file "named.ca";
};
zone "test.com" IN {
type master;
file "test.com/internal";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
};
view external {
match-clients { any; };#除了上面的IP范围,其他所有IP解析成内网
zone "." IN {
type hint;
file "named.ca";
};
zone "test.com" IN {
type master;
file "test.com/external";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
};
建立两个正向区域数据文件
[root@localhost ~]# vim /var/named/test.com/internal
$TTL 3600
$ORIGIN test.com.
@ IN SOA ns1.test.com. dnsadmin.test.com. (
2018053101
1H
10M
3D
1D )
IN NS ns1
ns1 IN A 192.168.10.10
www IN A 1.1.1.1
web IN CNAME www
bbs IN A 1.1.1.2
bbs IN A 1.1.1.3
[root@localhost ~]# vim /var/named/test.com/external
$TTL 3600
$ORIGIN test.com.
@ IN SOA ns1.test.com. dnsadmin.test.com. (
2018053101
1H
10M
3D
1D )
IN NS ns1
ns1 IN A 192.168.10.10
www IN A 192.168.10.10
web IN CNAME www
bbs IN A 192.168.10.23
bbs IN A 192.168.10.24
检测语法并设置权限
[root@localhost ~]# named-checkconf
[root@localhost ~]# named-checkzone test.com /var/named/test.com/internal
zone test.com/IN: loaded serial 2018053101
OK
[root@localhost ~]# named-checkzone test.com /var/named/test.com/external
zone test.com/IN: loaded serial 2018053101
OK
[root@localhost ~]# chgrp named /var/named/test.com/{internal,external}
[root@localhost ~]# chmod o= /var/named/test.com/{internal,external}
[root@localhost ~]# rndc reload
server reload successful
用192.168.10.12进行解析,解析成内网IP
[root@localhost ~]# dig -t A www.test.com @192.168.10.10
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A www.test.com @192.168.10.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47742
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.com. IN A
;; ANSWER SECTION:
www.test.com. 3600 IN A 192.168.10.10
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
;; Query time: 2 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Sat Jun 02 02:45:02 EDT 2018
;; MSG SIZE rcvd: 91
[root@localhost ~]# dig -t A bbs.test.com @192.168.10.10
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A bbs.test.com @192.168.10.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36168
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;bbs.test.com. IN A
;; ANSWER SECTION:
bbs.test.com. 3600 IN A 192.168.10.24
bbs.test.com. 3600 IN A 192.168.10.23
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
;; Query time: 1 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Sat Jun 02 02:45:20 EDT 2018
;; MSG SIZE rcvd: 107
用192.168.10.11进行解析,解析成外网IP
[root@localhost ~]# dig -t A www.test.com @192.168.10.10
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A www.test.com @192.168.10.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39708
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.com. IN A
;; ANSWER SECTION:
www.test.com. 3600 IN A 1.1.1.1
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
;; Query time: 1 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Sat Jun 02 02:47:01 EDT 2018
;; MSG SIZE rcvd: 91
[root@localhost ~]# dig -t A bbs.test.com @192.168.10.10
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A bbs.test.com @192.168.10.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44362
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;bbs.test.com. IN A
;; ANSWER SECTION:
bbs.test.com. 3600 IN A 1.1.1.2
bbs.test.com. 3600 IN A 1.1.1.3
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns1.test.com.
;; ADDITIONAL SECTION:
ns1.test.com. 3600 IN A 192.168.10.10
;; Query time: 1 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Sat Jun 02 02:47:24 EDT 2018
;; MSG SIZE rcvd: 107
此时一个智能DNS服务器就搭建完成了,比如在我国应用比较多的场景是按照客户端的线路是电信线路还是网通线路,服务器自动解析成自己服务器上相对应的电信IP或者网通IP,从而使客户端和服务端连接在同一个运营商的线路上,获得最好的网速。
3、使用iptable实现: 放行ssh,telnet, ftp, web服务80端口,其他端口服务全部拒绝
1、关闭firewalld,清除filter表中的规则
iptables -F
2、添加规则
iptables -I INPUT -p tcp -m multiport --dports 21,22,21,80 -j ACCEPT
3、查看规则
iptables -vnL
4、NAT原理总结
1. NAT 简介
1.1 IP地址
为了区分IP使用场景,我们可将IP地址可以分为:公网IP地址和私网IP地址.
公有IP地址: 也叫全局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻 址的地址。
私有IP地址: 也叫内部地址,属于非注册地址,专门为组织机构内部使用。因特网分配编号委员会(IANA)保留了3块IP地址做为私有IP地址:
10.0.0.0 ——— 10.255.255.255
172.16.0.0——— 172.16.255.255
192.168.0.0———192.168.255.255
地址池:地址池是有一些外部地址(全球唯一的IP地址)组合而成,我们称这样的一个地址集合为地址池。在内部网络的数据包通过地址转换到达外部网络时,将会在地址池中选择某个IP地址作为数据包的源IP地址,这样可以有效的利用用户的外部地址,提高访问外部网络的能力。
1.2 NAT
NAT 英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。
NAT 功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。
1.2 分类
NAT有三种类型:
静态NAT(Static NAT)
动态地址NAT(Pooled NAT)
网络地址端口转换NAPT(Port-Level NAT)。
1.2.1静态NAT
通过手动设置,使 Internet 客户进行的通信能够映射到某个特定的私有网络地址和端口。如果想让连接在 Internet 上的计算机能够使用某个私有网络上的服务器(如网站服务器)以及应用程序(如游戏),那么静态映射是必需的。静态映射不会从 NAT 转换表中删除。
如果在 NAT 转换表中存在某个映射,那么 NAT 只是单向地从 Internet 向私有网络传送数据。这样,NAT 就为连接到私有网络部分的计算机提供了某种程度的保护。但是,如果考虑到 Internet 的安全性,NAT 就要配合全功能的防火墙一起使用。
对于以上网络拓扑图,当内网主机 10.1.1.1如果要与外网的主机201.0.0.11通信时,主机(IP:10.1.1.1)的数据包经过路由器时,路由器通过查找NAT table 将IP数据包的源IP地址(10.1.1.1)改成与之对应的全局IP地址(201.0.0.1),而目标IP地址201.0.0.11保持不变,这样,数据包就能到达201.0.0.11。而当主机HostB(IP:201.0.0.11) 响应的数据包到达与内网相连接的路由器时,路由器同样查找NAT table,将IP数据包的目的IP 地址改成10.1.1.1,这样内网主机就能接收到外网主机发过来的数据包。在静态NAT方式中,内部的IP地址与公有IP地址是一种一一对应的映射关系,所以,采用这种方式的前提是,机构能够申请到足够多的全局IP地址。
1.2.2 动态NAT
动态地址NAT只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。当远程用户联接上之后,动态地址NAT就会分配给他一个IP地址,用户断开时,这个IP地址就会被释放而留待以后使用。
动态NAT方式适合于 当机构申请到的全局IP地址较少,而内部网络主机较多的情况。内网主机IP与全局IP地址是多对一的关系。当数据包进出内网时,具有NAT功能的设备对IP数据包的处理与静态NAT的一样,只是NAT table表中的记录是动态的,若内网主机在一定时间内没有和外部网络通信,有关它的IP地址映射关系将会被删除,并且会把该全局IP地址分配给新的IP数据包使用,形成新的NAT table映射记录。
1.2.3网络地址端口转换NAPT
网络地址端口转换NAPT(Network Address Port Translation)则是把内部地址映射到外部网络的一个IP地址的不同端口上。它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与 动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。
NAPT是使用最普遍的一种转换方式,它又包含两种转换方式:SNAT和DNAT。
(1)源NAT(Source NAT,SNAT):修改数据包的源地址。源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一具SNAT的例子。
(2)目的NAT(Destination NAT,DNAT):修改数据包的目的地址。Destination NAT刚好与SNAT相反,它是改变第一个数据包的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT。
在这里插入图片描述
2 NAT原理
2.1 地址转换
NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。
在这里插入图片描述
2.2 连接跟踪
在上述过程中,NAT Gateway在收到响应包后,就需要判断将数据包转发给谁。此时如果子网内仅有少量客户机,可以用静态NAT手工指定;但如果内网有多台客户机,并且各自访问不同网站,这时候就需要连接跟踪(connection track)。
在这里插入图片描述
在NAT Gateway收到客户机发来的请求包后,做源地址转换,并且将该连接记录保存下来,当NAT Gateway收到服务器来的响应包后,查找Track Table,确定转发目标,做目的地址转换,转发给客户机。
2.3 端口转换
以上述客户机访问服务器为例,当仅有一台客户机访问服务器时,NAT Gateway只须更改数据包的源IP或目的IP即可正常通讯。但是如果Client A和Client B同时访问Web Server,那么当NAT Gateway收到响应包的时候,就无法判断将数据包转发给哪台客户机,如下图所示。
在这里插入图片描述
此时,NAT Gateway会在Connection Track中加入端口信息加以区分。如果两客户机访问同一服务器的源端口不同,那么在Track Table里加入端口信息即可区分,如果源端口正好相同,那么在实行SNAT和DNAT的同时对源端口也要做相应的转换,如下图所示。
在这里插入图片描述
3 应用
NAT主要可以实现以下几个功能:
数据包伪装
平衡负载
端口转发
透明代理
3.1 数据伪装
可以将内网数据包中的地址信息更改成统一的对外地址信息,不让内网主机直接暴露在因特网上,保证内网主机的安全。同时,该功能也常用来实现共享上网。例如,内网主机访问外网时,为了隐藏内网拓扑结构,使用全局地址替换私有地址。
3.2 端口转发
当内网主机对外提供服务时,由于使用的是内部私有IP地址,外网无法直接访问。因此,需要在网关上进行端口转发,将特定服务的数据包转发给内网主机。例如公司小王在自己的服务器上架设了一个Web网站,他的IP地址为192.168.0.5,使用默认端口80,现在他想让局域网外的用户也能直接访问他的Web站点。利用NAT即可很轻松的解决这个问题,服务器的IP地址为210.59.120.89,那么为小王分配一个端口,例如81,即所有访问210.59.120.89:81的请求都自动转向192.168.0.5:80,而且这个过程对用户来说是透明的。
3.3 负载平衡
目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。例如1.2.3所讲的目的NAT的例子。
3.4 失效终结
目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器当机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上,提高系统的可靠性。
3.5 透明代理
例如自己架设的服务器空间不足,需要将某些链接指向存在另外一台服务器的空间;或者某台计算机上没有安装IIS服务,但是却想让网友访问该台计算机上的内容,这个时候利用IIS的Web站点重定向即可轻松的帮助我们搞定。
4 NAT的缺陷
NAT在最开始的时候是非常完美的,但随着网络的发展,各种新的应用层出不穷,此时NAT也暴露出了缺点。NAT的缺陷主要表现在以下几方面:
4.1 不能处理嵌入式IP地址或端口
NAT设备不能翻译那些嵌入到应用数据部分的IP地址或端口信息,它只能翻译那种正常位于IP首部中的地址信息和位于TCP/UDP首部中的端口信息,如下图,由于对方会使用接收到的数据包中嵌入的地址和端口进行通信,这样就可能产生连接故障,如果通信双方都是使用的公网IP,这不会造成什么问题,但如果那个嵌入式地址和端口是内网的,显然连接就不可能成攻,原因就如开篇所说的一样。MSN Messenger的部分功能就使用了这种方式来传递IP和端口信息,这样就导致了NAT设备后的客户端网络应用程序出现连接故障。
4.2 不能从公网访问内部网络服务
由于内网是私有IP,所以不能直接从公网访问内部网络服务,比如WEB服务,对于这个问题,我们可以采用建立静态映射的方法来解决。比如有一条静态映射,是把218.70.201.185:80与192.168.0.88:80映射起的,当公网用户要访问内部WEB服务器时,它就首先连接到218.70.201.185:80,然后NAT设备把请求传给192.168.0.88:80,192.168.0.88把响应返回NAT设备,再由NAT设备传给公网访问用户。
4.3 数据包丢失
有一些应用程序虽然是用A端口发送数据的,但却要用B端口进行接收,不过NAT设备翻译时却不知道这一点,它仍然建立一条针对A端口的映射,结果对方响应的数据要传给B端口时,NAT设备却找不到相关映射条目而会丢弃数据包。
4.4 一些P2P应用在NAT后无法进行
对于那些没有中间服务器的纯P2P应用(如电视会议,娱乐等)来说,如果大家都位于NAT设备之后,双方是无法建立连接的。因为没有中间服务器的中转,NAT设备后的P2P程序在NAT设备上是不会有映射条目的,也就是说对方是不能向你发起一个连接的。现在已经有一种叫做P2P NAT穿越的技术来解决这个问题。
5 结语
NAT技术无可否认是在ipv4地址资源的短缺时候起到了缓解作用;在减少用户申请ISP服务的花费和提供比较完善的负载平衡功能等方面带来了不少好处。但是在ipv4地址在以后几年将会枯竭,NAT技术不能改变ip地址空间不足的本质。然而在安全机制上也潜在着威胁,在配置和管理上也是一个挑战。如果要从根本上解决ip地址资源的问题,ipv6才是最根本之路。在ipv4转换到ipv6的过程中,NAT技术确实是一个不错的选择,相对其他的方案优势也非常明显。
5、iptables实现SNAT和DNAT,并对规则持久保存。
实现SNAT和DNAT都需要开启内核数据转发功能
[root@localhost ~]# vim /etc/sysctl.conf
# 把下列选项改正1
net.ipv4.ip_forward=0
...
net.ipv4.ip_forward=1
2.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
2.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
2.3 iptables规则持久保存:
CentOS 7、8
iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 6
# 将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save
2.4 加载规则
2.4.1 CentOS 7、8 重新载入预存规则文件中规则:
iptables-restore < /PATH/FROM/SOME_RULES_FILE
iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
2.4.2 CentOS 6:
service iptables restart
#会自动从/etc/sysconfig/iptables 重新载入规则
2.5 开机自动重载规则
2.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
2.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