使用tcpdump观察ARP通信过程
前言
本篇文章为笔者的读书笔记,未经允许请勿转载。如果对你有帮助记得点个赞(●’◡’●)
本次实验是linux高性能服务器编程的第一个实验,目的在于了解ARP的运作过程
实验测试机是阿里云ECS服务器和本地虚拟机。不同于书本上,它的测试机是在同一局域网内。
开启服务机的echo服务
首先查看是否支持echo服务。/etc目录是Linux的配置目录,底下包含各种配置文件。这里的**/etc/service**文件记录了主机上可能用到的服务及常用端口号。
root@iZwz9e2t1qu6rzggq3tc0dZ:~# cat /etc/services | grep echo
echo 7/tcp
echo 7/udp
echo 4/ddp # AppleTalk Echo Protocol
grep查找包含某字符串的行,前2行即echo服务,同时支持TCP和UDP。但是要查看系统上是否有该服务,得确认是否在对应端口上有监听套接字,因此用netstat命令,-l选项即listening,处于LISTEN(监听)状态的套接字,默认只会显示已连接的套接字。
root@iZwz9e2t1qu6rzggq3tc0dZ:~# netstat -l|grep echo
root@iZwz9e2t1qu6rzggq3tc0dZ:~#
可以看到没有echo进程监听,需要手动开启!
1. 安装openbsd-inetd
apt-get install openbsd-inetd
2. 打开/etc/initd.conf文件,按照注释中的示例添加echo服务
root@iZwz9e2t1qu6rzggq3tc0dZ:/# chmod u+w /etc/inetd.conf
root@iZwz9e2t1qu6rzggq3tc0dZ:/# vim /etc/inetd.conf
# /etc/inetd.conf: see inetd(8) for further informations.
#
# Internet superserver configuration database
#
#
# Lines starting with "#:LABEL:" or "#<off>#" should not
# be changed unless you know what you are doing!
#
# If you want to disable an entry so it isn't touched during
# package updates just comment it out with a single '#' character.
#
# Packages should modify this file by using update-inetd(8)
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
#:INTERNAL: Internal services
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#time stream tcp nowait root internal
echo stream tcp nowait root internal
#:STANDARD: These are standard services.
3.安装xinetd
apt-get install xinetd
4.配置echo文件,将disable由yes改为no
root@iZwz9e2t1qu6rzggq3tc0dZ:/# vim /etc/xinetd.d/echo
# default: off
# description: An xinetd internal service which echo's characters back to
# clients.
# This is the tcp version.
service echo
{
disable = no
type = INTERNAL
id = echo-stream
socket_type = stream
protocol = tcp
user = root
wait = no
}
# This is the udp version.
service echo
{
disable = no
type = INTERNAL
id = echo-dgram
socket_type = dgram
protocol = udp
user = root
wait = yes
}
5.重启xinetd
/etc/init.d/xinetd restart
再次检查,可以发现echo服务已经开启
root@iZwz9e2t1qu6rzggq3tc0dZ:/# netstat -l|grep echo
tcp6 0 0 [::]:echo [::]:* LISTEN
root@iZwz9e2t1qu6rzggq3tc0dZ:/#
由于是阿里云服务器,不光系统要配置,安全组也要去配置
到目前位置服务器echo服务已经打开,本地虚拟机的打开方式除了最后一步其他都一样。
需要注意的是虚拟机的网络尽量选择桥接模式,这样可以节省时间。
实验开始
-
在虚拟机上开启两个终端,一个监听一个测试
在执行telnet命令前,先清除ARP缓存中与路由器对应的项,否则ARP通信不被执行,我们就无法抓取到期望的以太网帧。 -
测试终端
root@ubuntu:/home/marvel# arp -a
? (192.168.1.1) 位于 24:58:6e:5a:dd:78 [ether] 在 ens33
? (192.168.1.6) 位于 b0:fc:36:59:13:bf [ether] 在 ens33
root@ubuntu:/home/marvel# arp -d 192.168.1.1 //192.168.1.1是路由器的ip地址后面是对应的mac地址
清理缓存后打开监听端tcpdump,步骤要快点否则会被其他无用信息干扰
- 监听终端
marvel@ubuntu:~$ sudo tcpdump arp -ent
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
-e选项开启以太网帧头部信息的显示,-n选项使用IP地址(而非主机名)代表主机,-t选项关闭时间戳的显示。
后用telnet 连接服务器echo服务
- 测试终端
root@ubuntu:/home/marvel# telnet 120.79.72.214 7
Trying 120.79.72.214...
Connected to 120.79.72.214.
Escape character is '^]'.
^]
telnet> q
Connection closed.
tcpdump抓取到的众多数据包中,只有最靠前的两个和ARP通信有关系:如下
marvel@ubuntu:~$ sudo tcpdump arp -ent
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
00:0c:29:1a:09:94 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.168.1.1 tell 192.168.1.7, length 28
24:58:6e:5a:dd:78 > 00:0c:29:1a:09:94, ethertype ARP (0x0806), length 60: Reply 192.168.1.1 is-at 24:58:6e:5a:dd:78, length 46
^C
2 packets captured
3 packets received by filter
0 packets dropped by kernel
marvel@ubuntu:~$
第一个数据包中,ARP通信的源端物理地址是00:0c:29:1a:09:94(虚拟机),目的端的物理地址是ff:ff:ff:ff:ff:ff,这是以太网的广播地址,用以表示整个LAN。该LAN上的所有机器都会收到并处理这样的帧。数值0x806是以太网帧头部的类型字段的值,它表示分用目标是ARP模块。该以太网帧的长度为42字节(实际上是46字节,tcpdump没有统计以太网帧尾部4字节的CRC字段),其中数据部分为28字节,由于以太网头部是14字节,所以前一个length比后一个length大14。。“Request”表示这是一个ARP请求,“who-has 192.168.1.1 tell 192.168.1.7”表示虚拟机要查询服务器的ip地址,因为所访问的远程主机并不在局域网内,所以找到的ip地址为路由器地址,由路由器来完成后续寻址。
第二个数据包中,ARP通信的源端物理地址是24:58:6e:5a:dd:78(路由器),目的端的物理地址是00:0c:29:1a:09:94(虚拟机),“Reply”表示这是一个ARP应答,“192.168.1.1 is-at 24:58:6e:5a:dd:78”表示路由器报告其物理地址。该以太网帧的长度为60字节(实际上是64字节)。
原理图
ARP工作原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。
此次实验原理图如下
说明一下
ARP请求和应答是从以太网驱动程序发出的,而不是从ARP直接发出