前几天将pppoe协议看完,但仅仅停留在概念的理解上,至于Adsl通过PPPoE如何实现与Adsl server的认证则需要通过实验来加深了解。
   PPPoE大致原理如下: 
   1. PPPoE的验证过程是由用户计算机的PADI(PPPoE Active Discovery Initiation)数据包开始的,PADI广播发送,它的作用是询问网络上有没有提供服务的PPPoE验证服务器,服务器会以一个单播发送的PADO(PPPoE Active Discovery Offer)做为回应,之后两者之间的所有数据包都是单播发送的。
   2.如果网络上存在多台验证服务器,用户计算机会与最先收到的PADO所对应的服务器进行后续的验证过程,而不再向其它服务器发送任何数据。
   3.验证过程中,计算机会在一个数据包中以明文发送用户名和密码,因为是单播发送,所以只有验证服务器会收到。
   4.验证成功后,用户就可以正常上网了。验证服务器会定时向用户发送Echo-Request数据包,用户则会回应一个Echo-Reply数据包,它们的作用是测试连接是否正常,如果服务器多次没有收到用户的Echo-Request,就认为用户已经失去响应,并断开连接。

    实战准备工作:
   1.NIC MAC地址:00-01-6C-AD-6E-C5
   2.Huawei Adsl line指示灯工作正常。
   3.server 是Huawei 的 5200,yn-qj-ma5200-3
   4.sniffer选用Wiresharp Version 0.99.6a (SVN Rev 22276)
一、当选用错误的密码登录时,wiresharp抓取到的报文:
 
可以看出Adsl与服务器端同步后,即以广播方式不间断地发送PADI数据报,询问是否存有PPPOE验证服务器。最近的一个服务器Huaweite_14(当前只有一个)收到该广播后,发出PADO数据报,NIC收到该数据报后,向服务器发出PADR请求,服务器响应之PADS。然后即进入用户名密码验证阶段,从图中可看出,在第15数据报中,用户名与密码是明文传输的(密码为123456)。当用户名密码错误时,服务器会首先向用户端发出PADT数据报,用户响应之PADT,最后服务器端以PADT确认,共需要三个数据报来拆除链接。至于中间密码验证过程,wiresharp将数据报识别为arp协议,估计有误。
二、当选用正确的用户名与密码登录时,抓的报文如下:

建立初期,仍然要经过四个阶段:PADI,PADO,PADR,PADS,然后再对用户名与密码进行验证(用户名与密码以明文传输),由于是用户端主动断开连接,因此,只是由用户端发一个数据报PADT来结束连接。只是在该验证过程中,涉及到相当多的ARP协议与IGMP协议传输,不知为何?
PPPOE的初始化过程
PPPOE的初始化过程是至关重要的,它不仅要在广播式的网络上确定一对一的逻辑关系,而且还要为PPPOE的会话阶段准备一些必要条件,如访问集中器唯一分配的会话IDSession ID)。在介绍PPPOE的发现阶段之前,首先让我们重温一下以太网帧的封装格式,前面也介绍过了,所有的PPPOE的数据报文均是被封装在以太网的数据域(净载荷区)中传送的。

1.1.1   以太网的帧格式

以太网的帧格式对于大多数人来说是并不陌生,而且目前大多数的网络中都在使用以太网2.0版,因此EthernetII就被作为一种事实上的工业标准而广泛使用,如果对以太网不太熟悉或想深入了解的读者,可参考相关局域网技术方面的书籍。下图为以太网的帧格式:(图略)
 
Ÿ  以太网目的地址(目的MAC地址)和以太网源地址(源MAC地址),是我们大家最为熟悉的数据链路层地址。它包括单播地址、多播地址和广播地址,而对于PPPOE协议中要使用到单播地址和广播地址。在PPP的培训教材中也提到了,对于PPP这样的数据链路层协议而言,二层地址通信双方之间已失去了原有的意义。
Ÿ  以太网的类型域也是我们最关心的一个字段,它在1997年以前还一直由施乐公司维护,但后来就交由IEEE802小组维护了。通过这个字段的内容,数据包的接收方可以识别以太网的数据域中承载的是什么协议的数据报文。对于PPPOE的两大阶段,也正是通过以太网的类型域进行区分的。在PPPOE的发现阶段时,以太网的类型域填充0x8863;而在PPPOE的会话阶段时,以太网的类型域填充为0x8864
Ÿ  数据域(净载荷)主要是用来承载类型域中所指示的数据报文,在PPPOE协议中所有的PPPOE数据报文就是被封装在这个域中被传送。
Ÿ  校验域,主要用来保证链路层数据帧传送的正确性。

1.1.2  PPPOE的数据报文格式

描述完了以太网的帧格式后,我们简要介绍一下PPPOE的数据报文格式。PPPOE的数据报文是被封装在以太网帧的数据域内的。简单来说我们可能把PPPOE报文分成两大块,(虽然这样比较笼统,但还是比较好助于理解),一大块是PPPOE的数据报头,另一块则是PPPOE的净载荷(数据域),对于PPPOE报文数据域中的内容会随着会话过程的进行而不断改变。下图为PPPOE的报文的格式:(图略)
Ÿ  PPPOE数据报文最开始的4位为版本域,协议中给出了明确的规定,这个域的内容填充0x01
Ÿ  紧接在版本域后的4位是类型域,协议中同样规定,这个域的内容填充为0x01
Ÿ  代码域占用1个字节,对于PPPOE 的不同阶段这个域内的内容也是不一样的,在这里没有用表格的形式将所有代码列出,但在后续章节会给出一些代码与数据报文的对照。
Ÿ  会话ID点用2个字节,当访问集中器还未分配唯一的会话ID给用户主机的话,则该域内的内容必须填充为0x0000,一旦主机获取了会话ID后,那么在后续的所有报文中该域必须填充那个唯一的会话ID值。
Ÿ  长度域为2个字节,用来指示PPPOE数据报文中净载荷的长度。
Ÿ  数据域,有时也称之为净载荷域,在PPPOE的不同阶段该域内的数据内容会有很大的不同。在PPPOE的发现阶段时,该域内会填充一些Tag(标记);而在PPPOE的会话阶段,该域则携带的是PPP的报文。

1.1.3  PPPOE发现阶段的数据报文

PPPOE的发现阶段可分为四步,其实这个过程也是PPPOE四种数据报文的交换的一个过程。当完成这四步后,用户主机与访问集中器双方就能获知对方的MAC地址和唯一的会话ID号,从而进入到下一个阶段(PPPOE的会话阶段)。实际上双方在互相知道了对方的MAC地址后,就已经在广播式的网络上确定了一一的对应关系,为了保证这个连接的有效性,同时使PPPOE协议能更加灵活的运用,因此还加入了会话ID字段,通过这两个条件就可完成确定双方点对点的关系。
在这个阶段一开始,由于接入用户并不知道访问集中器的MAC地址,则使用类似于ARP解析的过程的机制来获取访问集中器的MAC地址。首先由接入用户侧发起一个初始化的广播报文,对于访问集中器如果配置了PPPOE的业务时,它会时实检测网络上的数据包,当发现以太网数据帧中所承载的是PPPOE报文时(通过协议域的内容来区分),就会将其交给相应的模块去处理。当收到初始化报文后,访问集中器会向该用户回应一个报文。如果网络上存在很多这样的访问集中器且都收到了用户侧发送的初始化报文时,它们也都会向用户侧会送一个确认报文,如果该用户收到这个报文后,则会依据报文中所携带的内容或本端的一些配置来选择一个唯一的访问集中器进行会话。到此时已完成了前两步了,那么剩下的两步则是协商一些所提供的服务选项和获取PPPOE会话阶段所必须的会话ID值。
在这个阶段,前面在讲述以太网帧格式时也特别强调了,所有数据报文是被承载在以太网的数据域中的,而且以太网数据帧的协议域始终为0x8863
下面我们结合具体的数据报文的内容,来具体的讲解这四步的过程。

2.1.3.1 PPPOE数据报文中Tag(标记)的格式

对于发现阶段的PPPOE数据报文而言,它的净载荷可能包含零个或多个Tag(标记),实际上这些标记的意义非常类似于PPP配置参数选项,它同样也是要经过协商的。对于PPPOE协议而言,没有像PPP的配置参数选项那样定义了很多细节,而只是一个初略的定义,因此在实际当中实现这个过程会依据不同厂商的设备有不同。首先还是让我们看一下承载在PPPOE报文数据域中的标记封装格式:(图略)
 
从上图中可以看出,标记的封装格式采用的是大家所熟知的TLV结构,也即是(类型+长度+数据)。
标记的类型域为2个字节,下表列出了各种标记类型的含义:
 
标记类型
标记说明
0x0000
表示PPPOE报文数据域中一串标记的结束,为了保证版本的兼容性而保留,在有些报文中有应用。
0x0101
服务名,主要用来表明网络侧所能提供给用户的一些服务。
0x0102
访问集中器名,当用户侧接收到了AC的回应的PADO报文时,就可获从所携带的标记中获知访问集中器的名子,而且还可以据此来选择相应的访问集中器。
0x0103
主机唯一标识,类似于PPP数据报文中的标识域,主要是用来匹配发送和接收端的,因为对于广播式的网络中会同时存在很多个PPPOE的数据报文。
0x0104
AC-Cookies,主要被用来防止恶意性DOS功击。
0x0105
销售商的标识符。
0x0110
中继会话ID,对于PPPOE的数据报文也同样可以像DHCP报文一样被中断到另外的AC上终结,这个字段则是用来维护另一个连接的。
0x0201
服务名错误,当请求的服务名不被对端所接受时,会在响应的报文中携带这个标记。
0x0202
访问集中器名出错。
0x0203
一般性错误。
 
Ÿ  标记的长度域为2个字节,它用来指明标记数据域的长度。
Ÿ  标记的数据域中用来放置不同类型标记所对应的相关数据。

2.1.3.2 PADIPPPOE Active Discovery Initiation)报文

PPPOE发现阶段的第一步,也即是由用户侧首先发送这样一个报文。用户主机是以广播的方式发送这个报文,所以该报文所对应的以太网帧的目的地址域应填充为全1,而源地址域填充用户主机的MAC地址。广播包可能会被多个访问集中器接收到,后面会讲到对于接收到PADI报文的访问集中器会使用PADO报文来回应用户主机。
我们来看一下PADI报文中几个域的填充情况,前面已强调过版本域和类型域固定填充0x01,因为两个域各占4位,所以合并为1个字节后应为0x11PADI报文的代码域填充0x09,会话ID填充0x0000PADI报文必须含一个由用户侧请求的正确服务名标记,当然还可能携带一些其它的标记,而一个完整的PADI报文(包括PPPOE头)不能超过1484个字节,以便能留下足够的空间给中继代理增加一个中继的会话ID标记。
1PADI 数据报文
这个报文中包括两个标记:一个是主机的只唯一标识,另一个则是服务名标记,从上面这个报文中可以看出服务名没有具体实际的内容,说明对于用户主机可以接受任何由访问集中器所提供的服务。

2.1.3.3 PADOPPPOE Active Discovery Offer)报文

PPPOE发现阶段的第二步,也即是由访问集中器回应各用户主机发送的PADI报文,此时该报文所对应的以太网帧的源地址填充访问集中器的MAC地址,而目的地址则填充从PADI中所获取的用户主机的MAC地址。
我们来看一下PADO报文几个域的填充情况,版本域和类型域不变固定填充0x01,代码域填充0x07,会话ID填充0x0000PADO报文中必须包含一个访问集中器名这个标记,同时还要包含对PADI报文中服务名标记的确认标记和对其它标记的一些确认标记。这个过程有点类似于PPP协议中链路建立过程中的Config-Ack报文,当然如果用户主机所申请的服务访问集中器不支持的话,则访问集中器就不会回应PADO报文。
2PADO 数据报文
这个报文中包括4个标记,在PADI所提供的标记的基础上又增加了两个标记,一个是访问集中器名,下划线部分即表示访问集中器名(MD5500),而且还包含一个标记结束标记。

2.1.3.4 PADRPPPOE Active Discovery Request)报文

PPPOE发现阶段的第三步,也即是由用户主机向访问服务器发送单播的请求报文。当用户主机收到PADO报文后,会从这些报文中挑选一个访问集中器作为后续会话的对象。由于用户主机在收到PADO报文后,就获知了访问集中器的MAC地址,因此PADR报文所以应的以太网帧的源地址填充用户主机的MAC地址,而以太网的目的地址填充为访问集中器的MAC地址。
我们来看一下PADR报文几个域的填充情况,版本域和类型域不变固定填充0x01,代码域填充0x19,会话ID域填充0x0000。此时PADR报文必须准确地包含一个服务名的标记,指示用户主机申请的服务和其它的标记类型。
3PADR 数据报文
 
当收到访问集中器的PADO报文后,用户主机会发送PADR报文,该报文所含的标记域与PADI报文中的一致,但些时用户主机已获知了访问集中器名。

2.1.3.5 PADSPPPOE Active Discovery Session-confirmation)报文

PPPOE发现阶段的第四步,也即是最后一步,此时访问集中器当收到PADR报文时,就准备进入开始一个PPP的会话了,而此时访问集中器会为在这个会话分配一个唯一的会话进程ID,并在发送给主机的PADS报文中携带上这个会话ID。当然如果访问集中器不满足用户所申请的服务的话,则会向用户发送一个PADS报文,而其中携带一个服务名错误的标记,而且此时该PADS报文中的会话ID填充0x0000
我们来看一下PADS报文几个域的填充情况,版本域和类型域不变固定填充0x01,代码域填充0x65,会话ID必须设为给这个PPPOE进程所分配的唯一值。
4PADS 数据报文
其中下划线部分为访问集中器给这个PPPOE会话分配的唯一会话ID

2.1.3.6 PADTPPPOE Active Discovery Terminate)报文

PADT报文可能在会话进行开始之后的任意时间内被发送,主要是用来终止一个PPPOE会话的止。它可以由主机或访问集中器发送,目的地址填充为对端的以太网的MAC地址
我们来看一下PADT报文几个域的填充情况,版本域和类型域不变固定填充0x01,代码域填充0xA7,会话ID是那个需要被终止的进程,报文中不需要携带任何标记。当收到PADT的时候,不允许再使用当前这个进程发送PPP数据流量。在收到或发送PADT后甚至正常的PPP终止报文也不能被发送。
5PADT 数据报文
这个报文中不含有任何标记,而且下划线部分为所需终止的会话进行ID