1.1 PPPoE简介
PPPoE(PPP over Ethernet)协议是一种把PPP帧封装到以太网帧中的链路层协议。PPPoE可以使以太网网络中的多台主机连接到远端的宽带接入服务器。
运营商希望把一个站点上的多台主机连接到同一台远程接入设备,同时接入设备能够提供与拨号上网类似的访问控制和计费功能。在众多的接入技术中,把多个主机连接到接入设备的最经济的方法就是以太网,而PPP协议可以提供良好的访问控制和计费功能,于是产生了在以太网上传输PPP报文的技术,即PPPoE。
PPPoE利用以太网将大量主机组成网络,通过一个远端接入设备连入因特网,并运用PPP协议对接入的每个主机进行控制,具有适用范围广、安全性高、计费方便的特点。
1.2 PPPoE的工作原理
PPPoE拨号可分为三个阶段,即Discovery阶段、Session阶段和Terminate阶段。
Discovery阶段:Discovery阶段由四个过程组成
- PPPoE Client广播发送一个PADI(PPPoE Active Discovery Initial)报文,在此报文中包含PPPoE Client想要得到的服务类型信息。
- 所有的PPPoE Server收到PADI报文之后,将其中请求的服务与自己能够提供的服务进行比较,如果可以提供,则单播回复一个PADO(PPPoE Active Discovery Offer)报文。
- 根据网络的拓扑结构,PPPoE Client可能收到多个PPPoE Server发送的PADO报文,PPPoE Client选择最先收到到PADO报文对应的PPPoE Server作为自己的PPPoE Server,并单播发送一个PADR(PPPoE Active Discovery Request)报文。
- PPPoE Server产生一个唯一的会话ID(Session ID),标识和PPPoE Client的这个会话,通过发送一个PADS(PPPoE Active Discovery Session-confirmation)报文把会话ID发送给PPPoE Client,会话建立成功后便进入PPPoE Session阶段。
完成之后通信双方都会知道PPPoE的Session-ID以及对方的以太网地址,它们共同确定了唯一的PPPoE Session。
Session阶段
分为两部分,一是PPP协商阶段、二是PPP数据传输阶段,PPPoE Session上的PPP协商和普通的PPP协商方式一致,分为LCP、认证、NCP三个阶段。
- LCP阶段主要完成建立、配置和检测数据链路连接
- LCP协商成功后,PPP进入NCP阶段,NCP是一个协议族,用于配置不同的网络层协议,常用的是IP控制协议(IPCP),它主要负责协商用户的IP地址和DNS服务器地址。
PPPoE Session的PPP协商完成后,就可以承载PPP数据报文
在PPPoE Session阶段所有的以太网数据包都是单播发送的
Terminate阶段
PPP通信双方都可以使用PPP协议自身来结束PPPoE会话,当无法使用PPP协议结束会话时可以使用PADT(PPPoE Active Discovery Terminate)报文。
进入PPPoE Session阶段后,PPPoE Client和PPPoE Server都可以通过发送PADT报文的方式来结束PPPoE连接。PADT数据包可以在会话建立以后的任意时刻单播发送,在发送或接收到PADT后,就不允许再使用该会话发送PPP流量了
1.3 PPPoE报文格式
字段 | 长度 | 含义 |
---|---|---|
Destination_Address | 48比特 | 以太网单播目的地址或者以太网广播地址(0xFFFFFFFF)。 - 对于Discovery数据包来说,该域的值是单播或者广播地址,PPPoE Client寻找PPPoE Server的过程使用广播地址,确认PPPoE Server后使用单播地址。 |
对于Session阶段来说,该域必须是Discovery阶段已确定的通信对方的单播地址。
| | Source_Address | 48比特 | 源设备的以太网MAC地址。 | | Ethernet_Type | 16比特 | 表示PPPoE拨号的阶段。
- 当值为0x8863时表示Discovery阶段或Terminate阶段。当值为0x8864时表示Session阶段。
| | VER | 4比特 | 表示PPPoE版本号,值为0x01。 | | Type | 4比特 | 表示PPPoE类型,值为0x01。 | | Code | 8比特 | 表示PPPoE报文类型。
- 0x00:表示会话数据。
- 0x09:表示PADI报文。
- 0x07:表示PADO报文。
- 0x19:表示PADR报文。
- 0x65:表示PADS报文。
- 0xa7:表示PADT报文。
| | Session_ID | 16比特 | 表示一个网络字节序的无符号值。
对一个给定的PPPoE会话来说该值是一个固定值,并且与以太网Source_address和Destination_address一起实际地定义了一个PPPoE会话。
值0xFFFF为将来的使用保留,不允许使用。 | | Length | 16比特 | 表示PPPoE报文的Payload长度。它不包括以太网头部和PPPoE头部的长度。 | | Tag_Type | 16比特 | 表示网络字节序。 | | Tag_Length | 16比特 | 是一个网络字节序的无符号值,表示Tag_Value的字节数。 | | Checksum | 16比特 | 表示校验和字段,用于检验报文的正确性。 |
1.4 PPPoE报文类型
PPPoE报文可以根据Code域取值的不同,分为六种报文类型:
- Code域为0x09,表示PADI报文。
- Code域为0x07,表示PADO报文。
- Code域为0x19,表示PADR报文。
- Code域为0x65,表示PADS报文。
- Code域为0x00,表示会话数据。
- Code域为0xa7,表示PADT报文。
Discovery阶段
PADI(PPPoE Active Discovery Initiation)
- Code域为0x09。
- Session_ID域为0x0000。
- TAG_Type域为0x0101(Service-Name),表明后面紧跟的是服务的名称。有且只有一个TAG_Type为Service-Name的TAG,其他类型的TAG可选。
图1 PADI数据包举例
PADO(PPPoE Active Discovery Offer)
- Code域为0x07。
- Session_ID域为0x0000。
- TAG_Type域的值不同,表明TAG的类型不同。
- TAG_Type域为0x0101(Service-Name),表明后面紧跟的是服务的名称。
- TAG_Type域为0x0102(AC-Name),表明后面紧跟的字符串唯一地表示了某个特定的访问集中器。
- TAG_Type域为0x0101(Service-Name),表明后面紧跟的是服务的名称。
- 有且只有一个TAG_Type为AC-Name的TAG,至少一个TAG_Type为Service-Name的TAG。
图2 PADO数据包举例
PADR(PPPoE Active Discovery Request)
- Code域为0x19。
- Session_ID域为0x0000。
- TAG_Type域为0x0101(Service-Name),表明后面紧跟的是服务的名称。有且只有一个TAG_Type为Service-Name的TAG,其他类型的TAG可选。
图3 PADR数据包举例
PADS(PPPoE Active Discovery Session-confirmation)
- Code域为0x65。
- Session_ID域为Discovery阶段分配的数值。
- TAG为可选。
Session阶段
- Ethernet_Type域设置为0x8864。
- Code域为0x00。
- Session_ID不允许发生改变,必须是Discovery阶段所指定的值。
- TAG_Type域包含一个PPP帧。PPP帧的开始字段是PPP Protocol-ID。
Terminate阶段
PADT(PPPoE Active Discovery Terminate)
- Code域为0xa7。
- Session_ID域为Discovery阶段分配的数值。
- 无TAG。
图6 PADT数据包举例
1.5 PPPoE实验
PPPoE实验.zip | |
---|---|
1.5.1 PPPoE服务器配置
//建立DHCP地址池
[Server]ip pool PPPoE
[Server-ip-pool-PPPoE]network 192.168.1.0 mask 24
[Server-ip-pool-PPPoE]gateway-list 192.168.1.1
//配置虚拟接口模板
[Server]interface Virtual-Template 1
[Server-Virtual-Template1]remote address pool PPPoE
[Server-Virtual-Template1]ppp chap user huawei
[Server-Virtual-Template1]ppp chap password cipher huawei
[Server-Virtual-Template1]ppp ipcp dns 8.8.8.8
[Server-Virtual-Template1]ip address 192.168.1.1 24
//在接口上启用PPPoE Server功能
[Server]int GigabitEthernet 0/0/0
[Server-GigabitEthernet0/0/0]pppoe-server bind virtual-template 1
1.5.2 PPPoE客户端配置
[Client]int Dialer 1
[Client-Dialer1]ppp chap user huawei
[Client-Dialer1]ppp chap password cipher huawei
[Client-Dialer1]ip address ppp-negotiate
[Client-Dialer1]dialer user user1
[Client-Dialer1]dialer bundle 1
[Client-Dialer1]dialer-group 1