海外的客户报告了一个问题,设备设置的网关地址不在设备所在的网段下面,例如:
IP: 192.168.135.2
NetMask: 255.255.255.0
GateWay: 192.168.8.1
现在的问题来了,设备能不能PING通网关?
这个问题涉及到PING的实现基础ICMP协议、以及寻址ARP协议。
ICMP协议和ARP协议
PING程序实现的协议是ICMP,这个协议处于IP层,格式如下:
PING命令无非是往ICMP中填写适当的数据,然后交给下层的IP层来发送数据。
看起来这个ICMP和常用的TCP协议一样,都实现在IP层的基础上。 不过ICMP属于第3层,实际属于IP协议的一部分。
不过在数据包发出去之前,需要知道目标设备的物理地址。 这是由于在IP层的下面一层是链路层,需要提供源设备的物理地址和目的设备的物理地址。目前来说,我们只知道目的设备的IP,源设备也就是自己的IP和物理地址。 这就涉及到另外一个问题,如何通过目的设备的IP得到目的设备的物理地址信息。
为此,TCP/IP协议提供了ARP协议专门负责进行物理地址寻址。ARP协议的报文定义如下:
由于ARP也属于第3层,使用链路层发送数据包,需要提供目的设备和源设备的物理地址,其实就是链路层的信息头。 看起来比较矛盾,因为我们就是不知道目的设备的物理地址才会请求ARP进行物理地址寻址的。
为此,TCP/IP对第二层链路层提供了2个特殊的地址:全0x00和全0xFF的物理地址,分别表示源设备物理地址未知和目的设备物理地址未知。
ARP寻址
当ARP发送寻址请求时,目的设备的物理地址全部为0xFF,代表着目的物理地址未知,这种情况下,我们称这个数据包为广播数据包。为了和IP层定义的广播区别,称为2层广播。
有了广播,那些收到广播的设备就可以对这个ARP请求进行相应了。 为此,接收设备会将数据包拆包,提取ARP协议中的目标IP与本设备的IP进行匹配。匹配成功则认为请求的是自己的物理地址,不成功则忽略。
被请求的设备会将自己的物理地址放入ARP反馈数据包以及链路层信息头中,这样,ARP的反馈就会直接发送到请求的设备上,而不是广播。
请求者收到ARP回复后,将ARP协议中的物理地址信息提取后进行缓存。
当然,在被请求的设备收到请求者的ARP请求时,同样也会将请求者的物理地址信息缓存起来的。
一旦上述过程结束,使用arp -a命令就可以查询到缓存信息的更新。
上述的过程实际上忽略了当请求者和被请求者不在同一个网段下的情况。 不过即使不在同一网段,整个过程也只是上面描述过程的重复。
例如设备A通过路由器R请求设备B的物理地址。
设备A首先会请求路由器R的物理地址,用的是第二层广播
然后路由器R再请求设备B,用的也是第二层广播。
路由寻址
上面讨论跨网段进行ARP寻址时忽略了设备A是如何知道必须通过路由器R去寻址设备B的。
网络上的设备一般都会需要一个所谓的路由表,可以认为这个表就是一个网络地图。不过这个地图一般情况下只能知道它身边的其他设备的地址信息。使用“route "命令可以查看设备的路由表。
从route命令的输出可以看到,只是一些目的设备的IP地址信息或者目标网段的IP地址范围信息。 它的作用是:查看即将发送的数据包中的目的IP地址信息,根据路由表,将它从指定的接口上发送出去。
上面ARP寻址时,由于请求设备和被请求设备的IP不在同一个网段下。这时候,请求设备需要查看自己的路由表,希望能够找到相关信息。结果是,请求设备得出只能将这个ARP请求先发送到路由表中指定的R路由上再说。至于R路由如何找到被请求的设备B,那是R路由的问题了。
R路由收到数据包后,会进行拆包,得到目的设备的IP地址信息,然后查询自己的路由表。可能目的设备的IP地址和路由器一个网段,也有可能需要下一个路由再次转发。
结论:
获取目标设备的MAC地址时使用的是二层广播,和IP地址是否为同一个网段并没有任何关系。
一旦得到了目标设备的MAC地址,有可能就在本地的arp缓存中。就能进行数据链路层之间的通信了。
因此,网关和IP地址不在同一个网段下是没有问题的。
使用过程中ICMP和ARP还涉及其他的概念
1、本地广播、定向广播、二层广播
本地广播: IP地址为255.255.255.255
定向广播:IP地址的主机号部分为全1,
二层广播:物理地址全为1
2、泛洪
常见的包括:MAC泛洪、网络泛洪、SYN泛洪和应用程序泛洪。
MAC泛洪
发生在第二层,攻击者进入LAN,发送假冒的源MAC地址和目的MAC地址到以太网交换机上,导致交换机的内容可寻址存储器(CAM)溢出,失去交换功能。用于像在共享式以太网上对某些帧进行嗅探。
网络泛洪Smurf
smurf发生在第3层,攻击者假冒ICMP广播PING。如果路由器没有关闭定向广播,也可以使用定向广播。响应的主机越多,造成链路流量过大。
网络泛洪DDos
发生在第3层和第4层,攻击者使用大量代理对某个IP地址发送大量假冒的网络流量,然后受到攻击的网络将被这些假的流量所占据无法提供正常的服务。
TCP SYN泛洪
发生在第4层,利用TCP握手协议。攻击者发送TCP SYN数据包,当服务器返回地二次握手ACK+SYN时,攻击者不回应。那么服务器的这个TCP连接处于SYN_RECV状态,同时会重复发送ACK+SYN给攻击者。 一旦攻击者发送大量的SYN包,服务器会被大量的这种TCP连接占用,每一个都无法完成三次握手,同时还要执行连接的超时重发。这样造成了服务器消耗CPU和内存资源。
应用层泛洪
发生在第7层,目的是消耗应用程序或系统资源。比较常见的是垃圾邮件,在TCP连接完成后,在服务器提示输入密码 的时候停止响应。
3、ICMP重定向
这个概念网上的介绍很多,只要记住为什么要重定向:当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。(路由器也会把初始数据包向他的目的地转发)。
例如wireshark抓包:
172.20.101.253发送的ICMP请求,返回的ICMP标记为Redirect类型。
不过奇怪的是ICMP回复包中居然还包括当初发给102.24的ICMP请求包。。。
不管如何,当主机收到这样的重定向请求,可以响应或者不响应。例如Linux系统可能会:route add -host xxx.xxx.xxx.xxx dev eth0.
当然,也可以不进行响应。echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
4、ICMP造成的安全漏洞
上面提到的网络泛洪smurf,攻击者可以利用ICMP广播,造成大量主机响应,使网络阻塞。
另外,使用PING命令可以让攻击者进行网络扫描,因此许多防火墙会屏蔽ICMP的回应。
根据ICMP的应答可以区分主机的操作系统是微软还是UNIX
重定向可以被攻击者利用,攻击者可以向用户的主机发送重定向报文,这样就可以修改用户的路由表,从而导致Dos攻击。
其他。。。