1.1 PPPoE简介

PPPoE(PPP over Ethernet)协议是一种把PPP帧封装到以太网帧中的链路层协议。PPPoE可以使以太网网络中的多台主机连接到远端的宽带接入服务器。

运营商希望把一个站点上的多台主机连接到同一台远程接入设备,同时接入设备能够提供与拨号上网类似的访问控制和计费功能。在众多的接入技术中,把多个主机连接到接入设备的最经济的方法就是以太网,而PPP协议可以提供良好的访问控制和计费功能,于是产生了在以太网上传输PPP报文的技术,即PPPoE。

PPPoE利用以太网将大量主机组成网络,通过一个远端接入设备连入因特网,并运用PPP协议对接入的每个主机进行控制,具有适用范围广、安全性高、计费方便的特点。

image.png

1.2 PPPoE的工作原理

fig_dc_fd_pppoe_000701.png
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三个阶段。

  1. LCP阶段主要完成建立、配置和检测数据链路连接
  2. 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数据包举例
fig_dc_fd_pppoe_000601.png
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为AC-Name的TAG,至少一个TAG_Type为Service-Name的TAG。

图2 PADO数据包举例
fig_dc_fd_pppoe_000602.png
PADR(PPPoE Active Discovery Request)

  • Code域为0x19。
  • Session_ID域为0x0000。
  • TAG_Type域为0x0101(Service-Name),表明后面紧跟的是服务的名称。有且只有一个TAG_Type为Service-Name的TAG,其他类型的TAG可选。

图3 PADR数据包举例
fig_dc_fd_pppoe_000603.png
PADS(PPPoE Active Discovery Session-confirmation)

  • Code域为0x65。
  • Session_ID域为Discovery阶段分配的数值。
  • TAG为可选。

图4 PADS数据包举例
fig_dc_fd_pppoe_000604.png

Session阶段

  • Ethernet_Type域设置为0x8864。
  • Code域为0x00。
  • Session_ID不允许发生改变,必须是Discovery阶段所指定的值。
  • TAG_Type域包含一个PPP帧。PPP帧的开始字段是PPP Protocol-ID。

图5 Session阶段数据包举例
fig_dc_fd_pppoe_000605.png

Terminate阶段

PADT(PPPoE Active Discovery Terminate)

  • Code域为0xa7。
  • Session_ID域为Discovery阶段分配的数值。
  • 无TAG。

图6 PADT数据包举例
fig_dc_fd_pppoe_000606.png

1.5 PPPoE实验


image.png

PPPoE实验.zip

1.5.1 PPPoE服务器配置

  1. //建立DHCP地址池
  2. [Server]ip pool PPPoE
  3. [Server-ip-pool-PPPoE]network 192.168.1.0 mask 24
  4. [Server-ip-pool-PPPoE]gateway-list 192.168.1.1
  5. //配置虚拟接口模板
  6. [Server]interface Virtual-Template 1
  7. [Server-Virtual-Template1]remote address pool PPPoE
  8. [Server-Virtual-Template1]ppp chap user huawei
  9. [Server-Virtual-Template1]ppp chap password cipher huawei
  10. [Server-Virtual-Template1]ppp ipcp dns 8.8.8.8
  11. [Server-Virtual-Template1]ip address 192.168.1.1 24
  12. //在接口上启用PPPoE Server功能
  13. [Server]int GigabitEthernet 0/0/0
  14. [Server-GigabitEthernet0/0/0]pppoe-server bind virtual-template 1

1.5.2 PPPoE客户端配置

  1. [Client]int Dialer 1
  2. [Client-Dialer1]ppp chap user huawei
  3. [Client-Dialer1]ppp chap password cipher huawei
  4. [Client-Dialer1]ip address ppp-negotiate
  5. [Client-Dialer1]dialer user user1
  6. [Client-Dialer1]dialer bundle 1
  7. [Client-Dialer1]dialer-group 1

1.5.3 最终效果

image.png

1.5.4 教材实验

image.png
image.png