一台pc A(192.168.1.2),想和另外一台pc B(192.168.1.3)通讯,pc A对本身所在局域网络内的全部主机,也包括路由器的接口喊(发送ARP查询信息):ip地址是192.168.1.3的pc的mac地址是多少,请告诉我。pc B听到了,告诉pc A我是,并把本身的IP地址和mac地址,一块儿发送给了pc A。ios
ping使用的是icmp协议,这个协议的报文里必须有对方的mac地址,可是当第一次ping一个ip地址时,因为不知道对方的mac地址,因此须要发送一个arp广播,也就是arp协议的报文,到mac为FFFFFFFFFFFF的广播地址。c++
在ios里第一次ping(R1的f0/0上的ip地址是192.168.1.1/24)一个ip地址的结果以下:shell
R1#ping 192.168.1.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds: .!!!! Success rate is 80 percent (4/5), round-trip min/avg/max = 40/72/92 ms
发现有1个点4个叹号,第一点就是表明发送的arp广播,从而得知了对方的mac地址,因此后面4次使用icpm协议和对方通讯就成功了。第一次是用arp协议和对方通讯的,不是用icmp协议通讯的。微信
ping一下,是要跟对方沟通5次,一来一回算1次通讯,因此就应该有10次通讯。用抓包工具查看ping一下的结果网络
发现前2次不是ICMP协议通讯,前面说过,ping使用的协议是ICMP,前2次为何不是ICMP呢?由于第一次ping,不知道对方的mac,因此要先用ARP报文,找到对方的mac地址。ide
ARP的request报文的head:工具
head里有:学习
ARP的request报文的body:网站
body里有:代理
ARP的response报文的head:
Source就是应答方的mac地址
ARP的response报文的body:
Opcode:reply(2)。标识出是应答报文。
执行ping 192.168.1.2前,查看路由器1和2的arp映射表。
在路由器1,执行ping路由器2的一个接口上的IP地址前,路由器1的arp映射表:
R1#show arp Protocol Address Age (min) Hardware Addr Type Interface Internet 192.168.1.1 - cc01.44f0.0000 ARPA FastEthernet0/0
在路由器1,执行ping路由器2的一个接口上的IP地址前,路由器2的arp映射表:
R2#show arp Protocol Address Age (min) Hardware Addr Type Interface Internet 192.168.1.2 - cc02.5574.0000 ARPA FastEthernet0/0
执行ping 192.168.1.2后,查看路由器1和2的arp映射表。
路由器1的arp映射表:
R1#show arp Protocol Address Age (min) Hardware Addr Type Interface Internet 192.168.1.1 - cc01.44f0.0000 ARPA FastEthernet0/0 Internet 192.168.1.2 0 cc02.5574.0000 ARPA FastEthernet0/0
路由器2的arp映射表:
R2#show arp Protocol Address Age (min) Hardware Addr Type Interface Internet 192.168.1.1 0 cc01.44f0.0000 ARPA FastEthernet0/0 Internet 192.168.1.2 - cc02.5574.0000 ARPA FastEthernet0/0
清空arp映射表:clear arp-cache
路由器上的arp映射表的生命周期大概是4个小时。
ping的主机和本身不在一个局域网,发送的广播它就接收不到,怎么办?
PC也好,路由器也好,当要请求一个目的地的mac和本身,不在同一个广播域下的时候:
当路由器没有指定下一跳,或者PC没有指定网关的时候,就有可能产生代理ARP。
路由器R1,添加了一条静态路由,指定了出接口,但没有指定下一跳
R1#show ip route C 192.168.1.0/24 is directly connected, FastEthernet0/0 S 192.168.2.0/24 is directly connected, FastEthernet0/0
当ping 192.168.2.1(和本身不在同一个网络),能够ping通,而后查看arp映射表:
R1#show arp Protocol Address Age (min) Hardware Addr Type Interface Internet 192.168.1.1 - cc01.44f0.0000 ARPA FastEthernet0/0 Internet 192.168.2.1 0 cc02.5574.0000 ARPA FastEthernet0/0 Internet 192.168.1.2 197 cc02.5574.0000 ARPA FastEthernet0/0
发现添加了192.168.2.1条目,但mac不是192.168.2.1的mac,而是出接口R2 f0/0(192.168.1.2)的mac地址。因为只有出接口有能力到达目的地,因此当出接口接到了ARP请求后,就把本身的mac地址,返回给源了,因此源端把返回的mac,加到了本身的arp映射表了,其实这就是ARP欺骗。因此说明,出接口(192.168.1.2)就是代理ARP。
而后,再ping 192.168.2.2(和本身不在同一个网络),能够ping通,而后查看arp映射表:
R1#show arp Protocol Address Age (min) Hardware Addr Type Interface Internet 192.168.2.2 0 cc02.5574.0000 ARPA FastEthernet0/0 Internet 192.168.1.1 - cc01.44f0.0000 ARPA FastEthernet0/0 Internet 192.168.2.1 0 cc02.5574.0000 ARPA FastEthernet0/0 Internet 192.168.1.2 197 cc02.5574.0000 ARPA FastEthernet0/0
发现添加了192.168.2.2条目,但mac不是192.168.2.2的mac,而是出接口R2 f0/0(192.168.1.2)的mac地址。因为只有出接口有能力到达目的地,因此当出接口接到了ARP请求后,就把本身的mac地址,返回给源了,因此源端把返回的mac,加到了本身的arp映射表了,其实这就是ARP欺骗。因此再次说明,出接口(192.168.1.2)就是代理ARP。
因此咱们发现了代理ARP的弊端(因为没有指定下一跳而产生的弊端):会产生不少arp条目,占系统的内存,效率下降。
若是指定了下一跳,则arp映射表里,只须要有下一跳的条目就足够了。
接口的代理ARP功能,打开了,在没有下一跳的时候,它就代理了,查看mac映射表,发现ping一个ip地址就多了一个条目,并且条目的mac地址不少都是打开ARP代理功能的接口的mac地址。
因为cisco路由器,接口的代理ARP功能,默认是开启的。
关闭R2的f0/0的ARP代理功能:no ip proxy-arp
后,就没法再ping通了。
R2(config)#int f0/0 R2(config-if)#no ip proxy-arp
下图,从R7要访问R11,指定下一跳的话,应该指定到R8的f0/0,这条路径最短。但若是没有指定下一跳,R8的f0/0和R9的f1/0都是代理ARP,都会给R11返回ARP响应,那么R7使用哪一个呢?后到ARP响应会覆盖先到的,因此R11有可能使用的是R9给的ARP响应。但R9要多一跳才能到达R11,因此这也是代理ARP的弊端。
ARP攻击症状:局域网的不少病毒都利用ARP协议攻击(window用arp -a能够查看arp表)。病毒特征是,断网,重启后又能够上网了,一会又断了。
攻击原理:pc A要想连外网必须经过网关,pc A知道网关的ip地址,可是不知道网关的mac地址,因此pc A发广播问局域网内的全部主机,这时有一台主机pc B中了ARP病毒,因为是广播,pc B接到了pc A的问询,这时pc B强先回答pc A(在网关pc A以前),告诉pc A一个不存在的mac地址。pc A拿到了不存在的mac地址,向这个不存在的mac地址发送数据后,交换机就蒙了,发现没有这个mac地址,交换机就不知道该发给谁了,因此交换机就drop这个请求了,因此致使pc A没法上网了。arp表是过一段时间就动态更新的,因此过一段时间又能上网了,如此反复。
ARP欺骗(挂马):和arp攻击相似,上面的pc B强先回答pc A(在网关回答pc A以前),告诉pc A一个假的mac地址,这个mac地址就是pc B本身,pc A接到假的mac地址(pc B的mac地址)后,发送的信息就,直接跑到pc B那里了,这时pc B就可以记录下pc A浏览的网站等私密信息,而后pc B知道网关的mac地址,它把pc A的请求又转发了出去,外面的server收到了pc A信息后,把回复信息发了回来,server的回复信息,网关,网关又转给了pc B,pc B这时就能够在server回的网页上,植入各类病毒,而后把带病毒的网页发给pc A,而后pc A在有病毒的网页上输入了密码后,想把信息发给server,惋惜的是:这个密码信息又先到了pc B,黑客就得到了pc A上用户的密码了。
如何解决ARP攻击:双向静态绑定。
pc端静态绑定网关/下一跳的mac地址;网关/路由器静态绑定因此交换机上的pc端的mac地址。
原理:静态的mac地址,优先级高于动态的,因此即使动态获得的mac是错的,发现有静态的绑定,优先使用静态的。
静态绑定mac地址命令:
R4(config)#arp 192.168.1.3 0005.0002.adef arpa R4(config)#do show arp Protocol Address Age (min) Hardware Addr Type Interface Internet 192.168.1.3 - 0005.0002.adef ARPA Internet 192.168.2.1 121 cc05.4bf8.0010 ARPA FastEthernet0/0
静态绑定mac地址命令的帮助:
R4(config)#arp 192.168.1.3 0005.0002.adef ? arpa ARP type ARPA sap ARP type SAP (HP's ARP type) smds ARP type SMDS snap ARP type SNAP (FDDI and TokenRing) srp-a ARP type SRP (side A) srp-b ARP type SRP (side B)