DNS是一个从域名映射到IP地址的系统;
一、DNS的背景
TCP/IP使用IP地址和端口号来对应网络上的一台主机的一个进程,但是IP地址并不好记;
于是有了主机名(字符串),并且使用hosts文件来描述主机名和IP地址的关系。
最初是互联网信息中心(SRI-NIC)来管理这个hosts文件,如果 每一个计算机向接入网络,或者想更改IP,都需要到信息管理中心去申请,其他计算机也需要定期更新下载hosts文件才能正确上网。
因为这样太麻烦,所以产生了DNS系统:
DNS是一个组织的系统管理机构,维护系统内的每个主机IP地址和主机名的关系;
如果有新的计算机接入网络,则这个信息记录在数据库中;
用户在输入域名时,自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址;
至今,我们的计算机上任然保留了hosts文件,在域名解析过程中任然会优先查看hosts文件的内容;
可以使用cat /etc/hosts查看hosts文件:
二、域名的简介
主域名:标识主机名称和主机所属的组织机构的一种分层结构;
就拿www.baidu.com举例:
.com:一级域名,表示这是一个企业级域名,还有net(网络提供商),org(非盈利组织);
baidu:二级域名,公司名称;
www:一种习惯做法;
域名使用 . 连接
三、域名服务器
域名服务器也是对应的层级结构。
每层的域名上都有自己的域名服务器,最顶层的是根域名服务器;
每一级的域名服务器都知道下级域名服务器的IP地址;
且为了安全起见,每级都至少有两个域名服务器。
四、域名解析过程
输入域名后,先查找自己主机名对应的域名服务器
域名服务器先查找自己的数据库里面有没有,如果没有,就向上级域名服务器中查找;
最多查找到根域名服务器,一定能找到这个域名对应的IP地址;
福明服务器自己也会进行一些缓存;
五、使用dig命令分析DNS过程
安装dig工具
sudo yum install bind-utils
然后就可通过dig命令查看域名解析的过程了
dig www.baidu.com
结果如下:
; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21090
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 881 IN CNAME www.a.shifen.com.
www.a.shifen.com. 239 IN A 61.135.169.125
www.a.shifen.com. 239 IN A 61.135.169.121
;; Query time: 47 msec
;; SERVER: 192.168.43.1#53(192.168.43.1)
;; WHEN: 四 5月 16 00:41:13 PDT 2019
;; MSG SIZE rcvd: 101
结果解释:
1、开头位置是dig指令的版本号
2、第二部分是服务器返回的详情,重要的是status参数,NOERROR表示查询成功
3、QUESTION SECTION表示要查询的域名时什么?
4、ANSWER SECTION表示查询的结果是什么。这个结果先将www.baidu,com查询成了www.a.shifen.com,在将www.a.shifen.com查询成了两个IP地址
5、最下面是一些结果统计,包含查询时间和DNS服务器的地址等
更多使用方法:https://www.imooc.com/article/26971?block_id
六:DNS放大攻击
http://blog.sina.com.cn/s/blog_90bb1f200101iazl.html
应用IP协议检测网络报文是否丢失,ping命令的底层用的就是ICMP.
ICMP是一个网络层的协议;
一个新搭建的网络,往往需要先进行一个简答的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因;
ICMP正是提供这种功能的协议;
ICMP协议的主要功能:
1、确认IP包是否成功到达目标地址
2、通知在发送过程中的IP包被丢弃的原因
3、ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们任然把它归为网络层的协议
4、ICMP只能搭配IPV4使用,在IPV6的情况下,需要使用ICMPV6
ICMP大概分为两类报文:1、通知出错的原因。 2、用于诊断查询
ping 命令
这里ping的是域名,不是url,一个域名可以通过DNS解析成IP地址;
ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的time to live, 生存周期)
ping命令会先发送一个ICMP Echo Requests给对端;
对端接收到之后,会返回一个ICMP Echo Reply;
这里有一个问题需要注意,ping命令是基于ICMP,是在网络层。所以在ICMP中根本就不关注端口号这样的信息,端口号是传输层的内容;
traceroute命令
也是基于ICMP协议实现,能够打印出可执行程序主机,一直到目标主机之前要经历多少路由器。
NAT技术的背景
在之前的文章中,我们讨论了IP地址数量不足的问题
NAT技术当前解决IP地址不够用的主要手段,是路由器的一个重要功能;
NAT能够将私有IP对外通信时转为全局IP,也就是一种将私有IP和全局IP相互转化的技术方法;
很多学校、家庭、公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP;
全局IP要求唯一,但是私有IP不一样;在不同的局域网中出现相同的私有IP是完全不影响的;
NAT IP转换过程
NAT路由器将原地址从10.0.0.10替换成全局的IP 202.244.174.37;
NAT路由器收到外部的数据时,又会把目标IP从202.244.174.37换回10.0.0.10
当NAT路由器内部,有一张自动生成的,用于地址转化的表
当10.0.0.10第一次访问向 163.221.120.9发送数据时就会生成表中映射关系
NAPT
那么,有的人可能会说,如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据,目的IP都是相同的,那么NAT路由器如何判定这个数据报是发送给那个局域网的主机?
这时候NAPT来解决这个问题,使用IP+PORT来建立这个映射关系;
这个关联关系是由NAT路由器自动维护的。例如在TCP的情况下,建立连接时,就会生成这个表项;在断开连接后,就会删除这个表项;
NAT技术的缺陷
由于NAT依赖这个转换表,所以有许多限制:
NAT穿越
1、背景信息:
(1)我们模拟的情形是位于网络A下的内网主机UserA 想要和位于网络B下的内网主机UserB进行点对点通信,刚开始的时候UserA和UserB都不知道对方的公网和内网IP地址及端口号,所以必须要再公网上搭建一个服务器C,服务器C主要的任务就是维护一张用户名到(主机的公网IP+端口号)的映射表,这样用户就可以从服务器C上获取UserB的公网IP和地址
(2)UserA在局域网内发的IP包源地址是192.168.1.100:3000,该IP包经过路由器A后会被路由器A修改成能够在公网传输的公网IP地址和公网端口号:125.71.229.217:4001。UserB向公网发送报文路由器B也会对它做同样处理。
2、NAT穿越:
STEP1: 假设UserA想要给UserB发送消息,那么UserA就会让服务器C通知UserB先进行打洞操作。
STEP2: UserB收到打洞通知后,就发送IP包(目地址:125.71.229.217:4001,源地址:202.108.22.5:6002)给路由器A。路由器A收到该IP包后会查看源地址(202.108.22.5:6002),路由器发现局域网之前没有请求过该源地址,所以路由器会过滤掉此包。(这一步就相当于打了个洞)
STEP3: 现在到了最后UserA给UserB发送消息的一步,UserA通过路由器A发出IP数据包(目地址:202.108.22.5:6002,源地址:125.71.229.217:4001)给路由器B,同样路由器B要查看该IP包的源地址(125.71.229.217:4001),因为在STEP2中路由器B给路由器A发送过对此地址的请求(最后被丢掉的那个包),所以路由器B不会丢掉该包。接下来路由器B会读取IP包的目的地址202.108.22.5:6002,然后通过映射表转换成内网IP地址和端口号:192.168.1.100:3000,这样就可以发送报文给主机UserB了。
3、其他:
(1)对称路由器和非对称路由器
实际上上面的NAT穿越技术只适合锥形路由器(非对称路由器),说道这就要讲一下什么是对称路由器和非对称路由器了:
非对称路由器:将同一内网IP (比如:192.168.1.100:3000) 访问不同外网地址比如百度和谷歌时映射成的公网IP和公网端口是相同的(比如都是:202.108.22.5:6002)。
反之,对称路由器就是:将同一内网IP(比如192.168.1.100:3000)访问不同网络地址比如百度和谷歌时映射成的公网IP和公网端口是不同的(比如访问百度时映射成:202.108.22.5:6002,访问谷歌时映射成:125.71.229.217:4001)
回到2中讲的NAT穿越技术,显然,UserA想给UserB发送消息,前提是:UserB 给UserA发送消息(打洞操作)和UserB给服务器C发送消息(注册自己的公网IP)用的公网IP地址和端口号是相同的。所以NAT穿越只适合非对称路由器。
(2)不能用TCP做NAT穿越,只能用UDP做NAT穿越。
因为:tcp是基于连接的通信,而路由器会把来自同一主机的同一端口号上的不同tcp连接映射成不同的公网端口号。反之,UDP不是基于连接的传输协议,所以使用UDP就可以将不同的网络请求映射成同一公网源地址和公网端口号。体现到实际编程中就是:同一文件描述符通过路由器可以映射成同一公网IP地址和端口号。不同文件描述符通过路由器要被映射成同一公网地址和不同的公网端口号。
UserA 和 服务器C通信(注册自己的公网IP)时,需要创建一个文件描述符 fd1;UserA 和 UserB通信时还要再创建一个描述符 fd2。 路由器对不同描述符做映射时,会把不同的描述符映射到不同的公网端口号上。
比如:UserA 的文件描述符fd1 绑定到了端口3000上,文件描述符 fd 通过端口复用也绑定到了端口3000上;但路由器在做映射时,会将这两个文件描述符代表的tcp连接映射成如下格式(eg:) 192.168.1.100:3000 <->202.108.22.5:6002; 192.168.1.100:3000 <-> 202.108.22.5:6003
使用UDP可以完成NAT穿越:
因为UserA 通过文件描述符fd1 和 服务器C通信,然后UserA可以继续用此fd1和UserB通信,这样路由器就会把同一内网地址上的同一端口号发出的请求映射成同一公网地址。
NAT和代理服务器
路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程;
代理服务器看起来和NAT设备有一点像,客户端向代理服务器发送请求,代理服务器把请求转发给真正要请求的服务器;服务器返回结果后,代理服务器有把结果传给客户端;
那么代理服务器和NAT有哪些区别?
1、从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比
如通过代理服务器进行, 另外像迅游这样的加速器, 也是使用代理服务器.
2、从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
3、从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以
跨网.
4、从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署
在服务器上.
代理服务器是一种应用比较广的技术。
代理服务器又分为正向代理和反向代理:
举例:代购
我自己去日本买马桶盖比较不方便, 但是可以让我在日本工作的表姐去超市买了快递给我. 此时超市看到的买家是我表
姐, 我的表姐就是 "正向代理";
后来找我表姐买马桶盖的人太多了, 我表姐觉得天天去超市太麻烦, 干脆去超市买了一大批马桶盖屯在家里, 如果有人
来找她代购, 就直接把屯在家里的货发出去, 而不必再去超市. 此时我表姐就是 "反向代理"。
正向代理用于请求的转发(例如借助代理绕过反爬虫)。
反向代理往往用做缓存。