本教程将以 RHEL/CentOS 7/8/9 或 Ubuntu/Debian 为例,使用 ppp 和 pppoe 这两个核心软件包来搭建,整个过程分为以下几个步骤:

- 环境准备
- 安装必要的软件
- 配置 PPPoE 服务器
- 配置 PPPoE 客户端(用于测试)
- 启动服务与测试
- 高级配置(可选,如分配静态IP)
环境准备
在开始之前,请确保你的服务器满足以下条件:
- 操作系统: 一台安装好的 Linux 服务器(本教程以 CentOS 7 和 Ubuntu 20.04 为例)。
- 网络接口: 服务器需要有一个连接到局域网的网卡(
eth0或ens33),这个网卡将作为 PPPoE 客户端连接的入口。 - IP 地址: 该网卡需要有一个静态的 IP 地址,这个 IP 地址将成为 PPPoE 服务器的“网关”地址。
168.100.1/24
- 客户端: 另一台电脑(Windows 或 Linux),用于作为 PPPoE 客户端进行连接测试。
安装必要的软件
对于 RHEL/CentOS 7/8/9
使用 yum 或 dnf 包管理器安装 ppp 和 rp-pppoe。
# CentOS 7 sudo yum install ppp rp-pppoe # CentOS 8/9 sudo dnf install ppp rp-pppoe
对于 Ubuntu/Debian
使用 apt 包管理器安装 ppp 和 pppoe。
sudo apt update sudo apt install pppoe ppp
配置 PPPoE 服务器
这是最核心的步骤,主要配置文件是 /etc/ppp/pppoe-server-options。

1 创建主配置文件
我们需要创建或编辑 PPPoE 服务器的配置文件,这个文件定义了服务器提供给客户端的各种选项。
sudo nano /etc/ppp/pppoe-server-options
粘贴到文件中,我会逐行解释其含义:
# ================================================================= # PPPoE Server Configuration File # ================================================================= # 1. 核心网络设置 # noipdefault: 不使用客户端提供的 IP 地址,而是由服务器分配。 # defaultroute: 客户端将把服务器的 IP 作为默认网关。 # replacedefaultroute: 如果客户端已有默认路由,则用 PPPoE 的路由替换它。 # noccp: 不使用压缩控制协议。 # noaccomp: 不接受地址和控制字段压缩。 # novj: 不使用 Van Jacobson 头部压缩。 # nobsdcomp: 不使用 BSD 压缩。 # nodeflate: 不使用 DEFLATE 压缩。 # novjccomp: 不使用 Van Jacobson 头部压缩的校验。 # mtu 1492: PPPoE 协议本身有 8 字节的开销,以太网 MTU 1500 - 8 = 1492。 # mru 1492: 同上,设置最大接收单元。 lcp-echo-interval 10 lcp-echo-failure 3 # 2. IP 地址分配池 # 我们定义一个地址池,用于给客户端分配 IP 地址。 # local 192.168.100.1: 指定服务器的 IP 地址。 # remote 192.168.100.100-192.168.100.200: 定义客户端的 IP 地址池。 local 192.168.100.1 remote 192.168.100.100-192.168.100.200 # 3. 认证方式 # usepeerdns: 客户端使用服务器提供的 DNS 服务器地址。 # require-chap: 要求使用 CHAP 认证协议(比 PAP 更安全)。 # name pppoe-server: 设置服务器的名称,用于 CHAP 认证。 # logfile /var/log/pppoe.log: (可选) 设置日志文件。 usepeerdns require-chap name pppoe-server # 4. 日志记录 # 将所有连接和认证信息记录到系统日志中。 # 在 systemd 系统中,这些日志可以通过 'journalctl -u pppoe-server' 查看。 logfile /var/log/pppoe.log
关键配置解释:
local: 必须设置,填写你服务器网卡的静态 IP 地址。remote: 必须设置,定义 PPPoE 客户端可以获取的 IP 地址范围。name: 定义服务器的 CHAP 名称,客户端需要知道这个名称才能完成认证。require-chap: 强制使用 CHAP 认证,这是最安全的配置,我们将在下一步创建对应的用户名和密码。
2 创建 CHAP 认证文件
CHAP 认证需要服务器存储客户端的用户名和密码,文件路径为 /etc/ppp/chap-secrets。

sudo nano /etc/ppp/chap-secrets
文件格式为:客户端名 服务器名 密码 IP地址或*
# Secrets for authentication using CHAP # client server secret IP addresses testuser1 pppoe-server mypassword1 * testuser2 pppoe-server anotherpassword *
testuser1: 客户端拨号时使用的用户名。pppoe-server: 必须与/etc/ppp/pppoe-server-options文件中的name设置完全一致。mypassword1: 对应的密码。- 表示该用户可以从
remote定义的地址池中获取任意一个 IP 地址,如果想给用户分配固定 IP,可以写成168.100.101。
3 配置内核 IP 转发(非常重要!)
为了让 PPPoE 客户端能够通过服务器访问外部网络,服务器必须开启 IP 转发功能。
编辑 /etc/sysctl.conf 文件:
sudo nano /etc/sysctl.conf
找到或添加下面这一行:
net.ipv4.ip_forward = 1
然后使配置立即生效:
sudo sysctl -p
4 配置 NAT (网络地址转换)
为了让 PPPoE 客户端能上网,你需要将客户端的私有 IP 网络流量通过服务器的公网网卡进行 NAT 转换。
假设:
- PPPoE 客户端网段:
ppp(虚拟接口) - 服务器连接外网的网卡:
eth0(假设它有公网 IP 或已连接到互联网)
使用 iptables 命令设置 NAT 规则:
# 1. 清空现有的 NAT 规则(可选,避免冲突) sudo iptables -t nat -F # 2. 启用 MASQUERADE(伪装),将 ppp 网段的流量伪装成 eth0 的 IP sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 3. 允许 IP 转发 sudo iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -o ppp+ -m state --state RELATED,ESTABLISHED -j ACCEPT # 4. 保存规则 (CentOS/RHEL 7+) sudo service iptables save # 或者 (CentOS/RHEL 8+) sudo dnf install iptables-services sudo systemctl enable iptables sudo systemctl save iptables # 5. 保存规则 (Ubuntu/Debian) sudo apt install iptables-persistent sudo netfilter-persistent save
配置 PPPoE 客户端(用于测试)
我们来配置另一台电脑作为客户端,连接刚刚搭建的服务器。
对于 Windows 客户端
- 打开 "网络和 Internet 设置" -> "网络和共享中心"。
- 点击 "更改适配器选项"。
- 右键点击你正在使用的网络连接(如 "以太网"),选择 "属性"。
- 在 "网络" 选项卡中,点击 "安装"。
- 选择 "协议",然后点击 "添加"。
- 选择 "PPPoE 协议",点击 "确定"。
- 勾选 "为此连接使用以下项目",输入:
- ISP名称: 任意填写,"MyPPPoE"。
- 用户名:
testuser1(你在服务器上创建的用户名)。 - 密码:
mypassword1(对应的密码)。
- 点击 "连接"。
对于 Linux 客户端
可以使用 pppoeconf 命令(Debian/Ubuntu)或手动配置。
使用 pppoeconf (推荐,适用于 Debian/Ubuntu):
sudo pppoeconf
然后按照向导提示操作:
- 选择你的网卡(如
eth0)。 - 创建 PPP 连接,输入用户名 (
testuser1) 和密码 (mypassword1)。 - 设置 "Use default routing" 和 "Don't use peer DNS" 等选项,通常保持默认即可。
启动服务与测试
1 启动 PPPoE 服务器
在服务器上,使用 pppoe-server 命令启动服务。
# 基本启动命令,指定服务器监听的网卡和配置文件 sudo pppoe-server -I eth0 -C pppoe-server -F -L /etc/ppp/pppoe-server-options
-I eth0: 指定监听的网络接口。请务必替换成你自己的网卡名。-C pppoe-server: 指定服务器的名称,必须与chap-secrets文件中的服务器名一致。-F: 以后台守护进程模式运行。-L: 指定配置文件的完整路径。
2 检查服务状态
- 查看进程:
ps aux | grep pppoe-server
- 查看日志: 我们在配置中指定了日志文件。
tail -f /var/log/pppoe.log
当客户端连接时,你应该能看到类似
PPPoE connection from ... on interface ...的日志。
3 验证客户端连接
- 在客户端电脑上发起 PPPoE 连接。
- 连接成功后,客户端应该获得一个 IP 地址(
168.100.101)。 - 在客户端上
ping服务器的 IP (168.100.1),应该能通。 - 在客户端上
ping一个公网地址(如8.8.8),如果服务器配置了 NAT 且能上网,也应该能通。
高级配置(可选)
分配静态 IP 给特定用户
如果你希望某个用户(adminuser)每次连接都获得固定的 IP 地址(168.100.110),只需修改 /etc/ppp/chap-secrets 文件:
adminuser pppoe-server adminpass 192.168.100.110
这样,当 adminuser 拨号时,服务器就会强制分配 168.100.110 这个 IP 地址给他。
设置开机自启
为了方便管理,可以创建一个 systemd 服务文件。
创建 /etc/systemd/system/pppoe-server.service:
[Unit] Description=PPPoE Server Daemon After=network.target [Service] Type=forking ExecStart=/usr/sbin/pppoe-server -I eth0 -C pppoe-server -F -L /etc/ppp/pppoe-server-options ExecStop=/usr/bin/killall pppoe-server Restart=on-failure PIDFile=/var/run/pppoe-server.pid [Install] WantedBy=multi-user.target
然后启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable pppoe-server sudo systemctl start pppoe-server
你的 PPPoE 服务器就搭建完成了,并且会在服务器重启后自动启动。
