ppp

来自 ArchWiki
(重定向自 Pppd

ppp (Paul's PPP Package) 是一个开源软件包,它在 Linux 和 Solaris 系统上实现了 点对点协议 (PPP)。它以单个 pppd 守护进程的形式实现,并作为 xl2tpdpptpdnetctl 的后端。3GL2TPPPPoE 连接在内部都基于 PPP 协议,因此可以由 ppp 管理。

安装

安装 ppp 软件包。

配置

PPPoE

创建连接配置文件

/etc/ppp/peers/your_provider
plugin pppoe.so
# rp_pppoe_ac 'your ac name'
# rp_pppoe_service 'your service name'

# network interface
eth0
# login name
name "someloginname"
usepeerdns
persist
# Uncomment this if you want to enable dial on demand
#demand
#idle 180
defaultroute
hide-password
noauth

如果使用了 usepeerdns 选项,pppd 将在建立连接时创建包含获取到的 DNS 地址的 /etc/ppp/resolv.conf 文件。默认情况下,/etc/ppp/ip-up.d/00-dns.sh hook 脚本会将此文件移动到 /etc/resolv.conf,从而允许系统使用这些名称服务器。如果这是不希望的(例如,您正在使用本地缓存 DNS),请根据需要编辑 /etc/ppp/ip-up.d/00-dns.sh

/etc/ppp/pap-secrets/etc/ppp/chap-secrets 中添加一行,具体取决于您的 ISP 使用的身份验证方法。

如果追求安全,应始终首选 Chap(要了解 chap 的工作原理,请参阅 这里),但是可以同时写入这两个文件,pppd 将自动使用适当的文件

someloginname * yourpassword

现在您可以使用以下命令启动链接

# pppd call your_provider

或者,您可以使用这个

# pon your_provider

其中 your_provider 是您在 /etc/ppp/peers 中的选项文件的确切名称。

要查看您的 PPPoE 连接是否正确启动,请检查系统日志中的 pppd 输出

# journalctl -b --grep=pppd

成功连接后,您将看到如下内容

Jul 09 22:42:33 localhost pppd[239]: Plugin rp-pppoe.so loaded.
Jul 09 22:42:33 localhost pppd[239]: RP-PPPoE plugin version 3.8p compiled against pppd 2.4.6
Jul 09 22:42:33 localhost network[184]: RP-PPPoE plugin version 3.8p compiled against pppd 2.4.6
Jul 09 22:42:33 localhost pppd[239]: pppd 2.4.6 started by root, uid 0
Jul 09 22:42:39 localhost pppd[239]: PPP session is 292
Jul 09 22:42:39 localhost pppd[239]: Connected to a0:f3:e4:4f:e3:b0 via interface enp4s0
Jul 09 22:42:39 localhost pppd[239]: Using interface ppp0
Jul 09 22:42:39 localhost pppd[239]: Connect: ppp0 <--> enp4s0
Jul 09 22:42:39 localhost pppd[239]: CHAP authentication succeeded: CHAP authentication success
Jul 09 22:42:39 localhost pppd[239]: CHAP authentication succeeded
Jul 09 22:42:39 localhost pppd[239]: peer from calling number A0:F3:E4:4F:E3:B0 authorized
Jul 09 22:42:39 localhost pppd[239]: Cannot determine ethernet address for proxy ARP
Jul 09 22:42:39 localhost pppd[239]: local  IP address 10.6.2.137
Jul 09 22:42:39 localhost pppd[239]: remote IP address 10.6.1.1
Jul 09 22:42:39 localhost pppd[239]: primary   DNS address 10.6.1.1
Jul 09 22:42:39 localhost pppd[239]: secondary DNS address 210.21.196.6

默认情况下,/etc/ppp/peers/provider 中的配置被视为默认配置,因此如果您想将 “your_provider” 设置为默认配置,您可以创建如下链接

# ln -s /etc/ppp/peers/your_provider /etc/ppp/peers/provider

现在您只需运行即可启动链接

# pon

要关闭连接,请使用此命令

# poff your_provider

使用 NetworkManager (nmcli)

在使用 NetworkManager 的系统上,您可以使用 nmcli 配置 PPPoE 连接

nmcli con edit type pppoe con-name "<Connection Name>"
nmcli> set pppoe.username <username>
nmcli> set pppoe.password <password>
nmcli> set connection.autoconnect <yes/no>
nmcli> save
nmcli> quit
提示:GNOME 中,不再可能从图形设置创建新的 PPPoE 连接,但可以通过 nmcli 创建后进行编辑。

简易向导配置

pppconfigAUR 提供了一个对话框界面,可以轻松创建 pppd 配置。用法非常简单,只需以 root 身份运行 pppconfig,它将引导您完成配置创建。

# pppconfig --dialog

可以使用之前提到的 pon 调用生成的配置,并使用 poff 丢弃。

在启动时启动 pppd

  • 配置 ppp_generic 模块在启动时加载。有关更多信息,请参阅 内核模块#systemd
  • 启用 systemd 服务 ppp@your_provider.service

技巧与诀窍

自动重拨

如果 pppd 正在运行,您可以通过向该进程发送 SIGHUP 信号来强制重置连接

# export PPPD_PID=$(pidof pppd)
# kill -s HUP $PPPD_PID

您已重新拨号连接。

注意: 确保您在 /etc/ppp/peers/provider 选项卡中启用了 persist 选项。此外,您可能希望设置 holdoff 0 以在不等待的情况下重新连接。

使用 cron

注意: 有许多 cron 实现,但默认情况下未安装任何实现,因为基本系统使用 systemd/Timers 代替。

以 root 身份执行以下操作

创建一个类似于此的 bash 脚本,并为其命名(例如 pppd_redial.sh

#!/bin/bash

message="Restarting the PPP connection @:" $(date)
pppd_id=$(pidof pppd)

kill -s HUP $pppd_id
echo $message

授予其执行权限,并将其放在 root 可见的路径上。

然后使用 crontab -e 创建一个 cron 作业。如果命令失败,请检查是否已设置 EDITOR 环境变量。所以在文件中任意位置添加,

0 4 * * * /bin/bash /root/pppd_redial.sh

确认 cronie 服务已启动并正在运行。如果不是这种情况,只需启用启动它。

保存并退出。您的 PPPoE 连接现在将在每天凌晨 4 点重启。

使用 systemd 计时器

强制重新连接的另一种方法是使用 systemd 计时器和 poff 脚本(特别是其 -r 选项)。只需创建具有相同名称的 .service.timer 文件

ppp-redial.timer
[Unit]
Description=Reconnect PPP connections daily

[Timer]
OnCalendar=*-*-* 05:00:00

[Install]
WantedBy=multi-user.target
ppp-redial.service
[Unit]
Description=Reconnect PPP connections

[Service]
Type=simple
ExecStart=/usr/bin/poff -r

现在只需启用启动计时器,systemd 将在指定时间导致重启。

故障排除

默认路由

如果在 pppd 启动之前您有预配置的默认路由,则会保留默认路由,因此请查看 /var/log/errors.log,如果您有类似

pppd[nnnn]: not replacing existing default route via xxx.xxx.xxx.xxx

并且 xxx.xxx.xxx.xxx 不是您的正确路由

  • /etc/ppp/ip-pre-up.d 中创建一个新脚本,内容如下
/etc/ppp/ip-pre-up.d/10-route-del-default.sh
#!/bin/sh
/usr/bin/route del default

此文章或章节的事实准确性存在争议。

原因: 以下注释是在考虑 rc 脚本的情况下编写的,自从切换到 systemd 后,它是否仍然适用?(在 Talk:Ppp 中讨论)
注意: 确保您有一个名为“ip-pre-up”的脚本,它像其他启动脚本一样启动“ip-pre-up.d”中的 *.sh。

伪装 (Masquerading) 似乎工作正常,但某些网站无法访问

pppoe 下的 MTU 为 1492 字节。大多数网站使用 1500 的 MTU。因此您的连接发送一个 ICMP 3:4(需要分片)数据包,要求更小的 MTU,但某些网站的防火墙阻止了它。

iptables 中启用 PMTU clamping 可以解决此问题

iptables -I FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

现在,出于某种原因,仅仅尝试使用 iptables-save 保存生成的 iptables 配置并在以后恢复它,是行不通的。它必须在其他 iptables 配置加载后执行。因此,这是一个 systemd 单元来解决它

pmtu-clamping.service
[Unit]
Description=PMTU clamping for pppoe
Requires=iptables.service
After=iptables.service

[Service]
Type=oneshot
ExecStart=/usr/bin/iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

[Install]
WantedBy=multi-user.target

启用它。

pppd 无法加载内核模块 ppp_generic

启动 PPTP 客户端时,pppd 进程无法找到相应的模块

Couldn't open the /dev/ppp device: No such device or address
Please load the ppp_generic kernel module.

解决方案是创建一个包含以下内容的 /etc/modprobe.d/ppp.conf 文件

alias char-major-108 ppp_generic

重启后将加载正确的模块。