我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

eNSP中PPPoE配置实战:从拓扑搭建到拨号排错全解析

eNSP中PPPoE配置实战:从拓扑搭建到拨号排错全解析 在日常网络实验里用eNSP做PPPoE配置算是一个挺有代表性的场景。很多朋友搭了几台路由器照着命令敲一遍却发现拨号不上或者拿不到地址最后只能去网上翻一堆零散帖子还是没搞清楚问题出在哪。这篇文章我想把整个PPPoE实验从拓扑设计、协议原理、服务端和客户端配置到验证排错的完整过程拆开揉碎讲一遍顺便把模拟器和真实设备之间的差异也交代清楚让大家在eNSP里能一次性把PPPoE跑通并且真正理解每一步在做什么。1. 为什么在eNSP里做PPPoE实验以及拓扑怎么搭1.1 这个实验能解决什么问题PPPoEPoint-to-Point Protocol over Ethernet在现网里最常见的场景就是宽带接入。运营商的OLT设备下面挂着一大堆用户用户侧通过ADSL或者光纤猫拨号本质上就是一台PPPoE客户端在向BRAS宽带远程接入服务器发起会话。对于网络工程师来说理解PPPoE的建链过程、认证方式以及路由转发关系是进入运营商网络或者企业分支接入领域的基础能力。在真实设备上做这个实验需要两台路由器加一台PC还要有运营商环境成本高而且权限难拿到。eNSP模拟器能免费把整个过程还原出来一台路由器模拟服务端一台路由器模拟客户端中间用以太网线互联。跑通了之后你还能直观看到PADI、PADR、LCP、IPCP这些报文交互对协议的理解比单纯看书深刻得多。1.2 模拟器拓扑与设备选型推荐使用AR系列路由器分别命名为R1服务端和R2客户端中间用GigabitEthernet接口相连。拓扑不用复杂两台设备足够。具体端口规划是这样设备接口角色IP地址规划R1GE0/0/0PPPoE Server侧接口本身不配IP靠虚拟模板下发地址R2GE0/0/0PPPoE Client侧接口本身不配IP拨号成功后由Dialer接口自动获取需要注意的点是eNSP里的PC终端不支持发起PPPoE拨号所以不能用云主机或者PC去模拟宽带用户。如果你手头只有一台路由器也没关系可以在另一台设备上用同样的命令配置或者用物理机的网卡连接模拟器但那样会涉及更多配置不推荐新手一上来就搞。提示如果用的是eNSP早期版本对PPPoE的支持可能不够稳定建议尽量用较新的版本。我实验时用的是常见的3.x版本功能上基本够用。2. PPPoE协议机制发现阶段与会话阶段到底发生了什么2.1 发现阶段四步握手PPPoE的建立过程可以分成两个大阶段发现阶段PPPoE Discovery和会话阶段PPPoE Session。发现阶段的核心目标就是让客户端找到服务端的MAC地址并确定一个会话IDSession ID。这个阶段包含四步很多人配置的时候只管敲命令不看报文结果出了问题完全不知道在哪一步卡住。第一步客户端发送PADIPPPoE Active Discovery Initiation广播报文目的MAC是全F这种报文本质上是在问“这个以太网里有没有PPPoE服务端你们谁能提供接入服务”第二步服务端收到PADI后如果自身配置了PPPoE服务并且还有资源就会单播返回一个PADOPPPoE Active Discovery Offer报文意思是“我能提供服务我的MAC是XX”。第三步客户端收到PADO后如果认可这个服务端就会向这个服务端单播发送PADRPPPoE Active Discovery Request正式请求建立会话。第四步服务端收到PADR后会分配一个Session ID并通过PADSPPPoE Active Discovery Session-confirmation报文回复给客户端。至此发现阶段完成双方进入会话阶段。在eNSP里你如果开启设备的抓包功能可以在接口上看到这四类报文。很多初学者觉得抓包复杂但其实这里只需要关注报文的源MAC和目的MAC、以及Session ID是否一致就能定位问题。2.2 会话阶段LCP认证与IPCP组件发现阶段结束之后双方并不是直接就能传IP数据而是还要在会话里进行PPP链路协商。这个阶段里跑的是真正的PPP协议并且因为PPP是点对点协议在两台以太网设备上存在一个“多路访问”的问题所以PPPoE实际上是把PPP帧封装在以太网帧里让一对点对点关系变得像直连一样。会话阶段第一个环节是LCPLink Control Protocol协商用来确认链路基本参数包括MRU最大接收单元、认证协议PAP或者CHAP等。LCP协商通过后服务端会要求客户端进行认证。eNSP里我们常用的认证方式是CHAP因为它比PAP更安全密码不会明文传输。认证通过后进入NCP网络控制协议阶段对于IPv4来说就是IPCP。IPCP负责协商双方的IP地址通常是由服务端通过地址池为客户端动态分配一个IP地址。到这里就能理解为什么客户端只需要拨号不需要手工配置IP地址。整个PPP会话协商完成后Dialer接口会自动获得一个IP地址同时还会生成一条默认路由指向对端这就是“拨号即上网”的原理。3. 服务端配置手记虚拟模板、地址池与认证3.1 服务端地址池与虚拟模板配置在R1上我们需要先定义IP地址池用于给客户端动态分配地址。地址池可以用全局地址池或者接口地址池这里用全局地址池更直观。假设内部网段规划是192.168.100.0/24网关不实际存在而是由服务端在IPCP阶段下发。先创建地址池名称为pppoe_pool[R1] ip pool pppoe_pool [R1-ip-pool-pppoe_pool] network 192.168.100.0 mask 255.255.255.0 [R1-ip-pool-pppoe_pool] excluded-ip-address 192.168.100.1注意这里我排除了192.168.100.1因为服务端侧可能会用到这个地址。你也可以不排除但建议保留一个管理IP方便排错。然后配置虚拟模板Virtual-Template这是PPPoE Server的核心配置。虚拟模板定义了会话所用的各项参数它本身不是一个物理接口而是动态创建会话时的模板。虚拟模板编号可以任意比如用1[R1] interface Virtual-Template 1 [R1-Virtual-Template1] ppp authentication-mode chap [R1-Virtual-Template1] ip address 192.168.100.1 255.255.255.0 [R1-Virtual-Template1] remote address pool pppoe_pool这里的ip address配的是服务端在PPP链路对端的地址其实在PPPoE中这个地址会作为客户端默认网关的下一跳地址。remote address pool指定给客户端分配地址的地址池。为什么虚拟模板要配置IP地址因为PPP链路建立后对端客户端需要通过IPCP获得地址服务端需要有一个自己的IP地址作为链路本地地址这样双方才能形成一张点对点网络。这个地址也是客户端收到的DNS或者网关相关参数的重要基础。最后在物理接口GE0/0/0上开启PPPoE服务绑定虚拟模板[R1] interface GigabitEthernet0/0/0 [R1-GigabitEthernet0/0/0] pppoe-server bind virtual-template 1这个命令的意思是这个物理接口开始响应PPPoE发现报文并且每收到一个PADR就基于虚拟模板1创建一个动态会话接口。需要说明的是在eNSP中物理接口上不需要再配置MPLS或桥接之类的额外内容绑定虚拟模板后接口会自动处理PPPoE报文。3.2 认证方式选择与设备参数认证方式这里可以用PAP或CHAP。PAP是明文用户名密码虽然配置简单但不推荐在现网使用。eNSP实验中我们可以用CHAP双方需要提前配置相同的用户名和密码。在服务端要用aaa或本地用户方式创建用户[R1] aaa [R1-aaa] local-user user1 password irreversible-cipher cipher 123456 [R1-aaa] local-user user1 service-type ppp如果没有aaa也可以直接在虚拟模板上调用认证域但更稳妥的方法是配置aaa本地认证。默认情况下虚拟模板上的ppp authentication-mode chap会自动关联到aaa认证所以我们需要确保aaa里存在对应的用户。认证过程是客户端发送username为user1服务端用CHAP挑战握手验证密码验证通过后会话建立。还有一个容易忽略的参数是MRU最大接收单元。默认情况下PPP MRU是1500但以太网帧的MTU也是1500加上PPP头部和PPPoE头部就会导致数据多出8个字节如果不做调整分片问题就会很严重。通常我们在两条链路上都配置mtu 1492或者ppp mp mru auto。不过要注意eNSP里有时候mtu配置不生效或者默认可以协商到1500这就需要我们在客户端调整接口MTU。后面会详细说。4. 客户端拨号配置dialer接口的联动关系4.1 配置拨号规则与拨号接口客户端R2侧的核心是Dialer接口。Dialer接口是一个逻辑拨号接口它本身不关联具体物理口而是通过拨号规则来决定什么时候建立会话以及使用什么用户名密码拨号。先配置用户名和密码必须与服务端一致[R2] aaa [R2-aaa] local-user user1 password irreversible-cipher cipher 123456 [R2-aaa] local-user user1 service-type ppp注意这里客户端也需要配置本地用户因为CHAP认证是双向的其实在PPPoE中通常只是服务端认证客户端但客户端也会在LCP协商中要求认证对端吗不一定。我们可以在dialer接口上指定PAP或CHAP用户名密码不依赖aaa。更简单的方法是在Dialer接口下配置[R2] interface Dialer 1 [R2-Dialer1] dialer user user1 [R2-Dialer1] dialer password cipher 123456 [R2-Dialer1] dialer bundle 1 [R2-Dialer1] ppp authentication-mode chap [R2-Dialer1] ppp chap user user1 [R2-Dialer1] ppp chap password cipher 123456有时候dialer password命令和ppp chap password同时需要华为设备上可以通过这些组合实现CHAP认证中的用户名密码发送。由于不同版本命令有差异我这里提供一个兼容性更好的配置方式使用dialer user指定拨号用户名用dialer password指定密码然后拨号时设备会按照LCP协商的认证方式发送。配置dialer接口的IP地址协商方式[R2-Dialer1] ip address ppp-negotiate这表示客户端地址由IPCP动态协商不手工配置。同时设置MTU[R2-Dialer1] mtu 1492再设置一条缺省路由指向Dialer接口[R2] ip route-static 0.0.0.0 0 Dialer 14.2 物理口与拨号口的绑定Dialer接口配置好后还需要在物理接口GE0/0/0上绑定拨号捆绑编号。拨号捆绑编号需要和Dialer接口的dialer bundle 1一致[R2] interface GigabitEthernet0/0/0 [R2-GigabitEthernet0/0/0] pppoe-client dial-bundle-number 1这行命令的意思是当物理接口收到PPPoE服务端回应的PADO后触发Dialer 1发起PADR并进入会话阶段。很多朋友在这里会漏掉pppoe-client这个关键字以为只需要配置dialer bundle就行结果物理接口完全没有PPPoE能力。华为设备上在物理接口必须使用pppoe-client命令明确告知该接口作为PPPoE客户端工作。选完这些之后还需要确认物理接口本身不要配置IP地址也不要配置其他三层协议因为PPPoE发现阶段是在二层进行的。如果物理接口配置了IP会导致报文转发异常拨号永远无法成功。这是模拟器实验中最常见的低级错误。5. 配置完成后如何验证与排错5.1 验证拨号会话与获取地址配置完毕后在R2上执行display pppoe-client session summary可以看到一条会话记录包括客户端MAC、服务端MAC、Session ID、会话状态。如果状态是Up恭喜你PPPoE已经建立成功。如果状态是Establishing或Down则需要排查。再执行display ip interface brief查看Dialer1接口是否有IP地址。正常情况下应该看到类似192.168.100.x的地址并且接口状态为Up。然后从R2 ping服务端的地址比如192.168.100.1能通就说明三层可达。还可以在R2上执行display fib查看默认路由或者用display ip routing-table确认静态默认路由已经指向Dialer1。如果需要看更详细的PPP状态可以执行[R2] display pppoe-client session summary [R2] display interface Dialer 1 [R2] display ppp link这些命令能让你看到LCP状态是否Open、认证状态是否Authenticated、IPCP状态是否Open。如果其中某个环节卡住就能定位到具体协议阶段。5.2 常见故障卡在发现阶段/认证失败/IPCP不协商我把在eNSP里跑PPPoE最常见的故障归类成三种每一种都有对应的排查路径。第一种客户端一直发PADI但没有收到PADO。原因通常是服务端物理接口没有绑定虚拟模板或者服务端接口处于shutdown状态。在R1上执行display pppoe-server session all如果没有任何信息说明服务端根本没收到PADI。这时候用抓包软件看报文最直接eNSP的抓包入口可以截获两个接口之间的流量。检查一下服务端物理接口是否启用了PPPoE绑定以及虚拟模板是否存在。第二种发现阶段正常但认证阶段失败。客户端显示LCP已打开但在认证后会话被终止。这种问题多半是用户名密码不一致或者认证方式不匹配。比如服务端配置了CHAP客户端却用PAP或者服务端本地用户的服务类型不是PPP。检查命令是在R1上执行display aaa online-record或display aaa user查看是否有用户上线记录。如果没有就是认证没有通过。这里特别提醒CHAP认证中密码是加密传输的但eNSP里如果两端配置的密码分别为123456和cipher 123456有可能因为加密算法不同导致不一致。建议客户端和服务端都使用同样的明文格式或者都用cipher格式。第三种IPCP协商失败Dialer接口迟迟拿不到地址。这种问题最常见的原因是服务端地址池配置错误比如地址池名在虚拟模板中写错或者地址池没有被正确关联。地址池remote address pool必须指向已存在的全局地址池。另外如果服务端虚拟模板没有配置IP地址IPCP就无法给客户端下发网关也会导致拨号成功后无法通信。经验在排错之前先把两台设备的系统时间调到一致。PPPoE的CHAP挑战值依赖于随机数但LCP的MRU协商、还有某些日志记录会受到系统时间影响。如果你在抓包时看到时间戳诡异先改设备时钟可以排除一部分干扰。6. 几个实用技巧和踩坑心得6.1 MTU与MSS的联动调整拨号成功后默认路由有了IP也有了但如果你从客户端去访问服务端后面的某个网段可能会发现比较大的数据包比如超过1472字节不通而小包正常。这就是MTU的问题。PPPoE头部占8字节所以链路MTU上限只有1492。但很多时候设备默认协商出来的MRU可能是1500这就导致实际发送的IP包可能会被丢弃或分片尤其TCP连接建立时的SYN包和SYN-ACK包如果超过MTU就会表现为部分网站打不开。解决办法是在客户端Dialer接口上设置mtu 1492同时调整TCP全局MSS[R2] interface Dialer 1 [R2-Dialer1] mtu 1492 [R2-Dialer1] tcp adjust-mss 1400tcp adjust-mss会改写TCP握手报文中的MSS选项使其不超过链路MTU减去IP头和TCP头的大小。这个命令在华为设备上很常用。eNSP里虽然不会真的出现“打不开网页”的问题但如果你做了QoS实验或者需要测试分片这个细节就是关键。6.2 eNSP模拟器特有的坑很多朋友在eNSP里做PPPoE时会遇到一个诡异的状况服务端和客户端都配置正确但客户端就是拨号不上。检查之后发现可能是eNSP的某些版本对PPPoE的支持有Bug尤其是当客户端路由器使用了非默认的Ethernet接口时。解决办法是把接口改为GigabitEthernet或者把链路速率模式改成自协商。另外一个模拟器特有的问题是PPPoE会依赖于GRE或者隧道模块某些版本在创建虚拟模板时如果不小心打了空格会导致相似但无法匹配的名字。这种问题非常隐蔽建议配置完地址池和用户名后使用display current-configuration查看实际配置复制命令而不是手敲。6.3 扩展思考多客户端场景与计费实验做完后可以尝试把服务端配置多个虚拟模板或者使用域来区分不同用户比如一个服务端同时服务多个vlan的用户。虽然eNSP对多会话支持有限但你可以试着在R1上创建更多的地址池并在虚拟模板中使用remote address pool按用户分配。更进一步你还可以在服务端启用statistics查看每秒收发报文数这有助于理解PPPoE的会话维持与保活机制。我个人的体会是PPPoE实验如果只停留在“配置能通”的层面价值会打很多折扣。真正有意义的是把报文交互流程看明白尤其是遇到拨号失败时用抓包和debug命令去定位是在哪个阶段出问题。这样下次在真实设备上遇到类似问题你就有了一套靠谱的排查思路而不是靠运气和百度。最后再分享一个小技巧eNSP里完成PPPoE配置后记得保存配置否则重启模拟器一切归零。而且如果你想保留实验结果需要手动导出.txt配置备份。我用这个方法保存过很多次实验拓扑后续复盘非常方便。
返回列表