笔记:pppoe认证过程

2,957 阅读10分钟

from:baike.baidu.com/item/PPPoE

PPPoE(英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是PPP封装在以太网框架中的一种网络隧道协议。

第一阶段为PPPoE发现阶段。目的是为了获取局端连接集中器的MAC地址。为了在以太网上创建连接而交换PPP控制报文之前,两个端点都必须知道对端的MAC地址,这样才可以在控制报文中携带MAC地址。PPPoE发现阶段做的就是这件事。除此之外,在此阶段还将创建一个会话ID,以供后面交换报文使用。 第二阶段是LCP链路层协商阶段。协商确定最大MTU等链路层参数,以及认证方式。 第三阶段是认证阶段,使用第二阶段选择的认证方法来做权利认证,比如PAP,ChAP等。 第四阶段是NCP,网络层参数协商阶段。确认上网IP地址,DNS地址等网络参数。

有人会问:

ppp是数据链路层协议,为什么能进行IP地址协商呢?

PPP协议已不是纯粹的数据链路层的协议,还包含了物理层和网络层的内容,网络协议分层理论上方便理解,实际上不是一一对应。首先,要知道PPP的三大件:

  1. 使用HDLC封装数据包,
  2. LCP负责完成配置数据链路参数;
  3. NCP配置网络层参数。完成网络层的协商,包括IPCP、IPXCP、NBFCP。比如IPCP配置IP地址等必备参数,没有这个参数,IP层是无法运作等。

PPP配置网络,不是能不能的问题,而是要不要的问题。PPP和ARP都把他们看成2.5层就好理解了。

PPPoE发现

PPPoE报文的格式就是在以太网帧中携带PPP报文,如图所示

各个字段解释如下:

  1. Destination_address:一个以太网单播目的地址或者以太网广播地址(0xffffffff)。对于Discovery数据包来说,该域的值是单播或者广播地址,PPPoE Client寻找PPPoE Server的过程使用广播地址,确认PPPoEServer后使用单播地址。对于Session阶段来说,该域必须是Discovery阶段已确定的通信对方的单播地址
  2. Source_address:源设备的以太网MAC地址。
  3. Ether_type:设置为0x8863(Discovery阶段或拆链阶段)或者0x8864(Session阶段)。详细见ethertype
  4. Ver:4bits,PPPoE版本号,值为0x1。
  5. Type域:4bits,PPPoE类型,值为0x1
  6. Code:8bits,PPPoE报文类型。Code域为0x00,表示会话数据。Code域为0x09,表示PADI报文;Code域为0x07,表示PADO或PADT报文;Code域为0x19,表示PADR报文;Code域为0x65,表示PADS报文。
  7. Session_ID:16bits,对于一个给定的PPP会话,该值是一个固定值,并且与以太网Source_address和Destination_address一起实际地定义了一个PPP会话。值0xffff为将来的使用保留,不允许使用。 这个很重要,有了它,建立好链路后,fork一个pppd进程,转交此ID给它即可继续通信
  8. Length:16bits,定义PPPoE的Payload域长度。不包括以太网头部和PPPoE头部的长度。

数据:有时也称之为净载荷域,在PPPOE的不同阶段该域内的数据内容会有很大的不同。

在PPPOE的发现阶段时,该域内会填充一些Tag(标记);而在PPPOE的会话阶段,该域则携带的是标准的点对点协议包。

发现过程包含四个步骤。主机作为客户端,ISP端的访问集中器作为服务器。

四个步骤都是PAD打头的网络协议包,意思是为PPPoE Active Discovery:

  1. PADI : Initiation 客户机发给服务器   如果一个用户想要使用DSL拨号连入Internet,那么他的计算机必须首先在其ISP的网络服务提供点(POP)找到DSL访问集中器(DSL-AC)。在以太网上通讯只能通过MAC地址。由于计算机不知道DSL-AC的MAC地址,于是就在以太网上广播一个PADI报文。这个报文中包含发送者的MAC地址。PADI报文可能被一个以上的DSL-AC接收。 只有可以提供“服务名称”(Service-Name)的DSL-AC设备才应该回复。
  2. PADO - Offer 服务器发给客户机

一旦用户计算机发送了PADI报文,DSL-AC就会使用PADI中提供的MAC地址回复一个PADO报文。PADO报文中包含了DSL-AC的MAC地址、名称以及服务名。如果多于一个POP的DSL-AC回复了PADO报文,用户计算机就使用提供的名称和服务来从中选择一个。

NOTE about Service-Name:Named service—Specifies a PPPoE client service that an AC can support. For example, you might configure named services associated with different subscribers who log in to the PPPoE server, such as user1-service or user2-service, or that correspond to different ISP service level agreements, such as premium and standard. A named service is associated with the terminate action by default.Enables support for multiple services requested by PPPoE clients, and configuration of an action for the underlying PPPoE interface to take (delay, drop, or terminate) upon receipt of a PPPoE Active Discovery Initiation (PADI) packet requesting that service.Provides tighter control over which PPPoE clients can log in to and receive services from a particular PPPoE server.Provides load balancing across a set of remote access concentrators (ACs) in a mesh topology by enabling you to configure agent circuit identifier/agent remote identifier (ACI/ARI) pairs for named, empty, and any service entries to specify the appropriate AC to receive and service a particular PPPoE client request.

  1. PADR为Request的缩写 客户端发给服务器

当用户计算机收到一个来自DSL-AC的可接受的PADO报文后,就会发送一个PADR报文给DSL-AC,用来确认接受发送PADO报文的DSL-AC所提供的PPPoE连接。

  1. PADS Session-confirmation

上面的PADR报文由DSL-AC的PADS报文进行确认,并在其中携带一个会话ID。用户计算机与此DSL-AC的连接现在就完整创建了。

会话阶段

一旦完成PPPoE的发现过程,找到了对端的MAC地址,后面的工作就变成了PPP的一般过程。PPP提供个LCP和NCP协议,协商链路层参数和网络层参数。用户主机与接入集中器根据在发现阶段所协商的PPP会话连接参数进行PPP会话。

使用的帧结构为HDLC封包,如下:

协议字段:

  1. 当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。
  2. 当协议字段为0xC021时,PPP帧的信息字段就是PPP链路控制协议LCP的数据。
  3. 当协议字段为0x8021时,PPP帧的信息字段就是网络层的控制数据。

而LCP则是在此封包等数据内承载自己的协议:

2.1 LCP协商阶段(LCP:Link Control Protocol)

LCP的Request主机和AC都要给对方发送,LCP协商确定如下链路层参数的确定:

  1. 最大传输单元(MTU)
  2. 是否进行认证
  3. 采用何种认证方式(Authentication Type)

LCP协商的过程如下:

  1. 协商双方互相发送一个LCP Config-Request报文,确认收到的Config-Request报文中的协商选项,
  2. 根据这些选项的支持与接受情况,做出适当的回应。若两端都回应了Config-ACK,则标志LCP链路建立成功,否则会继续发送Request报文,直到对端回应了ACK报文为止。

(1)Config-ACK:若完全支持对端的LCP选项,则回应Config-ACK报文,报文中必须完全协带对端Request报文中的选项。

(2)Config-NAK:若支持对端的协商选项,但不认可该项协商的内容,则回应Config-NAK报文,在Config-NAK的选项中填上自己期望的内容,如:对端MRU值为1500,而自己期望MRU值为1492,则在Config-NAK报文中埴上自己的期望值1492。

(3)Config-Reject:若不能支持对端的协商选项,则回应Config-Reject报文,报文中带上不能支持的选项,如Windows拨号器会协商CBCP(被叫回呼),而ME60不支持CBCP功能,则回将此选项拒绝掉。

2.2 认证阶段(PPP Authentication:PAP/CHAP)

会话双方通过LCP协商好的认证方法进行认证。

Ⅰ PAP(Password Authentication Protocol,口令认证协议)认证

PAP为两次握手协议,它通过用户名及口令来对用户进行验证。PAP验证过程如下:

  1. 被验证方发送本端的用户名及口令到验证方
  2. 验证方根据本端的用户表(或Radius服务器)查看是否有此用户,口令是否正确。
  3. 如正确则会给对端发送Authenticate-ACK报文,通告对端已被允许进入下一阶段协商
  4. 否则发送NAK报文,通告对端验证失败。此时,并不会直接将链路关闭。只有当验证不过次数达到一定值(缺省为10)时,才会关闭链路。

PAP的特点是在网络上以明文的方式传递用户名及口令,如在传输过程中被截获,便有可能对网络安全造成极大的威胁。因此,它适用于对网络安全要求相对较低的环境。

Ⅱ CHAP(Challenge Handshake Authentication Protocol,质询握手认证协议)认证

CHAP为三次握手协议。只在网络上传输用户名,并不传输用户口令,因此它的安全性要比PAP高。CHAP的验证过程为:

  1. 首先由验证方(Server)向被验证方(Client)发送一些随机产生的报文,并同时将本端的主机名附带上一起发送给被验证方。
  2. 被验证方接到对端对本端的验证请求(Challenge)时,便根据此报文中验证方的主机名和本端的用户表查找用户口令字,如找到用户表中与验证方主机名相同的用户,便利用报文ID、此用户的密钥用Md5算法生成应答(Response),随后将应答和自己的主机名送回。
  3. 验证方接到此应答后,用报文ID、本方保留的口令字(密钥)和随机报文用Md5算法得出结果,与被验证方应答比较,根据比较结果返回相应的结果(ACK or NAK)

2.3 NCP协商阶段(NCP:Network Control Protocol)

NCP有很多种,如IPCP、BCP、IPv6CP,最为常用的是IPCP(Internet Protocol Control Protocol)协议。NCP的主要功能是协商PPP报文的网络层参数,如:

  1. IP地址
  2. DNS Server IP地址
  3. WINS Server IP地址等

PPPoE用户主要通过IPCP来获取访问网络的IP地址或IP地址段。

NCP流程与LCP流程类似,用户与ME设备之间互相发送NCP Config-Request报文并且互相回应NCP Config-Ack报文后,标志NCP己协商完,用户上线成功,可以正常访问网络了。

IPCP协商过程中,协商包文可包含多个选项,即参数。各个选项的拒绝或否认都不能影响IPCP的UP,IPCP可以无选项协商,无选项协商也同样能够UP。选项有IP Address、网关、掩码等,其中IP Address是最重要的一个选项,有些厂家的实现必须这个选项得到确认,大多数厂家的实现允许这个选项为空。

实际操作

ref: linux.die.net/man/8/pppd

用过ADSL等人一定使用过PPPOE的客户端,作为服务器端,DSL-AC还是比较神秘的,但是有了Linux,就可以在它上面利用pppoe server,实际体会下效果:

pppoe-server listens for incoming PPPoE discovery packets. When a session is established, it spawns a pppd process. The following options are passed to pppd:
"nodetach noaccomp nobsdcom nodeflate nopcomp novj novjccomp
default-asyncmap"

可以通过命令行参数,指定提供的Service-Name:

-S name
Offer a service named name. Multiple -S options may be specified; each one causes the named service to be advertised in a Service-Name tag in the PADO frame. The first -S option specifies the default service, and is used if the PPPoE client requests a Service-Name of length zero.

ref: linux.die.net/man/8/pppd

pppd也是有的:

The pppd daemon works together with the kernel PPP driver to establish and maintain a PPP link with another system (called the peer) and to negotiate Internet Protocol (IP) addresses for each end of the link. Pppd can also authenticate the peer and/or supply authentication information to the peer. PPP can be used with other network protocols besides IP, but such use is becoming increasingly rare.