如何检测 pppd 最近创建了哪个设备?

如何检测 pppd 最近创建了哪个设备?

我正在尝试使用 PPPD 通过 SSH 设置 VPN(如下拱门维基)。给出的命令是:

/usr/sbin/pppd updetach noauth silent nodeflate pty \
  "/usr/bin/ssh root@remote-gw /usr/sbin/pppd nodetach notty noauth"  \
  ipparam vpn 10.0.8.1:10.0.8.2

我已成功地通过对上述命令进行适当修改来设置它。要在服务器端连接到内部网络,我必须iptables在服务器端使用设置转发(盲目跟随这篇SF帖子):

iptables -A FORWARD -i ppp0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

我想自动化这个。现在,eth0已修复,但ppp0可能会发生变化(例如,其他人也开始了类似的设置)。如何检测pppd服务器端的命令创建了什么接口?解析dmesg?比较 的输出ip -o a?我可以pppd向我报告吗?

  • 客户端是最新的 Arch Linux
  • 服务器是最新的Ubuntu 14.04

dmesg似乎没用:

$ dmesg | grep -i ppp
[    0.803033] PPP generic driver version 2.4.2
[135747.442807] PPP BSD Compression module registered
[135747.459013] PPP Deflate Compression module registered

没有提及正在创建的设备。syslog似乎更有用:

Apr 26 13:52:15 server pppd[12725]: pppd 2.4.5 started by muru, uid 0
Apr 26 13:52:15 server pppd[12725]: Using interface ppp0
Apr 26 13:52:15 server pppd[12725]: Connect: ppp0 <--> /dev/pts/7
Apr 26 13:52:15 server pppd[12725]: BSD-Compress (15) compression enabled

Using interface ppp0条线似乎是我想要的。我想我可以这样得到:

awk '/started by muru/{getline; pppdev=$NF} END {print pppdev}'

我可以依赖 pppd 的输出吗?

答案1

最有可能的/etc/ppp/ip-up.d是您正在寻找的位置。

我的示例在 Gentoo Linux 上有效,但 Arch 上似乎也存在相同的目录结构。

每次建立 VPN 连接时/etc/ppp/ip-up都会运行,通常/etc/ppp/ip-up.d/*依次执行。它的第一个参数是连接的pppn设备。

/etc/ppp/ip-up.d/90-local例如将此脚本放在下面:

#!/bin/sh

# Optional trace:
# logger -t "ppp" "$6: $1 (${2:--}, $3) $4 --> $5"

iptables -A FORWARD -i $1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o $1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

您不妨pppd在运行脚本之前使用环境变量集。您正在寻找的人是$DEVICE。只需在上面的脚本中替换$1为:$DEVICE

iptables -A FORWARD -i $DEVICE -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o $DEVICE -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

有关建立连接时执行的man pppd操作的更多信息,请参阅 参考资料。pppd

相关内容