1.5.3 使用tcpdump观察ARP通信过程

本文介绍了如何在阿里云ECS服务器上开启echo服务,通过安装openbsd-inetd和xinetd,编辑配置文件并重启服务。然后在本地虚拟机上清除ARP缓存并使用tcpdump抓包工具观察ARP通信过程,解析了ARP请求和应答的数据包。实验展示了ARP的工作原理,即主机通过广播请求获取目标IP的物理地址。
摘要由CSDN通过智能技术生成

使用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直接发出

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值