ppp
ppp (Paul's PPP Package) 是一个开源软件包,它在 Linux 和 Solaris 系统上实现了点对点协议 (PPP)。它作为一个单独的 pppd 守护进程实现,并作为 xl2tpd、pptpd 和 netctl 的后端。3G、L2TP 和 PPPoE 连接在内部都基于 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
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
以 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
- 重启
pppd
服务。
伪装似乎工作正常,但某些网站无法访问
pppoe 下的 MTU 为 1492 字节。大多数网站使用 1500 的 MTU。因此您的连接发送一个 ICMP 3:4(需要分片)数据包,要求更小的 MTU,但某些网站的防火墙会阻止它。
在 iptables 中启用 PMTU 钳制可以解决此问题
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
重启后将加载正确的模块。