Ether Blog

接入网综合课设

2025-03-10

接入网综合课设

阶段一

  1. 完成虚拟机选型,并配置至少两个网段, 分别测试子网内和子网间连通性;

  2. 设计PPPOE本地认证拓扑图及IP地址规划 (客户至少两个网段) ;

  3. 选型PPPOE服务器软件,并在虚拟环境下 完成PPPoE接入本地认证的搭建、配置、 实验测试。

任务一

子网规划

虚拟机选型:ubuntu20.04

配置网段:

子网规划

配置流程

  1. 在ubuntu编辑-虚拟网络编辑器中选择更改设置,赋予管理员权限后选择添加网络,类型为仅主机模式,修改子网IP和子网掩码。

虚拟网络编辑器

  1. 在ubuntu虚拟机设置中添加网卡,三张为子网规划中定义所对应的网卡。

虚拟机设置

硬件设置

对应网络适配器选择自定义-特定虚拟网络-选择对应网卡-确定。

虚拟机设置

  1. 在ubuntu中输入
ifconfig

出现对应网卡信息。

网卡信息

  1. 配置静态IP。参考博客:Ubuntu配置静态IP,注意与网卡名称匹配。

Ubuntu 16.04 及更早版本:网络管理工具使用 ifupdown,网络配置文件在 /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 192.168.10.10
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 8.8.8.8 8.8.4.4

auto eth2
iface eth2 inet static
address 192.168.20.10
netmask 255.255.255.0
gateway 192.168.20.1

auto eth3
iface eth3 inet static
address 192.168.30.10
netmask 255.255.255.0
gateway 192.168.30.1

Ubuntu 17.10 及更高版本:网络管理工具使用 Netplan,配置文件位于 /etc/netplan/00-installer-config.yaml

# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: true
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

ens37:
addresses: [192.168.10.10/24]
routes:
- to: default
via: 192.168.10.1
dhcp4: false
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

ens38:
addresses: [192.168.20.10/24]
routes:
- to: default
via: 192.168.20.1
dhcp4: false
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

ens39:
addresses: [192.168.30.10/24]
routes:
- to: default
via: 192.168.30.1
dhcp4: false
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

配置完成后执行命令使配置生效。

sudo netplan apply

执行ifconfig命令查看当前IP地址。

测试

子网间连通性

Linux子网间连通性

Client1(192.168.10.20)

Client1子网间连通性

Client2(192.168.20.20)

image-20250308132954522

子网内连通性

Client1(192.168.10.20)

Client1子网内连通性

Client2(192.168.20.20)

image-20250308133215681

任务三

PPPoE服务器端

参考博客:基于Linux环境的PPPOE服务器搭建

  1. 安装PPPoE服务器程序
sudo apt-get install pppoe

使用pppoe-server -h查看pppoe安装情况及版本,该PPPoE-Server版本为3.12。

PPPoE服务器版本

  1. 编辑/etc/ppp/options文件
14+ ms-dns 8.8.8.8
57 local
144 #+pap // 关闭pap
147 -pap
151 +chap // 开启chap
154 #-chap
208 proxyarp
  1. 编辑 pppoe-server-options文件

创建/etc/ppp/pppoe-server-options文件,使用chap验证协议require-chap,如果使用pap验证协议则配置为 require-pap。

auth
require-chap
lcp-echo-interval 60
lcp-echo-failure 5
logfile /var/log/pppd.log
  1. 编辑/etc/ppp/chap-secrets 文件
# Secrets for authentication using CHAP
# client server secret IP addresses
test * test *

用户名为test,密码为test,服务器名和IP地址为任意。

  1. 开启IP转发功能

​ 编辑/etc/sysctl.conf文件:

28 net.ipv4.ip_forward=1

​ 运行sudo sysctl -p生效配置。

  1. 启动PPPoE服务器
sudo pppoe-server -I ens37 -L 192.168.10.10 -R 192.168.10.11 -N 20   
sudo pppoe-server -I ens38 -L 192.168.20.10 -R 192.168.20.11 -N 20

指令含义:

pppoe-server 启动 PPPoE 服务器进程
-I xxx 监听物理网卡xxx,接受客户端的 PPPoE 拨号请求
-L IP地址 PPP 服务器的 IP 地址
-R IP地址 客户端分配 IP 的起始地址
-N n 最多允许 n 个 PPPoE 客户端同时连接
  1. 查看PPPoE服务器的启用情况
ps -ef|grep pppoe

pppoe服务器的启用情况

sudo killall pppoe-server

PPPoE客户端

Windows端拨号步骤:

  1. 选择网络和Internet设置

选择网络和Internet设置

  1. 选择拨号-设置新连接-连接到Internet-下一页-宽带

拨号选择

  1. 输入用户名和密码

    用户名和密码

  2. 连接成功

拨号成功

测试

客户端连接成功后,在服务器端输入ifconfig会看到PPP接口信息

PPP接口

在客户端输入ipconfig /all 会看到PPP服务器分配的IP地址

Client1(192.168.10.20)

Client1

测试ping通:

Client1

Client2(192.168.20.20)

Client2

测试ping通:

Client2

抓包分析

注意:执行 sudo wireshark

Filter 选择pppoe|ppoes。

PPPoE报文类型

阶段 以太网协议号 报文类型
发现阶段(Discovery) 0x8863 PADI, PADO, PADR, PADS, PADT
会话阶段(Session) 0x8864 PPP 数据包(LCP、PAP/CHAP、IP 数据等)

PPPoE交互过程

PPPoE交互过程

抓包pppoed

抓包pppoes-1

抓包pppoes-2

PPPoE 发现阶段

PPPoE 发现阶段用于 建立 PPPoE 连接有5种报文:

  1. PADI(PPPoE Active Discovery Initiation)

抓包pppoed-PADI

  1. PADO(PPPoE Active Discovery Offer)

抓包pppoed-PADO

  1. PADR(PPPoE Active Discovery Request)
  1. PADS(PPPoE Active Discovery Session-confirmation)

抓包pppoed-PADS

  1. PADT(PPPoE Active Discovery Terminate)

PPPoE 会话阶段

PPPoE 发现阶段完成后,客户端和服务器通过 PPPoE 会话 ID 进行通信。
此时 PPPoE 封装标准 PPP 报文,包括4种报文:

  1. LCP(Link Control Protocol):链路协商。
  2. PAP/CHAP(Password Authentication Protocol / Challenge Handshake Authentication Protocol): 用户身份认证。
  3. NCP(Network Control Protocol) : 分配 IP 地址。
  4. IP 数据报文: 网络通信数据(TCP/IP、UDP)。

阶段二

  1. 设计PPPoE+RADIUS远程接入控制拓扑图及IP地址规划(客户机至少两个网段)。
  2. 选型RADIUS服务器软件,并在虚拟平台下完成PPPOE+RADIUS远程接入认证的搭建、配置、实验测试。

任务一

42

任务二

配置Radius服务器及客户端静态IP

sudo gedit /etc/netplan/01-network-manager-all.yaml
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: true # 启用 DHCP
nameservers:
addresses: [8.8.8.8, 8.8.4.4] # DNS 配置

ens37:
addresses: [192.168.30.2/24]
routes:
- to: default
via: 192.168.30.1
dhcp4: false
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

配置完成后执行命令使配置生效。

sudo netplan apply

执行ifconfig命令查看当前IP地址

40

# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: true # 启用 DHCP
nameservers:
addresses: [8.8.8.8, 8.8.4.4] # DNS 配置

ens37:
addresses: [192.168.10.1/24] # 静态 IP 地址
routes:
- to: default
via: 192.168.10.1 # 默认网关
dhcp4: false # 禁用 DHCP
nameservers:
addresses: [8.8.8.8, 8.8.4.4] # DNS 配置

ens38:
addresses: [192.168.20.1/24] # 静态 IP 地址
routes:
- to: default
via: 192.168.20.1 # 默认网关
dhcp4: false # 禁用 DHCP
nameservers:
addresses: [8.8.8.8, 8.8.4.4] # DNS 配置

ens39:
addresses: [192.168.30.1/24] # 静态 IP 地址
routes:
- to: default
via: 192.168.30.1 # 默认网关
dhcp4: false # 禁用 DHCP
nameservers:
addresses: [8.8.8.8, 8.8.4.4] # DNS 配置

link: ens37
addresses:
- 192.168.10.129/25

配置完成后执行命令使配置生效。

sudo netplan apply

执行ifconfig命令查看当前IP地址

41

安装Radius服务器

  1. 下载Radius:

    freeradius官方网站:http://freeradius.org/download.html

    freeradius官方文档:

  2. 解压:

    tar -zxvf freeradius-server-3.0.27.tar.gz 
  3. 安装依赖项

    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
  4. 编译及安装

    cd  freeradius-server-3.0.26
    ./configure
    make
    sudo make install # 默认安装在 /usr/local/etc/raddb下
  5. 启动Radius

    # debug模式启动
    sudo radiusd -X

    # 后台进程方式启动
    systemctl start radiusd
    systemctl enable radiusd

    # 日志
    /var/log/radius/radius.log
  6. 添加用户

    在 /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

    本地测试成功

    34

创建数据库

1.安装mariadb

sudo apt update
sudo apt install mariadb-server mariadb-client
sudo systemctl start mariadb
sudo systemctl enable mariadb

若此时直接运行安全设置mysql_secure_installation,则报错:

xu@xu-virtual-machine:~/Desktop$ mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Enter current password for root (enter for none):
Aborting!

Cleaning up...

这是因为 MariaDB 默认使用 auth_socket 插件 进行身份验证,它不接受通过普通密码登录,只通过 Unix 套接字进行验证。

解决方案:

​ 运行mysql_secure_installation进行安全设置:

35
  1. 进入数据库
mysql -uroot -p
  1. 创建数据库并授权
MariaDB [(none)]> create database radius;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on radius.* to radius@'localhost' identified by 'radius';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

配置Radius服务器端和数据库

  1. 导入数据库
cd /usr/local/etc/raddb/mods-config/sql/main/mysql
mysql -u radius -p radius< schema.sql

如果报错:

root@xu-virtual-machine:/usr/local/etc/raddb/mods-config/sql/main/mysql# mysql -u radius -p radius< schema.sql
Enter password:
ERROR 1045 (28000): Access denied for user 'radius'@'localhost' (using password: YES)

这是因为 MySQL 用户 radiuslocalhost 上的访问被拒绝,重新设置密码

mysql -uroot -p
ALTER USER 'radius'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost';
FLUSH PRIVILEGES;
  1. 配置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 从数据库中读取客户端信息 、
  2. 客户端认证设置

sudo gedit /usr/local/etc/raddb/clients.conf

# 定义 PPPoE 客户端连接到服务器时需要使用的 IP 地址和密码(共享密钥)
client pppoe-server {
ipaddr = 192.168.30.1
secret = testing123
}
  1. 配置组与用户信息
sudo mysql -u root -p radius
insert into radgroupcheck (groupname,attribute,op,value) values  ('usr','Auth- Type',':=','Local');
insert into radgroupcheck (groupname,attribute,op,value) values ('usr','Service-Type',':=','Framed-User');
insert into radgroupcheck (groupname,attribute,op,value) values ('usr','Framed-IP-Address',':=','255.255.255.255');
insert into radgroupcheck (groupname,attribute,op,value) values ('usr','Framed-IP-Netmask',':=','255.255.255.0');

查看新建组 select * from radgroupcheck;

36

可以看到,usr 组的认证方式为 本地认证(Local)Service-Type 为 Framed-User,即拨号用户,用于 PPP/PPPoE 认证。分配给用户的 IP 地址为255.255.255.255,表示 不指定具体 IP 地址,由PPPoE 服务器动态分配。若分配了 IP 地址,默认子网掩码为 255.255.255.0

sudo gedit /usr/local/etc/raddb/users

# 对于 client-1
user1 Cleartext-Password := "test-1"
# 对于 client-2
user2 Cleartext-Password := "test-2"
INSERT INTO radcheck (username, attribute, op, value) VALUES ('user1', 'Cleartext-Password', ':=', 'test-1'); 
INSERT INTO radcheck (username, attribute, op, value) VALUES ('user2', 'Cleartext-Password', ':=', 'test-2');

查看用户信息 SELECT * FROM radcheck;

37

INSERT INTO radusergroup (username, groupname) VALUES ('user1', 'usr');
INSERT INTO radusergroup (username, groupname) VALUES ('user2', 'usr');

查看用户和组的关联信息 SELECT * FROM radusergroup;

38

在 FreeRADIUS 服务器的配置目录中启用 SQL 模块

sudo -i
cd /usr/local/etc/raddb/mods-enabled
ln -s /usr/local/etc/raddb/mods-available/sql ./

查看软链接信息 ls -l /usr/local/etc/raddb/mods-enabled/sql 39

radtest user1 test-1 127.0.0.1 0 testing123
radtest user2 test-2 127.0.0.1 0 testing123

44

配置Radius客户端

  1. 下载并安装RADIUS -clients
wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-client-1.1.7.tar.gz
tar -xzvf freeradius-client-1.1.7.tar.gz

cd freeradius-client-1.1.7/
./configure
sudo make
sudo make install
  1. 在 PPPoE 服务器中启用 RADIUS 认证

​ 在/etc/ppp/pppoe-server-options中增加

# 加载 radius.so 插件
plugin /usr/lib/pppd/2.4.7/radius.so
# 指定 RADIUS 客户端配置文件
radius-config-file /usr/local/etc/radiusclient/radiusclient.conf
  1. 配置radiusclient.conf文件
sudo gedit /usr/local/etc/radiusclient/radiusclient.conf

在文件末尾添加:

# 认证顺序:先本地认证,再 RADIUS 远程认证
auth_order local,radius

# RADIUS 认证服务器
authserver 192.168.30.2:1812
# RADIUS 计费服务器
acctserver 192.168.30.2:1813

# RADIUS 共享密钥存放
servers /usr/local/etc/radiusclient/servers
# RADIUS 共享密钥文件
seqfile /var/run/radius.seq
# RADIUS映射文件
mapfile /usr/local/etc/radiusclient/port-id-map
dictionary /usr/local/etc/radiusclient/dictionary
login_radius /usr/local/sbin/login.radius
  1. 配置 server 文件
sudo gedit /usr/local/etc/radiusclient/servers

在文件末尾添加:

# [RADIUS服务器IP]  [共享密钥]  [可选参数]
192.168.30.2 testing123
  1. 配置dictionary文件
sudo gedit /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

测试

45

输入正确用户及密码(user1,test-1),拨号成功

46

PPPoE服务器已分配地址:

47

上网测试:

49

在Radius服务器端本次会话记录:

50

输入错误用户及密码(user1,test-2),拨号失败

51

在Radius服务器端本次会话记录:

53

输入正确用户密码(user2,test-2),拨号成功

46

PPPoE服务器已分配地址:

48

上网测试:

49

在Radius服务器端本次会话记录:

52

输入错误用户及密码(user2,test-1),拨号失败

51

54

抓包分析

RADIUS报文格式

55

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 又分为:

RADIUS客户端与服务器交互过程:

56

57

Access-Request

58

Access-Accept

59

Access-Reject

60

Accounting-Request

61

Accounting-Response

62

遇到的问题及调试方法

在Radius全面配置好后,windows客户端无法直接拨号,否则显示691错误码,在radius端无信息反馈。推测PPPoE与客户端间传输存在问题。接回PPPoE本地测试可通。

使用sudo tail -f /var/log/syslog | grep ppp监听PPPoE服务器信息

当客户端拨号时,报错:

Apr  3 11:19:13 xu-virtual-machine pppd[2901]: rc_read_dictionary: invalid type on line 92 of dictionary /usr/local/etc/radiusclient/dictionary
Apr 3 11:19:13 xu-virtual-machine pppd[2901]: RADIUS: Can't read dictionary file /usr/local/etc/radiusclient/dictionary
Apr 3 11:19:13 xu-virtual-machine pppd[2901]: Peer user2 failed CHAP authentication
← Back to Home