PPTP 客户端
pptpclient 是一个实现了 Microsoft PPTP 协议的程序。因此,它可以用于连接到学校或工作场所提供的 Microsoft VPN 网络(或任何基于 PPTP 的 VPN)。
安装
安装 pptpclient 软件包。
配置
要配置 pptpclient,您需要从您的网络管理员处收集以下信息
- VPN 服务器的 IP 地址或主机名。
- 您将用于连接的用户名。
- 您将用于连接的密码。
- 身份验证(Windows)域名。对于某些网络,这不是必需的。
您还必须决定隧道的名称。
使用 pptpsetup 配置
您可以使用 root 身份运行 pptpsetup 工具来配置和删除隧道。例如
pptpsetup --create my_tunnel --server vpn.example.com --username alice --password foo --encrypt pptpsetup --delete my_tunnel
隧道配置完成后,您可以 #连接。
手动配置
您也可以手动编辑所有必要的配置文件,而不是依赖 pptpsetup。
编辑 options 文件
/etc/ppp/options
文件设置 VPN 客户端的安全选项。如果您在连接到网络时遇到问题,您可能需要放宽这些选项。至少,此文件应包含选项 lock
、noauth
、nobsdcomp
和 nodeflate
。
/etc/ppp/options
# Lock the port lock # We don't need the tunnel server to authenticate itself noauth # Turn off compression protocols we know won't be used nobsdcomp nodeflate # We won't do PAP, EAP, CHAP, or MSCHAP, but we will accept MSCHAP-V2 # (you may need to remove these refusals if the server is not using MPPE) refuse-pap refuse-eap refuse-chap refuse-mschap
编辑 chap-secrets 文件
/etc/ppp/chap-secrets
文件包含用于验证隧道的凭据。确保只有 root 用户可以读取此文件,因为它包含敏感信息。
chmod 0600 /etc/ppp/chap-secrets
编辑文件。它具有以下格式
/etc/ppp/chap-secrets
<DOMAIN>\\<USERNAME> PPTP <PASSWORD> *
将每个带括号的术语替换为适当的值。如果您的连接不需要域名,请省略 <DOMAIN>\\
。
$
),请将其放在双引号 ("
) 中。命名您的隧道
/etc/ppp/peers/<TUNNEL>
文件包含特定于隧道的配置选项。<TUNNEL>
是您希望用于 VPN 连接的名称。该文件应如下所示
/etc/ppp/peers/<TUNNEL>
pty "pptp <SERVER> --nolaunchpppd" name <DOMAIN>\\<USERNAME> remotename PPTP require-mppe-128 file /etc/ppp/options ipparam <TUNNEL>
同样,如果您的连接不需要域名,请省略 <DOMAIN>\\
。<SERVER>
是 VPN 服务器的远程地址,<DOMAIN>
是您的用户所属的域名,<USERNAME>
是您将用于连接到服务器的名称,<TUNNEL>
是连接的名称。
remotename PPTP
用于在 /etc/ppp/chap-secrets
文件中查找 <PASSWORD>
。/etc/ppp/options
中删除 require-mppe-128
选项连接
为确保一切配置正确,请以 root 身份执行
# pon <TUNNEL> debug dump logfd 2 nodetach
如果一切配置正确,pon
命令不应终止。一旦您确信连接已成功建立,您可以终止该命令。
ip addr show
并确保新设备 ppp0
可用。要正常连接到您的 VPN,只需执行
# pon <TUNNEL>
其中 <TUNNEL>
是您之前建立的隧道的名称。请注意,此命令应以 root 身份运行。
路由
连接到 VPN 后,您应该能够与 VPN 服务器上可用的任何内容进行交互。要访问远程网络上的任何内容,您需要向路由表添加新路由。
有关如何添加路由的更多信息,您可以阅读本文,其中包含更多示例:PPTP 路由指南
分流隧道
目标为 VPN 网络的数据包应通过 VPN 接口(通常为 ppp0
)路由。为此,您需要创建路由
# ip route add 192.168.10.0/24 dev ppp0
这将把所有目标为 192.168.10.* 的流量通过您的 VPN 接口 (ppp0
) 路由。
路由所有流量
可能需要通过您的 VPN 连接路由所有流量。您可以通过运行以下命令来完成此操作
# ip route add default dev ppp0
通过 /etc/ppp/ip-up.d 路由所有流量
/etc/ppp/ip-up.d/
中的所有脚本。/etc/ppp/ip-up.d/01-routes.sh
#!/bin/bash # This script is called with the following arguments: # Arg Name # $1 Interface name # $2 The tty # $3 The link speed # $4 Local IP number # $5 Peer IP number # $6 Optional ``ipparam'' value foo ip route add default via $4
确保脚本是可执行的。
通过 /etc/ppp/ip-up.d 基于端口分流隧道
/etc/ppp/ip-up.d/
中的所有脚本。/etc/ppp/ip-up.d/01-routebyport.sh
#!/bin/bash # This script is called with the following arguments: # Arg Name # $1 Interface name # $2 The tty # $3 The link speed # $4 Local IP number # $5 Peer IP number # $6 Optional ``ipparam'' value foo echo 0 > /proc/sys/net/ipv4/conf/$1/rp_filter echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/ip_dynaddr ip route flush table vpn ip route add default via $5 dev $1 table vpn # forward only IRC ports over VPN iptables -t mangle -A OUTPUT -p tcp -m multiport --dports 6667,6697 -j MARK --set-mark 0x1 iptables -t nat -A POSTROUTING -o $1 -j MASQUERADE ip rule add fwmark 0x1 pri 100 lookup vpn ip rule add from $4 pri 200 table vpn ip route flush cache
确保脚本是可执行的,并且 vpn 表已添加到 /etc/iproute2/rt_tables
201 vpn
断开连接
执行以下命令以断开与 VPN 的连接
# poff <TUNNEL>
<TUNNEL>
是您的隧道的名称。
创建 VPN 守护进程并在启动时连接
您可以通过创建适当的 /etc/rc.d/*
脚本为您的 VPN 连接创建一个简单的守护进程
<TUNNEL>
是您的隧道的名称。<ROUTING COMMAND>
是您用于向路由表添加适当路由的命令。updetach
和 persist
参数传递给 /usr/bin/pon
,则此脚本的 stop 功能将不起作用。原因是 /usr/bin/poff
脚本在确定指定 pppd
进程的 PID 时存在错误(如果参数已传递给 pon
)。要解决此问题,您可以通过在第 93 行进行以下更改来修补您的 /usr/bin/poff
文件
-PID=`ps axw | grep "[ /]pppd call $1 *\$" | awk '{print $1}'` +PID=`ps axw | grep "[ /]pppd call $1" | awk '{print $1}'`
/etc/rc.d/name-of-your-vpn
#!/bin/bash . /etc/rc.conf . /etc/rc.d/functions DAEMON=<TUNNEL>-vpn ARGS= [ -r /etc/conf.d/$DAEMON ] && . /etc/conf.d/$DAEMON case "$1" in start) stat_busy "Starting $DAEMON" pon <TUNNEL> updetach persist &>/dev/null && <ROUTING COMMAND> &>/dev/null if [ $? = 0 ]; then add_daemon $DAEMON stat_done else stat_fail exit 1 fi ;; stop) stat_busy "Stopping $DAEMON" poff <TUNNEL> &>/dev/null if [ $? = 0 ]; then rm_daemon $DAEMON stat_done else stat_fail exit 1 fi ;; restart) $0 stop sleep 1 $0 start ;; *) echo "usage: $0 {start|stop|restart}" esac
pon
时使用了两个附加参数:updetach
和 persist
。参数 updetach
使 pon 阻塞,直到连接建立。另一个参数 persist
使网络在发生故障时自动重新连接。要在启动时连接,请将 @<TUNNEL>-vpn 添加到 /etc/rc.conf
中的 DAEMONS
数组末尾。故障排除
如果客户端连接一直超时并显示“LCP: timeout sending Config-Requests”,请确保 GRE 允许通过客户端防火墙。对于 iptables,必要的命令是
iptables -A INPUT -p 47 -j ACCEPT
或者,如果您只想允许来自本地计算机的连接请求对应的 PPTP 流量,则可以使用 conntrack PPTP 助手
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -t raw -A OUTPUT -p tcp --dport 1723 -j CT --helper pptp
第二行应自动加载 nf_conntrack_pptp
和 nf_conntrack_proto_gre
内核模块,这是此操作所必需的。
如果您收到“EAP: unknown authentication type 26; Naking”,请打开 /etc/ppp/options.pptp 并注释掉 refuse-chap 和 refuse-mschap 行,并将 options 文件条目添加到隧道文件,如下所示
/etc/ppp/peers/<tunel>
# written by pptpsetup pty "pptp vpn.foo.com --nolaunchpppd" lock noauth nobsdcomp nodeflate name USERNAME remotename vpn file /etc/ppp/options.pptp ipparam vpn require-mppe-128
备注
您可以在他们的网站上找到有关配置 pptpclient 的更多信息:pptpclient 网站。本文的内容改编自他们的 Ubuntu How-To,其中也提供了一些关于如何执行诸如在启动时连接等操作的提示。这些示例应该很容易改编成守护进程或其他脚本,以帮助自动化您的配置。