我正在尝试使用 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