华为H3C实战 | 第15章 PPP 与 PPPoE
📚 本系列共 43 篇(第 15 / 43 篇) · 第二卷 路由与广域网篇 —— 让数据找到路
← 上一篇:第 14 章 NAT 与地址转换 下一篇:第 16 章 IPv6 基础配置与地址自动配置 →
本章导读:一根线、两台机器,先"寒暄"、再"核工牌"、最后"交换名片"——这套规矩就是 PPP。PPPoE 把这套电话礼仪搬到了以太网上,你家光猫拨号拿到的地址就是这么来的。本章既讲路由器当 PPPoE 服务器,也讲当客户端去对接运营商。
本章结构:
- 15.1 功能原理与业务场景 —— PPP 三件套(LCP 协商参数 / PAP-CHAP 认证 / NCP-IPCP 分配地址),以及 PPPoE 的发现 + 会话两阶段
- 15.2 华为设备配置详解 —— PPPoE 服务器端模板、客户端模板,PAP 与 CHAP 的配置差异、CHAP 的单向与双向、MP 骨架,对接运营商的实战要点,以及 15.2.6 一个完整的可视化拨号过程(分四个时间点看状态)
- 15.3 H3C 设备配置详解 —— H3C 的
ppp pap/chap、虚拟模板与逐行讲解 - 15.4 命令对照表 —— 两家并排
- 15.5 配置验证 ——
display pppoe-client session、display interface Virtual-Template,附小微接入组网的完整验收清单 - 15.6 排错与故障树 —— 分层往下:物理层 → 发现阶段(关键分水岭)→ PPP 协商(LCP 卡住多半是认证方式不一致)
- 15.7 新手踩坑 —— 物理口没挂进拨号组、PAP/CHAP 两端不一致
- 15.8 本章小结 —— 要点清单 + 自测题
重点提示:拨号失败别一上来查认证,先用 15.2.6 的四个时间点判断"卡在哪一步":有 PADI 无 PADO 是服务器侧或二层不通,有 PADO 无 PADR 多半是客户端物理口没挂进拨号组。然后在 15.6 对应分支往下查。 关联章节:PPP 链路之上的静态/默认路由见第 10 章;出口 NAT 见第 14 章;PPPoE 在运营商侧的大规模应用(BRAS)见第 32 章;PPPoE 用户的认证计费见第 33 章。
15.1 功能原理与业务场景
15.1.1 这功能是干嘛的(通俗版)
几十年前,两台机器相隔几十公里,中间只有一根电话线。这根线上能传的就只有 0 和 1,可要通数据,光有"线"远远不够——双方得先商量"咱俩用什么速度说话"“你说方言还是我说普通话"“互相报个名字核对一下身份"“最后再定一下我给你分哪个地址”。这一整套"先握手、再对话"的规矩,就是点对点协议(PPP,Point-to-Point Protocol)[2]。
PPP 像两个人打电话前的开场白,分三步:先说话探探路(建立链路),再核对身份(认证),最后商量好用什么语言聊天(网络层协商)。等这些都齐了,才开始真正传数据。
PPPoE(Point-to-Point Protocol over Ethernet)[7] 是把这套电话礼仪搬到以太网上。以太网本来是一群人挤在一个房间里互相喊话(广播),可运营商想让每个用户都像"单独一条电话线"一样接入,于是搞了个中间层:先用以太网做一次"找对象"的广播,双方配好之后,在以太网帧里装 PPP 的会话。这就是家庭宽带拨号的原理——你家光猫拨号拿到的地址,就是 PPPoE 协商出来的。
15.1.2 在网络里怎么落地(设计视角)
PPP 有三个组成部分,对应三件事:
| 组件 | 全称 | 管什么 | 新手类比 |
|---|---|---|---|
| LCP | 链路控制协议 | 协商链路参数(最大接收单元、认证方式、魔术字) | 寒暄:咱俩用什么音量说话 |
| 认证协议 | PAP / CHAP | 验证对方身份 | 核对工牌 |
| NCP | 网络控制协议 | 协商网络层参数,IPv4 用 IPCP | 交换名片、互换地址 |
PPP 的协商是"分层串行"的:LCP 不成功,认证不会开始;认证不通过,IPCP 不会开始;IPCP 不完成,链路就没有 IP 地址、业务不通。这个顺序是排错的总纲——从下往上查,别跳。
PPP 跑在什么物理链路上并不重要,早期是串口和 E1,现在常见的是以太网(那就套一层 PPPoE)。下图是一条典型的 PPPoE 拨号链路,从家里的小路由器拨到运营商:
内网 PC 家庭/小微出口(PPPoE Client) 运营商 BRAS(PPPoE Server)
192.168.10.0/24 Dialer 口 虚拟模板/地址池
| | |
| 上网流量 -------------------> | |
| | PADI 广播找服务器 -----------> |
| | <----------- PADO 单播应答 |
| | PADR 请求会话 -------------> |
| | <-------------------- PADS 分配会话ID
| | LCP 协商 --------------> |
| | <--------------------- LCP 协商 |
| | CHAP 认证 --------------> |
| | <--------------------- CHAP 挑战 |
| | IPCP 请求地址 --------------> |
| | <------------------ 分配公网地址 |
| <---- 源地址经 NAT 转换后出网 | |
这里有两个容易忽略的细节。第一,PPPoE 的"发现阶段"用的是以太网广播,所以拨号口和以太网口必须在同一个二层广播域里;一旦中间隔了三层设备,PADI 连门都出不去,拨号会一直卡在"发送 PADI”。第二,拨号拿到的地址是运营商分配的,常变,所以出口设备不能用静态路由式的思路去规划,默认路由要靠协商结果自动生成为指向 Dialer 口的默认路由。
PPPoE 报文的以太网类型也值得记一下,抓包时一眼能认出:发现阶段用 0x8863,会话阶段用 0x8864。看到 0x8863 说明还在找服务器/建会话,看到 0x8864 说明会话已建立但在跑 PPP 协商或数据。
为什么要认证。运营商靠认证计费,企业总部靠认证控制分支接入。PAP 是明文传用户名密码,被截获就能复用;CHAP 是"挑战-响应”,服务器发一个随机数,客户端用密码结合随机数算一个摘要发回去,服务器自己也算一遍比对。所以 CHAP 全程不传明文密码,安全性更高。现代配置一律用 CHAP,PAP 只在对接极老的设备时用。
PAP 与 CHAP 的握手过程对照。理解这两个协议的差别,光看"明文/密文"四个字是不够的,得看报文怎么走:
PAP(两次握手,密码明文) CHAP(三次握手,密码不出门)
--------------------------- ---------------------------
Client Server Client Server
| 用户名+密码 --> | | |
| | | <---- 挑战(随机数) |
| <-- 通过/拒绝 | | 摘要=MD5(密码+挑战)|
| | | ---- 用户名+摘要 -> |
| | | <---- 通过/拒绝 |
PAP 的风险很直接:只要有人在链路上抓包,用户名和密码立刻暴露,之后攻击者可以冒充这个用户拨号。CHAP 的密码从不出现在报文里,只传摘要,而且挑战值每次都不同,抓到的摘要也没法重放。这就是"现代配置一律用 CHAP"的根本原因。
PPPoE 适合什么场景,不适合什么场景。这是设计时最该想清楚的问题:
| 场景 | 适不适合 PPPoE | 理由 |
|---|---|---|
| 家庭/小微宽带接入 | 非常适合 | 运营商标准做法,认证计费一体化 |
| 企业分支拨号到总部 | 适合 | 用 CHAP 认证,地址集中分配,便于集中管控 |
| 总部与分支之间的固定专线 | 不适合 | 专线有固定地址、带宽有保障,用静态路由或 BGP 更简单 |
| 高带宽数据中心互联 | 不适合 | PPPoE 有会话开销,且以太网封装限制 MTU 1492,不适合大包密集场景 |
| 需要二层透传的组网 | 不适合 | PPPoE 会改变以太网帧结构,透传会出问题 |
一句话总结:PPPoE 的强项是"用一条共享的以太网,给每个用户造出一条独立的、可认证可计费的逻辑链路",凡是需要这个特性的就适合,不需要的就不该硬上。
适用版本:华为 VRP V200R019 及以上(AR6000 系列);H3C Comware V7(R2610 及以上)。
15.2 华为设备配置详解
15.2.1 命令行基础速览(本章会用到的那几条)
华为的 PPPoE 分两种角色,配置思路完全不同:做服务器端是把物理口绑到虚拟模板上,由虚拟模板统一管理会话参数;做客户端是要建一个 Dialer 口,把物理口"借"给 Dialer 用。前者像"开了一家营业厅",后者像"装了一部电话"。
| 角色 | 用途 | 华为命令 | 视图 |
|---|---|---|---|
| 服务器 | 物理口绑定虚拟模板 | pppoe-server bind virtual-template 1 |
以太口视图 |
| 服务器 | 建虚拟模板并配认证 | interface Virtual-Template 1 + ppp authentication-mode chap |
系统视图 |
| 服务器 | 配置地址池 | ip pool PPPOE_POOL → network 172.16.1.0 mask 255.255.255.0 |
系统视图 |
| 服务器 | 给客户端分地址 | remote address pool PPPOE_POOL |
虚拟模板视图 |
| 客户端 | 建 Dialer 口 | interface Dialer 1 |
系统视图 |
| 客户端 | 拨号组、绑定关系 | dialer-group 1、dialer bundle 1 |
Dialer 视图 |
| 客户端 | 拨号触发规则 | dialer-rule → dialer-rule 1 ip permit |
系统视图 |
| 客户端 | 物理口挂进拨号组 | pppoe-client dial-bundle-number 1 |
以太口视图 |
| 客户端 | CHAP 用户名密码 | ppp chap user X / ppp chap password cipher Y |
Dialer 视图 |
| 客户端 | 由对端分配地址 | ip address ppp-negotiate |
Dialer 视图 |
15.2.2 完整配置模板:PPPoE 服务器端(华为 AR)
场景:一台 AR6140-16G4XG 作为小办公区的接入网关(PPPoE Server),下行 GigabitEthernet0/0/1 接二层交换机,下面挂几十台需要拨号的小路由器。要给拨号用户分配的地址段是 172.16.1.0/24。
# 进入系统视图
system-view
sysname HUAWEI
# 配置拨号用户地址池
ip pool PPPOE_POOL
network 172.16.1.0 mask 255.255.255.0
gateway-list 172.16.1.1
dns-list 114.114.114.114
quit
# 创建虚拟模板,统一管理所有拨号会话的参数
interface Virtual-Template 1
ip address 172.16.1.1 255.255.255.0
ppp authentication-mode chap
remote address pool PPPOE_POOL
quit
# 本地用户,给拨号客户端认证用
aaa
local-user branch01 password irreversible-cipher Branch@2024
local-user branch01 service-type ppp
quit
# 下行以太口绑定虚拟模板,并开启 PPPoE 服务
interface GigabitEthernet0/0/1
pppoe-server bind virtual-template 1
quit
save
15.2.3 完整配置模板:PPPoE 客户端(华为 AR)
场景:一台小路由器要拨号连到上面的服务器,拿到地址后才能把内网流量转出去。
# 定义拨号规则:匹配所有 IPv4 流量即触发拨号
# 注意:华为是先 dialer-rule 进视图,再在视图里写规则(两句)
dialer-rule
dialer-rule 1 ip permit
quit
# 建 Dialer 接口,作为拨号成功后的逻辑三层接口
interface Dialer 1
link-protocol ppp
ppp chap user branch01
ppp chap password cipher Branch@2024
ip address ppp-negotiate
dialer user branch
dialer bundle 1
dialer-group 1
quit
# 把 WAN 物理口挂进拨号组 1
interface GigabitEthernet0/0/1
pppoe-client dial-bundle-number 1
quit
# 内网地址与 NAT(上网出口)
interface GigabitEthernet0/0/2
ip address 192.168.10.1 255.255.255.0
quit
acl number 2000
rule 5 permit source 192.168.10.0 0.0.0.255
quit
interface Dialer 1
nat outbound 2000
quit
save
15.2.4 逐行讲解
| 命令 | 作用 | 新手常填错的地方 |
|---|---|---|
ip pool PPPOE_POOL |
建地址池 | 池里的网关地址要与虚拟模板接口地址一致,否则客户端拿到的网关不可达 |
ppp authentication-mode chap |
虚拟模板上启用 CHAP 认证 | 命令要在虚拟模板视图下配,配在物理口不生效 |
remote address pool PPPOE_POOL |
从地址池给对端分地址 | 漏了这行,客户端 IPCP 阶段拿不到地址,拨号"起来又断" |
local-user X password irreversible-cipher Y |
建认证用户 | service-type ppp 必须配,只建用户不指定服务类型认证不过 |
pppoe-server bind virtual-template 1 |
物理口绑虚拟模板 | 绑错模板等于所有会话参数都错,一定要 display current-configuration 核对 |
dialer-rule 1 ip permit |
规定什么流量触发拨号 | 不配这个,Dialer 口永远不主动拨号 |
dialer bundle 1 |
指定拨号组 | 必须与物理口 pppoe-client dial-bundle-number 1 的编号一致,不一致永远拨不上 |
ppp chap user branch01 |
CHAP 用户名 | 这个用户名是"本地向对端报上来的名字",必须与服务器上 local-user 建的完全一致 |
ip address ppp-negotiate |
由对端分配地址 | 与 ip address X Y 互斥,拨号场景一律用前者 |
nat outbound 2000 |
拨号口做 NAT | 配在 Dialer 口,不是物理口;拨号地址变了 NAT 自动跟着变 |
CHAP 的单向与双向。上面模板做的是单向认证:服务器验证客户端。如果要求互相验证,服务器端虚拟模板也要配 ppp chap user 和 ppp chap password,客户端侧要开 ppp authentication-mode chap 并要求对端报名字。双向认证的排错难度翻倍,因为"是谁验证谁"的方向搞反了,现象是"我这边显示认证失败、对端显示认证通过"。定位办法是看两边的 display interface Dialer 和 display ppp interface,找出哪一侧报 LCP 阶段失败。
PAP 与 CHAP 的配置差异。用 PAP 时命令换成 ppp authentication-mode pap,客户端侧对应的凭据命令是 ppp pap local-user,语义是"我发给对端的用户名密码",与 CHAP 的 ppp chap user 位置对称但名字不同,很容易抄错。PAP 的安全性问题在于密码明文传输,只在对接老旧设备时使用。
下面这段是把上面的 CHAP 模板改造成 PAP 的完整对照,方便你迁移老设备时直接套:
# 服务器端:把认证方式从 chap 改成 pap
interface Virtual-Template 1
ppp authentication-mode pap
quit
# 客户端:PAP 的凭据命令与 CHAP 不同名
interface Dialer 1
ppp pap local-user branch01 password cipher Branch@2024
quit
对照 CHAP 版本会发现,唯一的区别就是 ppp chap user+ppp chap password 变成了合并成一行的 ppp pap local-user ... password ...,以及服务器端的 authentication-mode 参数。这个"外形几乎一样、语义完全不同"的特点,是 PPP 配置最容易出错的地方——抄了一行,通不了,还看不出哪里不对。
多链路 PPP(MP)的配置骨架。当一条链路带宽不够,可以用多链路把两条物理链路捆成一个逻辑通道,带宽相加。华为侧的思路是建一个 MP-Group 逻辑接口,把物理口都挂进去。
命令写法已按华为官方配置指南核实,注意两个细节:接口命令是 interface mp-group(全小写),物理口上是 ppp mp mp-group <编号>:
# 创建 MP-Group 逻辑接口,统一配置 IP 与认证
interface mp-group 1/0/1
ip address 172.16.2.1 255.255.255.0
ppp authentication-mode chap
quit
# 把两条串口链路都挂进同一个 MP-Group
interface Serial 1/0/0
link-protocol ppp
ppp mp mp-group 1/0/1
quit
interface Serial 1/0/1
link-protocol ppp
ppp mp mp-group 1/0/1
quit
三个必须知道的限制(都是华为官方原文):
| 项目 | 官方口径 |
|---|---|
| 硬件前提 | 仅支持插入 E1 单板或 CPOS 单板的设备支持配置 MP;MP-Group 支持跨板捆绑,跨板捆绑时需先创建 MP-Group 0/0/X 类型接口 |
| 接口命名 | 创建用 interface mp-group number;设备回显里的接口视图提示符写作 [DeviceB-Mp-group2/0/1] |
| 物理口挂载 | ppp mp { interface-type interface-number | interface-name },官方示例为 ppp mp mp-group 1/0/1 |
| 认证配在哪 | 认证配在 MP-Group 逻辑接口上;NCP 协商用 MP-Group 的 NCP 参数,物理接口配置的 NCP 参数不起作用 |
| 查看捆绑 | display ppp mp [ interface ... ],看 MP 捆绑信息与各链路收发统计 |
出处:华为 NetEngine AR5700, AR6700, AR8000 V600R025C10 配置指南-广域网接入配置 (原文:
创建MP-Group接口,并进入MP-Group接口视图。interface mp-group number;将当前串行接口加入指定的MP-Group接口,使该串口工作在MP方式。ppp mp { interface-type interface-number | interface-name };配置举例[DeviceA-Serial1/0/1:1] ppp mp mp-group 1/0/1)、华为 配置MP-Group接口(AR100/120/150/160)
⚠ 版本差异:上面例子里的接口编号
1/0/1是官方示例的槽位编号,实际填写取决于你的设备槽位与 E1 通道化后的串口编号(官方示例中 E1 的channel-set 1 timeslot-list 1-15会生成Serial 1/0/1:1这类接口),照抄前先display interface brief看你设备上的真实接口名。
15.2.5 PPPoE 客户端对接运营商的实战要点
大多数读者第一次接触 PPPoE 客户端,不是给自家设备做服务器,而是自己当客户端去拨运营商。这种场景下有几个"运营商才有的规矩",照着做能少被客服绕圈:
第一,账号密码形如 宽带账号@服务后缀。运营商的 BRAS 靠后缀判断用户属于哪个业务域、限速策略套哪一套。把后缀删掉去拨,往往认证直接失败。所以填 ppp chap user 时要完整照抄开户单上的账号,包括 @ 后面的部分。
第二,运营商侧一般不允许双向认证。也就是说,你只需要配 ppp chap user + ppp chap password 主动报名字,不需要在 Dialer 口上开 ppp authentication-mode chap 去验证对端。多加这一行,常见结果是 LCP 阶段反复重协商、拨号迟迟不成功。
第三,别自己指定 IP。运营商给的是动态地址,必须 ip address ppp-negotiate,写死地址会与对端的地址分配冲突。同理,默认路由也不要手工写死下一跳,拨通后指向 Dialer 口的默认路由才是正确形态。
第四,光猫桥接还是路由,决定拨号口接在哪。如果光猫已经拨号(光猫做路由),那你的设备只需要从光猫拿 DHCP 地址,根本不用 PPPoE;只有光猫桥接时,才由你的设备拨号。这一点最容易被搞混——看到"PPPoE 拨不上"先问一句"光猫是什么模式"。
第五,VLAN 的问题。有些运营商的接入方式是"PPPoE over VLAN",即拨号报文需要带某个 VLAN Tag 才能被 BRAS 收到。这种情况下要在物理口下面建子接口、打上对应 VLAN 再拨号。如果拨号一直没回应、而线、账号都对,就要怀疑这一层。
15.2.6 一个完整的可视化拨号过程(跑一遍心里就有数了)
新手学 PPPoE 最大的痛苦是"看不到中间状态",只能看到一个最终结果:通或不通。其实把 display 命令按时间顺序打出来,就能"看见"拨号是怎么一步步起来的。下面是同一个 Dialer 口在四个时间点的输出对比:
时间点一:刚配好、还没拨号。此时 Dialer 口存在但没有链路:
Dialer1 current state : DOWN
Line protocol current state : DOWN
Internet Address is 0.0.0.0/0
Internet Address 是 0.0.0.0 说明 IPCP 还没有分配地址,符合预期。
时间点二:有流量触发了拨号,正在发现阶段。到客户端会话表里看:
SID State Intf Dialer
1 PadiShip GE0/0/1 1
PadiShip 表示客户端已经发了 PADI,正在等服务器回应。如果这个状态停留超过几秒,基本可以断定 PADO 没回来——服务器侧或二层有问题。
时间点三:PPP 协商中。会话状态变成 PppUp 之前可能出现 PADR 已发的阶段,此时 PPP 已经开始跑了,去 Dialer 口上能看到 LCP、IPCP 的分阶段状态。
时间点四:拨通。会话表里 State 为 PppUp,Dialer 口上:
Dialer1 current state : UP
Line protocol current state : UP
Internet Address is 172.16.1.2/32
四个时间点对照下来,你会发现"拨号"其实是一个可以逐帧观察的过程,而不是一个黑盒。这就是本章反复强调"按层排查"的意义。
15.3 H3C 设备配置详解
H3C Comware V7 的 PPPoE 配置与华为高度同构,主要差异在虚拟模板接口名、地址池命令和拨号口的参数顺序上。
服务器端配置(H3C MSR3610-X1):
# 进入系统视图
system-view
sysname H3C
# 配置拨号用户的地址池
ip pool PPPOE_POOL
network 172.16.1.0 mask 255.255.255.0
gateway-list 172.16.1.1
dns-list 114.114.114.114
quit
# 创建虚拟模板,管理会话参数
interface Virtual-Template 1
ip address 172.16.1.1 255.255.255.0
ppp authentication-mode chap
remote address pool PPPOE_POOL
quit
# 本地用户,service-type 要包含 ppp
local-user branch01 class network
password simple Branch@2024
service-type ppp
quit
# 下行以太口绑定虚拟模板
interface GigabitEthernet1/0/1
pppoe-server bind virtual-template 1
quit
save force
客户端配置(H3C MSR3610-X1 作拨号侧):
# 定义拨号访问组 1 及其触发条件:所有 IPv4 流量都允许触发拨号
dialer-group 1 rule ip permit
# 建 Dialer 接口
interface Dialer 1
link-protocol ppp
ppp chap user branch01
ppp chap password cipher Branch@2024
ip address ppp-negotiate
dialer bundle enable
dialer-group 1
quit
# WAN 物理口挂进拨号组
interface GigabitEthernet1/0/1
pppoe-client dial-bundle-number 1
quit
# 内网口与 NAT
interface GigabitEthernet1/0/2
ip address 192.168.10.1 255.255.255.0
quit
acl basic 2000
rule 5 permit source 192.168.10.0 0.0.0.255
quit
interface Dialer 1
nat outbound 2000
quit
save force
H3C 侧的三个差异点:
第一,本地用户必须区分 class。H3C 的 local-user 默认建的是 manage 类用户(管登录的),拨号认证用的必须是 network 类(管接入的)。不写 class network,用户建了也认证不过,这是 H3C 独有的一大坑。
第二,password simple / password cipher 与华为的 irreversible-cipher 写法不同。H3C 里 simple 表示明文存储(配置回显里能看到)、cipher 表示加密存储。生产环境一律用 cipher。上面模板为了演示用了 simple,实际部署要换掉。
第三,拨号触发规则与 bundle 的写法两家完全不同,这是抄配置最容易翻车的地方:
| 项目 | 华为(VRP) | H3C(Comware V7) |
|---|---|---|
| 触发规则 | dialer-rule 进视图,再 dialer-rule 1 ip permit(两句) |
dialer-group 1 rule ip permit(一句,组号与规则合并) |
| Dialer 口使能共享 DDR | dialer bundle 1(带编号) |
dialer bundle enable(不带编号) |
| Dialer 口关联访问组 | dialer-group 1 |
dialer-group 1 |
H3C 的 pppoe-client dial-bundle-number N 里的 N 必须与 Dialer 接口编号相同(官方原文:该 Dialer bundle 的序号 number 需要与 Dialer 接口的编号相同),而不是与某个"bundle 编号"对应——因为 H3C 的 dialer bundle enable 本身不带编号。
出处:H3C 08-PPPoE配置 (原文示例:
[AP] dialer-group 1 rule ip permit/[AP-Dialer1] dialer bundle enable/[AP-Dialer1] dialer-group 1/[AP-Vlan-interface1] pppoe-client dial-bundle-number 1)
⚠ 版本差异:H3C V5 里
pppoe-server bind virtual-template与pppoe-client dial-bundle-number的参数格式与 V7 基本一致,但 V5 没有class network的概念,配置回显也不同。做 V5 老设备迁移时要逐条对照。
15.3.1 H3C 逐行讲解
把上面两段 H3C 模板逐行拆开看,重点标出与华为不同、容易踩的地方:
| 命令 | 作用 | 与华为的差异 / 坑点 |
|---|---|---|
ip pool PPPOE_POOL |
建地址池 | 与华为相同 |
network 172.16.1.0 mask 255.255.255.0 |
定义池网段 | 与华为相同 |
interface Virtual-Template 1 |
建虚拟模板 | 与华为相同 |
remote address pool PPPOE_POOL |
给对端分地址 | 与华为相同,但漏了这行两边都会"拨上又断" |
local-user branch01 class network |
建拨号用户 | H3C 独有:不分 class network 的用户不能用于 PPP 认证 |
password simple / password cipher |
密码存储方式 | 华为写 irreversible-cipher,H3C 分 simple(明文)/cipher(密文);service-type ppp 必须配 |
pppoe-server bind virtual-template 1 |
物理口绑模板 | 与华为相同 |
| 拨号触发规则 | 华为:dialer-rule 视图下 dialer-rule 1 ip permit |
H3C:全局 dialer-group 1 rule ip permit(组号与规则合一) |
interface Dialer 1 |
建拨号逻辑口 | 与华为相同 |
ppp chap user / ppp chap password |
CHAP 凭据 | 与华为相同,语义都是"本端向对端报的名字与密码" |
ip address ppp-negotiate |
由对端分地址 | 与华为相同 |
dialer bundle enable |
使能共享 DDR | H3C 不带编号(华为是 dialer bundle 1);物理口 pppoe-client dial-bundle-number N 的 N 要与 Dialer 接口编号一致 |
pppoe-client dial-bundle-number 1 |
物理口挂进拨号组 | 与华为相同 |
nat outbound 2000 |
拨号口做 NAT | 与华为相同,配 Dialer 口而非物理口 |
对照下来能发现一个规律:PPPoE 的配置骨架两家几乎一模一样,真正的差异全在"外围的认证与用户体系"上。华为走的是 aaa 视图 + local-user + service-type ppp;H3C 走的是 local-user class network + password + service-type ppp。所以华为转 H3C 的人,最容易在"用户建了但认证不过"上卡住——差的就是 class network 这一个词。
H3C 侧一个值得单记的点:虚拟模板与物理口的绑定关系。H3C 的 pppoe-server bind virtual-template 挂在以太口视图下,含义是"这个物理口上所有 PPPoE 会话都由虚拟模板 1 的参数管理"。如果设备上有多个下行口要给不同网段的用户分地址,就需要建多个虚拟模板、每个口绑不同的模板。这个"模板隔离"的思路与华为完全一致,是 PPPoE 部署的基本功。
15.4 华为 / H3C 命令对照表
| 功能 | 华为(VRP) | H3C(Comware V7) | 差异说明 |
|---|---|---|---|
| 建地址池 | ip pool X → network A mask B |
ip pool X → network A mask B |
相同 |
| 虚拟模板 | interface Virtual-Template 1 |
interface Virtual-Template 1 |
相同 |
| PPP 认证 | ppp authentication-mode chap |
ppp authentication-mode chap |
相同 |
| 分配对端地址 | remote address pool X |
remote address pool X |
相同 |
| 建本地用户 | local-user X password irreversible-cipher Y + service-type ppp |
local-user X class network + password cipher Y + service-type ppp |
H3C 必须先分 class |
| 服务器绑定 | pppoe-server bind virtual-template 1 |
pppoe-server bind virtual-template 1 |
相同 |
| 客户拨号组 | dialer bundle 1 |
dialer bundle enable |
H3C 不带编号 |
| 拨号规则 | dialer-rule 视图下 dialer-rule 1 ip permit(两句) |
dialer-group 1 rule ip permit(一句) |
命令形态不同 |
| 物理口挂载 | pppoe-client dial-bundle-number 1 |
pppoe-client dial-bundle-number 1 |
相同 |
| 地址协商 | ip address ppp-negotiate |
ip address ppp-negotiate |
相同 |
| 查看服务器会话 | display pppoe-server session all |
display pppoe-server session |
命令名略差 |
| 查看客户端会话 | display pppoe-client session summary |
display pppoe-client session summary |
相同 |
15.5 配置验证
排 PPPoE 有一条黄金顺序:先看发现阶段,再看 PPP 会话,最后看业务。三个层次的命令分开用。
第一步,确认服务器收到了会话请求。在服务器端:
display pppoe-server session all
期望看到每个拨号用户一条会话,State 为 PppUp,并且带分配到的 IP:
SID Intf State OIntf IPAddr MAC
1 VT1 PppUp GE0/0/1 172.16.1.2 00e0-fc12-3456
State 常见的值有 Idle、PadiShip、PppUp 等,十六进制地看:会话没起来时是 Idle,正在协商 PPP 时看得到中间状态,只有 PppUp 才算拨通。
第二步,客户端侧看会话建立情况:
display pppoe-client session summary
期望 State 为 Up,并且 Dialer 列能看到对应的 Dialer 接口编号。如果 State 一直是 Down,说明发现阶段就没过,去查二层可达性和服务器有没有开服务。
第三步,看 PPP 链路状态与地址。客户端上:
display interface Dialer 1
期望看到 Line protocol current state : UP、LCP opened、IPCP opened,并且 Internet Address is 172.16.1.2/32 之类由对端分配的地址:
Dialer1 current state : UP
Line protocol current state : UP
Internet Address is 172.16.1.2/32
Physical is Dialer, baudrate 64000 bps
如果 Line protocol 是 DOWN,看括号里写的阶段:LCP 阶段的 Down 说明链路参数协商不上;IPCP 阶段的 Down 说明认证过了但地址没协商成(最常见是服务器没配 remote address pool)。
第四步,看默认路由有没有自动生成。PPPoE 拨通后通常会生成一条指向 Dialer 口的默认路由:
display ip routing-table
期望能看到 0.0.0.0/0 Static ... Dialer1。如果这条没有,说明拨号虽然通了但路由没起来,需要手工补一条 ip route-static 0.0.0.0 0.0.0.0 Dialer 1。
H3C 侧验证命令基本一一对应:
display pppoe-server session
display pppoe-client session summary
display interface Dialer 1
display ip routing-table
15.5.1 一个小微接入组网的完整验证清单
把本章所有验证点串成一个"小微办公区拨号接入"的验收清单。组网:一台 AR 做 PPPoE 服务器兼出口,下面挂 5 台小路由器拨号,每个小路由后面带一个办公室。
按下面的顺序逐条打勾,全部通过才算交付:
| 序号 | 验证项 | 命令 | 通过标准 |
|---|---|---|---|
| 1 | 服务器物理口 up | display interface brief |
下行口状态 up |
| 2 | 服务器地址池正常 | display ip pool |
池内可用地址数等于配置容量 |
| 3 | 服务器会话建立 | display pppoe-server session all |
每条会话 State 为 PppUp |
| 4 | 客户端会话建立 | display pppoe-client session summary |
State 为 Up |
| 5 | 客户端 LCP 与 IPCP | display interface Dialer 1 |
两者均为 opened |
| 6 | 客户端拿到地址 | display interface Dialer 1 |
Internet Address 非 0.0.0.0 |
| 7 | 客户端默认路由 | display ip routing-table |
有指向 Dialer 的默认路由 |
| 8 | 客户端 NAT 生效 | display nat outbound |
Dialer 口有规则且为 easyip |
| 9 | 端到端连通 | 内网 PC ping 公网地址 |
通,且 tracert 首跳出公网 |
这张表的用法是"从服务器往客户端、从下往上"逐条过。哪一步断了,问题就锁定在那一层,不用再往前找。比如第 3 项过了、第 4 项没过,问题一定在客户端侧;第 6 项过了、第 7 项没过,就是路由没生成,跟拨号过程无关。这就是把"玄学拨号"变成"工程验收"的方法。
15.6 排错与故障树
PPPoE 排错的分层原则和 PPP 一模一样,从下往上:
拨号拨不上
├─ 1. 物理层通不通?
│ ├─ display interface Brief 看物理口是否 UP
│ └─ 电口光口本身坏 / 双工不匹配 → 查速率双工
├─ 2. 发现阶段过不过?(关键分水岭)
│ ├─ 抓包看不到 PADI → 客户端根本没发,检查 pppoe-client 配置
│ ├─ 有 PADI 无 PADO → 服务器没开服务 / 二层不达 / 服务器绑错模板
│ ├─ 有 PADO 无 PADR → 客户端问题,多数是物理口没挂进拨号组
│ └─ 有 PADR 无 PADS → 服务器处理不过来 / 会话数上限
├─ 3. PPP 协商过不过?
│ ├─ LCP 卡住 → 认证方式不一致(一边 CHAP 一边 PAP)
│ ├─ 认证失败 → 用户名密码错 / service-type 没配 / H3C 没分 class
│ └─ IPCP 卡住 → 服务器没配 remote address pool 或地址池耗尽
└─ 4. 起来了但又断?
├─ 会话老化 / 空闲超时 → 调 dialer idle-timeout
├─ 地址池耗尽 → display ip pool
└─ 认证服务器(RADIUS)不通 → 看 AAA 侧配置
| 症状 | 可能原因 | 排查命令 |
|---|---|---|
| 一直显示 Down,无任何会话 | 物理口没挂进 dial-bundle / 编组号写错 | display current-configuration interface |
| 有 PADI 但没有回应 | 服务器没开 PPPoE 服务或绑错虚拟模板 | display pppoe-server session all |
| 会话 PppUp 但 ping 不通网关 | 地址池与虚拟模板网段不一致 | display ip pool |
| 认证一直失败 | CHAP 用户名不符 / H3C 未 class network |
display local-user |
| 拨上就断、循环重拨 | IPCP 拿不到地址,服务器无地址池 | 服务器端 display ip pool |
| 能拨上但内网不能上网 | 拨号口没配 NAT / 没生成默认路由 | display nat outbound、display ip routing-table |
| 拨号频繁重建 | 链路空闲超时太短 | display dialer 相关命令 |
抓包定位发现阶段。PPPoE 问题靠猜是猜不出来的,必须看报文。设备上不做镜像的话,最便宜的招是看会话状态机的中间值——如果 display pppoe-client session summary 里能看到会话从 Idle 短暂跳到 PadiShip 又掉回 Idle,就说明客户端发了 PADI 但没收到 PADO。这个中间状态比"一直 Down"信息量大得多。
一个容易忽略的现象:拨号成功了却"看起来没通"。拨通后内网 PC 上不了网,先别怀疑 PPPoE。按这个顺序查:一是 Dialer 口有没有 NAT 规则,二是内网有没有默认路由指向 Dialer 口,三是 PC 的网关是不是指到了路由器内网口。因为 PPPoE 只是把"外层链路"接通了,内网到外网的地址转换与路由是另外两件事。
另一个隐蔽问题:MTU。PPPoE 在以太网帧里封装 PPP,帧头多占了 8 个字节,所以 PPPoE 的 MTU 是 1492 而不是 1500。有些应用发大包时会触发分片或 PMTUD 失败,表现为"网页能开、大文件下载卡、VPN 连不上"。处理办法是在 Dialer 口上调整 TCP MSS 上限。这一点和 13 章 NAT 里的 MTU 问题是一脉相承的。
三个现场案例,把故障树走一遍。
案例一:拨号一直不通,服务器那边一条会话都没有。先登服务器 display pppoe-server session all,发现完全空白,说明连 PADI 都没到。再查服务器物理口是否 up、pppoe-server bind 有没有配在正确的口上。这个案例 90% 的原因是对端设备的下行口接错了——线插在了另一个物理口上,或者服务器绑模板绑到了上行口。定位技巧是看服务器接口的收包计数,display interface GigabitEthernet0/0/1 里的 Input 包数如果在拨号时增长,说明报文到了这个口;不增长说明线/口不对。
案例二:服务器能看到会话,状态 PppUp,但客户端 Dialer 口没有地址。这类问题必然出在 IPCP 阶段。去服务器端查地址池:display ip pool,如果显示"已分配数量 = 池总量",就是池子满了;如果显示池里的网段与虚拟模板接口 IP 不在同一网段,客户端拿不到可从同一网段使用的地址,也会表现为拿不到地址。第二种错误极隐蔽——虚拟模板配 ip address 172.16.1.1 24,地址池却写成 network 10.0.0.0,两边都对得上语法,就是不通。
案例三:拨上了、内网也能 ping 通网关,但打不开网页。这个案例最考验分层思维。拨号链路、地址分配都没问题,问题在链路之外。按顺序查:Dialer 口有没有 nat outbound(没有的话内网源地址带着 192.168.x.x 出去,运营商丢包);内网有没有默认路由指向 Dialer;PC 网关是否指对。三个逐个排除,通常一条就能定位。
一个排错心得:PPPoE 排错最忌讳"改配置碰运气"。因为每次拨号尝试都只给一个"通/不通"的二元结果,改一次配置重试一次,跟抽奖没区别。正确做法是把每一层单独验证:先证明物理层通(接口 up)、再证明发现阶段通(会话表能到 PppUp)、再证明 IPCP 通(Dialer 有地址)、再证明业务通(NAT + 路由 + 网关)。分层验证过的配置才叫"配通了",否则只是"碰巧通了"。
15.7 新手踩坑与注意事项
- 拨号组编号不一致——
dialer bundle 1与物理口pppoe-client dial-bundle-number 1是一对,一个写 1 一个写 2 就永远拨不上,而且不报错。 - 服务端漏掉地址池——
remote address pool不配,客户端 IPCP 阶段拿不到地址,“拨上又断"的经典原因。 - 本地用户没配服务类型——华为要
service-type ppp,H3C 还要class network,两处都配才认证得过。 - CHAP 用户名理解反了——
ppp chap user是"我向对方报的名字”,不是"对方的名字",写反了认证必然失败。 - 把
ip address ppp-negotiate与静态地址混用——两者互斥,拨号场景只能用前者。 - NAT 配在物理口上——拨号场景的地址在 Dialer 口上,NAT 必须配 Dialer 口。
- PPPoE 拨号口与服务器不在同一广播域——PADI 是二层广播,隔了三层就过不去。
- 忘配拨号触发规则——华为漏
dialer-rule 1 ip permit、H3C 漏dialer-group 1 rule ip permit,Dialer 口永远不主动拨号。 - PPPoE 的 MTU 是 1492 不是 1500——大包不通先怀疑 MTU,别死磕拨号过程。
- 密码用
simple存——H3C 的password simple在配置回显里是明文的,生产环境一律cipher。
15.8 本章小结
- PPP 分三层:LCP 建链、认证核身、NCP/IPCP 拿地址,必须按顺序走通,排错也必须按这个顺序从下往上查。
- PAP 明文传密码、两次握手;CHAP 挑战响应、三次握手、不传明文,现代配置一律用 CHAP。
- PPPoE = 以太网上跑 PPP,分发现阶段(PADI/PADO/PADR/PADS,以太网类型 0x8863)和会话阶段(0x8864)。
- 服务器端核心是"物理口绑虚拟模板 + 虚拟模板管认证与地址池";客户端核心是"Dialer 口管参数 + 物理口挂进拨号组"。
- 华为与 H3C 主体命令高度同构,主要差异在本地用户的
class network、拨号触发规则(dialer-rule 1 ip permitvsdialer-group 1 rule ip permit)、dialer bundle带不带编号、以及密码存储关键字。 - 验证按"服务器会话 → 客户端会话 → Dialer 接口 → 默认路由"四步走。
一张纸记牢本章。把本章压缩成三段,贴在工位上就够用:
第一段"是什么":PPP 是电话线上的礼仪(LCP 建链 → 认证 → IPCP 拿地址),PPPoE 是把这套礼仪搬到以太网上(先 PADI/PADO/PADR/PADS 找到对象,再跑 PPP)。
第二段"怎么配":服务器端 = 地址池 + 虚拟模板(认证 + remote address pool)+ 物理口 bind;客户端端 = dialer-rule + Dialer 口(CHAP 凭据 + ppp-negotiate + bundle + group)+ 物理口 dial-bundle-number;最后在 Dialer 口上补 NAT。
第三段"怎么查":display pppoe-server session all 看有没有会话,display pppoe-client session summary 看客户端状态,display interface Dialer 1 看 LCP/IPCP 与地址,display ip routing-table 看默认路由,display nat outbound 看出口转换。哪一条对不上,问题就在那一层。
最后再强调一次分层思维。本章看起来讲的是两个协议,实际上训练的是一种通用的排障能力:把一条链路的建立过程拆成可以单独验证的若干层,每层都有明确的状态标志和观测命令。学会了这个套路,以后遇到 IPSec、SSL VPN、甚至 BGP 邻居建不起来,都能照搬同一套"先下后上、先建后配"的思路。这才是本章最值钱的东西。
自测题
- PPP 的协商顺序是什么?如果认证阶段失败,IPCP 会不会开始?
ppp chap user branch01这行命令里的branch01是"谁的名字"?- PPPoE 的发现阶段有哪四个报文,各自作用是什么?
- 拨号成功后内网 PC 上不了网,按顺序应该查哪三件事?
- 为什么 PPPoE 链路的 MTU 通常配成 1492?
- LCP 建立链路 → 认证(PAP/CHAP)→ NCP/IPCP 协商网络层。认证失败则链路终止,IPCP 不会开始。
- 是"本端向对端报上去的用户名",必须与对端(服务器)本地保存的用户名一致。
- PADI(客户端广播找服务器)、PADO(服务器单播回应)、PADR(客户端请求会话)、PADS(服务器分配 Session ID)。
- 一是 Dialer 口有没有配 NAT;二是内网有没有指向 Dialer 口的默认路由;三是 PC 网关是否正确指向路由器内网接口。
- 因为 PPPoE 在以太网帧中额外封装了 8 字节的 PPPoE 头,以太网 MTU 1500 减去 8 就是 1492。
关于本书:《华为 / H3C 网络设备典型功能配置详解》—— 面向国内高校/企业网络环境, 华为 VRP 与 H3C Comware 双厂商并排配置的实操教材,共 43 章。 全书所有命令尽量有官方出处,查不到的显式标注「待核实」。 返回系列目录
本人保留对侵权者及其全家发动因果律武器的权利
版权提醒
如无特殊申明,本站所有文章均是本人原创。转载请务必附上原文链接:https://www.elliot98.top/post/huawei-h3c-book/15/。
如有其它需要,请邮件联系!版权所有,违者必究!