接入网综合课设
阶段一
完成虚拟机选型,并配置至少两个网段, 分别测试子网内和子网间连通性;
设计PPPOE本地认证拓扑图及IP地址规划 (客户至少两个网段) ;
选型PPPOE服务器软件,并在虚拟环境下 完成PPPoE接入本地认证的搭建、配置、 实验测试。
任务一
子网规划
虚拟机选型:ubuntu20.04
配置网段:
- Vmnet1:192.168.10.0/24
- Vmnet2:192.168.20.0/24
- Vmnet3:192.168.30.0/24
配置流程
- 在ubuntu编辑-虚拟网络编辑器中选择更改设置,赋予管理员权限后选择添加网络,类型为仅主机模式,修改子网IP和子网掩码。
- 在ubuntu虚拟机设置中添加网卡,三张为子网规划中定义所对应的网卡。
对应网络适配器选择自定义-特定虚拟网络-选择对应网卡-确定。
- 在ubuntu中输入
|
出现对应网卡信息。
- 配置静态IP。参考博客:Ubuntu配置静态IP,注意与网卡名称匹配。
Ubuntu 16.04 及更早版本:网络管理工具使用 ifupdown
,网络配置文件在 /etc/network/interfaces
|
Ubuntu 17.10 及更高版本:网络管理工具使用 Netplan
,配置文件位于 /etc/netplan/00-installer-config.yaml
|
配置完成后执行命令使配置生效。
|
执行ifconfig
命令查看当前IP地址。
测试
子网间连通性
Client1(192.168.10.20)
Client2(192.168.20.20)

子网内连通性
Client1(192.168.10.20)
Client2(192.168.20.20)

任务三
PPPoE服务器端
- 安装PPPoE服务器程序
|
使用pppoe-server -h
查看pppoe安装情况及版本,该PPPoE-Server版本为3.12。
- 编辑/etc/ppp/options文件
- PAP:明文密码认证协议。
- CHAP:挑战握手认证协议,三次握手机制,使用哈希加密。
|
- 编辑 pppoe-server-options文件
创建/etc/ppp/pppoe-server-options文件,使用chap验证协议require-chap,如果使用pap验证协议则配置为 require-pap。
|
- 编辑/etc/ppp/chap-secrets 文件
|
用户名为test,密码为test,服务器名和IP地址为任意。
- 开启IP转发功能
编辑/etc/sysctl.conf文件:
|
运行sudo sysctl -p
生效配置。
- 启动PPPoE服务器
|
指令含义:
pppoe-server | 启动 PPPoE 服务器进程 |
---|---|
-I xxx | 监听物理网卡xxx,接受客户端的 PPPoE 拨号请求 |
-L IP地址 | PPP 服务器的 IP 地址 |
-R IP地址 | 客户端分配 IP 的起始地址 |
-N n | 最多允许 n 个 PPPoE 客户端同时连接 |
- 查看PPPoE服务器的启用情况
|
- 如果需要关闭PPPoE服务器,指令为:
|
每次电脑重启均需要重新运行PPPoE启动命令,设置开机自启动脚本:
创建systemd服务文件:
sudo gedit /etc/systemd/system/pppoe-server.service
[Unit]
Description=PPPoE Server Service
After=network.target # 等到网络启动后再启动
[Service]
ExecStart=/usr/local/bin/start-pppoe.sh
Restart=always
RestartSec=5
User=root
# 无限制重启
StartLimitIntervalSec=0
[Install]
WantedBy=multi-user.targetsudo gedit /usr/local/bin/start-pppoe.sh
创建脚本文件:
sudo gedit /usr/local/bin/start-pppoe.sh
#!/bin/bash
pppoe-server -I ens37 -L 192.168.10.10 -R 192.168.10.11 -N 20
pppoe-server -I ens38 -L 192.168.20.10 -R 192.168.20.11 -N 20
# 保持进程运行
tail -f /dev/null赋予执行权限:
sudo chmod +x /usr/local/bin/start-pppoe.sh
重新加载配置,重启服务:
sudo systemctl daemon-reload
sudo systemctl reset-failed
sudo systemctl enable pppoe-server
sudo systemctl start pppoe-server重启后检查服务状态:
ps -ef|grep pppoe
sudo systemctl status pppoe-server
注:如果systemd服务文件中没有添加
StartLimitIntervalSec=0
,脚本文件中没有tail -f /dev/null
,则有可能报错:sudo systemctl status pppoe-server
● pppoe-server.service - PPPoE Server Service
Loaded: loaded (/etc/systemd/system/pppoe-server.service; enabled; vendor>
Active: failed (Result: start-limit-hit) since Mon 2025-03-10 00:16:20 CS>
Process: 2386 ExecStart=/usr/local/bin/start-pppoe.sh (code=exited, status>
Main PID: 2386 (code=exited, status=0/SUCCESS)
3月 10 00:16:20 xu-virtual-machine systemd[1]: pppoe-server.service: Scheduled>
3月 10 00:16:20 xu-virtual-machine systemd[1]: Stopped PPPoE Server Service.
3月 10 00:16:20 xu-virtual-machine systemd[1]: pppoe-server.service: Start req>
3月 10 00:16:20 xu-virtual-machine systemd[1]: pppoe-server.service: Failed wi>
3月 10 00:16:20 xu-virtual-machine systemd[1]: Failed to start PPPoE Server Se>失败的原因:
start-limit-hit
,短时间内该服务多次失败,触发了 systemd 的启动限制机制。原脚本start-pppoe.sh
脚本执行完后立即退出,systemd 误以为它崩溃并尝试重启,导致触发start-limit-hit
。
PPPoE客户端
Windows端拨号步骤:
- 选择网络和Internet设置
- 选择拨号-设置新连接-连接到Internet-下一页-宽带
输入用户名和密码
连接成功
测试
客户端连接成功后,在服务器端输入ifconfig
会看到PPP接口信息
在客户端输入ipconfig /all
会看到PPP服务器分配的IP地址
Client1(192.168.10.20)
测试ping通:
Client2(192.168.20.20)
测试ping通:
抓包分析
注意:执行 sudo wireshark
Filter 选择pppoe|ppoes。
PPPoE报文类型
阶段 | 以太网协议号 | 报文类型 |
---|---|---|
发现阶段(Discovery) | 0x8863 |
PADI, PADO, PADR, PADS, PADT |
会话阶段(Session) | 0x8864 |
PPP 数据包(LCP、PAP/CHAP、IP 数据等) |
PPPoE交互过程
PPPoE 发现阶段
PPPoE 发现阶段用于 建立 PPPoE 连接有5种报文:
- PADI(PPPoE Active Discovery Initiation)
- 客户端 → 广播 发送 PADI(发现请求)。
- 用于查找可用的 PPPoE 服务器(AC, Access Concentrator)。
- 目标 MAC 地址:
FF:FF:FF:FF:FF:FF
(广播)。 - 只有Service-Name为空的服务器会响应。
- PADO(PPPoE Active Discovery Offer)
- 服务器(AC)→ 客户端 回复 PADO(提供服务)。
- 服务器响应客户端,表明自己可用。
- 包含 服务器名称 和 支持的服务。
- PADR(PPPoE Active Discovery Request)
客户端 → 服务器(AC) 发送 PADR(连接请求)。
用户主机可能会收到多个 PADO,但仅查看它收到的 PADO 数据包并选择一个,并请求建立会话。
包含 服务名 和 唯一的标识符。
- PADS(PPPoE Active Discovery Session-confirmation)
- 服务器(AC)→ 客户端 发送 PADS(会话确认)。
- 分配一个 PPPoE 会话 ID,表示连接已建立。
- PADT(PPPoE Active Discovery Terminate)
- 客户端或服务器 发送 PADT(终止连接)。
- 关闭 PPPoE 连接。
PPPoE 会话阶段
PPPoE 发现阶段完成后,客户端和服务器通过 PPPoE 会话 ID 进行通信。
此时 PPPoE 封装标准 PPP 报文,包括4种报文:
- LCP(Link Control Protocol):链路协商。
- PAP/CHAP(Password Authentication Protocol / Challenge Handshake Authentication Protocol): 用户身份认证。
- NCP(Network Control Protocol) : 分配 IP 地址。
- IP 数据报文: 网络通信数据(TCP/IP、UDP)。
阶段二
- 设计PPPoE+RADIUS远程接入控制拓扑图及IP地址规划(客户机至少两个网段)。
- 选型RADIUS服务器软件,并在虚拟平台下完成PPPOE+RADIUS远程接入认证的搭建、配置、实验测试。
任务一
任务二
- RADIUS服务器:FreeRADIUS 3.0.27 (最新stable版本)
- RADIUS客户端:FreeRADIUS -client-1.1.7
配置Radius服务器及客户端静态IP
|
- 服务器
|
配置完成后执行命令使配置生效。
|
执行ifconfig
命令查看当前IP地址
- 客户端(PPPoE服务器)
|
配置完成后执行命令使配置生效。
|
执行ifconfig
命令查看当前IP地址
安装Radius服务器
下载Radius:
freeradius官方网站:http://freeradius.org/download.html
freeradius官方文档:
解压:
tar -zxvf freeradius-server-3.0.27.tar.gz
安装依赖项
sudo apt update
sudo apt install build-essential -y
sudo apt install libtalloc-dev -y
sudo apt install libssl-dev -y
sudo apt install libhiredis-dev -y
sudo apt install freeradius-mysql编译及安装
cd freeradius-server-3.0.26
./configure
make
sudo make install # 默认安装在 /usr/local/etc/raddb下启动Radius
# debug模式启动
sudo radiusd -X
# 后台进程方式启动
systemctl start radiusd
systemctl enable radiusd
# 日志
/var/log/radius/radius.log添加用户
在 /usr/local/etc/raddb/users 的末尾添加:
# test 的用户设置明文密码为 "test"
# user Cleartext-Password := "password"
test Cleartext-Password := "test"# radtest <用户名> <密码> <服务器地址> <端口> <共享密钥>
radtest testing password123 127.0.0.1 0 testing123本地测试成功
创建数据库
1.安装mariadb
|
若此时直接运行安全设置mysql_secure_installation
,则报错:
|
这是因为 MariaDB 默认使用 auth_socket
插件 进行身份验证,它不接受通过普通密码登录,只通过 Unix 套接字进行验证。
解决方案:
通过root用户登录:
sudo mysql -u root
禁用
auth_socket
插件并设置密码:sudo mysql
USE mysql;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1');
# 刷新权限并退出
FLUSH PRIVILEGES;
EXIT;
运行mysql_secure_installation
进行安全设置:

- 进入数据库
|
- 创建数据库并授权
|
配置Radius服务器端和数据库
- 导入数据库
|
如果报错:
|
这是因为 MySQL 用户 radius
在 localhost
上的访问被拒绝,重新设置密码
|
配置Radius
配置default文件
sudo -i
gedit /usr/local/etc/raddb/sites-enabled/default使用数据库储存用户信息/计费:
在538行authenticate {}部分,注释files,解注释sql
在673行accounting{}部分,解注释 sql
配置sql文件
sudo -i
gedit /usr/local/etc/raddb/mods-available/sql
# 设置文件
tls_required = no
driver = "rlm_sql_mysql" # 指定 FreeRADIUS 使用 MySQL 数据库作为后端数据库来进行认证和计费
dialect = "mysql" # mysql 表示使用 MySQL 数据库的 SQL 方言
server = "localhost" # 数据库运行在本地计算机上
port = 3306
login = "radius"
password = "radius"
radius_db = "radius"
read_clients = yes # 允许 FreeRADIUS 从数据库中读取客户端信息 、
客户端认证设置
|
- 配置组与用户信息
- 进入radius库
|
- 新建组
|
查看新建组 select * from radgroupcheck;
可以看到,usr
组的认证方式为 本地认证(Local), Service-Type
为 Framed-User,即拨号用户,用于 PPP/PPPoE 认证。分配给用户的 IP 地址为255.255.255.255,表示 不指定具体 IP 地址,由PPPoE 服务器动态分配。若分配了 IP 地址,默认子网掩码为 255.255.255.0
。
配置 RADIUS 认证用户
定义 RADIUS 用户,用于身份验证。
|
- 插入用户
|
查看用户信息 SELECT * FROM radcheck;
- 关联用户和组
|
查看用户和组的关联信息 SELECT * FROM radusergroup;
- 建立软链接
在 FreeRADIUS 服务器的配置目录中启用 SQL 模块
|
查看软链接信息 ls -l /usr/local/etc/raddb/mods-enabled/sql
- 本地测试用户链接:
|
配置Radius客户端
- 下载并安装RADIUS -clients
|
- 在 PPPoE 服务器中启用 RADIUS 认证
在/etc/ppp/pppoe-server-options中增加
|
- 配置radiusclient.conf文件
|
在文件末尾添加:
|
- 配置 server 文件
|
在文件末尾添加:
|
- 配置dictionary文件
|
在文件末尾添加:
|
测试
PPPoE服务器启动情况
Radius服务器启动情况
- Client1
输入正确用户及密码(user1,test-1),拨号成功
PPPoE服务器已分配地址:
上网测试:
在Radius服务器端本次会话记录:
输入错误用户及密码(user1,test-2),拨号失败
在Radius服务器端本次会话记录:
- Client2
输入正确用户密码(user2,test-2),拨号成功
PPPoE服务器已分配地址:
上网测试:
在Radius服务器端本次会话记录:
输入错误用户及密码(user2,test-1),拨号失败
抓包分析
RADIUS报文格式
RADIUS 报文类型分为 认证报文 和 计费报文:
1. 认证报文(Authentication Messages)
认证报文用于 用户身份验证,确保用户合法,并为其分配相应权限。常见类型如下:
报文类型 | 代码 | 作用 |
---|---|---|
Access-Request | 1 |
认证请求,客户端(NAS)向 RADIUS 服务器发送,包含用户名、密码等信息 |
Access-Accept | 2 |
认证通过,RADIUS 服务器返回,NAS 允许用户访问 |
Access-Reject | 3 |
认证失败,RADIUS 服务器拒绝用户访问 |
Access-Challenge | 11 |
质询认证,要求客户端提供额外凭证(如 EAP 认证) |
** 2. 计费报文(Accounting Messages)**
计费报文用于 记录用户上网时长、流量等信息,用于后续计费。常见类型如下:
报文类型 | 代码 | 作用 |
---|---|---|
Accounting-Request | 4 |
计费请求,NAS 发送给 RADIUS 服务器,包含用户会话信息 |
Accounting-Response | 5 |
计费响应,RADIUS 服务器收到计费信息后确认 |
Accounting-Request
又分为:
- Start(用户上线):用户开始上网时发送,记录
acctstarttime
。 - Interim-Update(状态更新):定期发送,更新流量、时长等数据。
- Stop(用户下线):用户断开时发送,记录
acctstoptime
、acctsessiontime
、流量。
RADIUS客户端与服务器交互过程:
Access-Request:
Access-Accept
Access-Reject
Accounting-Request
Accounting-Response
遇到的问题及调试方法
在Radius全面配置好后,windows客户端无法直接拨号,否则显示691错误码,在radius端无信息反馈。推测PPPoE与客户端间传输存在问题。接回PPPoE本地测试可通。
使用sudo tail -f /var/log/syslog | grep ppp
监听PPPoE服务器信息
当客户端拨号时,报错:
|
把
/usr/local/etc/radiusclient/dictionary
文件中所有ipv6addr
和ipv6prdeix
改成string
下载dictionary.microsoft,只有使用该文件才支持Windows拨号
在
/usr/local/etc/radiusclient/dictionary
末尾加上INCLUDE /usr/local/etc/radiusclient/dictionary.sip
INCLUDE /usr/local/etc/radiusclient/dictionary.ascend
INCLUDE /usr/local/etc/radiusclient/dictionary.merit
INCLUDE /usr/local/etc/radiusclient/dictionary.compat
INCLUDE /usr/local/etc/radiusclient/dictionary.microsoft之后再拨号,Radius服务器端显示报错信息,根据具体报错信息修改即可。