PPTP 客户端

来自 ArchWiki

pptpclient 是一个实现了 Microsoft PPTP 协议的程序。因此,它可以用于连接到学校或工作场所提供的 Microsoft VPN 网络(或任何基于 PPTP 的 VPN)。

警告: PPTP 协议本质上是不安全的。详情请参阅 https://poptop.sourceforge.net/dox/protocol-security.phtml

安装

安装 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 客户端的安全选项。如果您在连接到网络时遇到问题,您可能需要放宽这些选项。至少,此文件应包含选项 locknoauthnobsdcompnodeflate

/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>
注意: 如果您不需要 MPPE 支持,则应从此文件和 /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 服务器上可用的任何内容进行交互。要访问远程网络上的任何内容,您需要向路由表添加新路由。

注意: 根据您的配置,您可能需要在每次连接到 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
注意: 通过 VPN 路由所有流量可能会导致整体连接速度变慢,因为您的流量在正常路由之前将通过远程 VPN 路由。

通过 /etc/ppp/ip-up.d 路由所有流量

注意: 当 VPN 连接建立时,将调用 /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 基于端口分流隧道

注意: 当 VPN 连接建立时,将调用 /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 守护进程并在启动时连接

本文或本节已过时。

原因: 引用 rc.d:需要更新到 systemd。(在 Talk:PPTP Client 中讨论)

您可以通过创建适当的 /etc/rc.d/* 脚本为您的 VPN 连接创建一个简单的守护进程

注意: 与往常一样,<TUNNEL> 是您的隧道的名称。<ROUTING COMMAND> 是您用于向路由表添加适当路由的命令。
注意: 如果在启动 pon 时将 updetachpersist 参数传递给 /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 时使用了两个附加参数:updetachpersist。参数 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_pptpnf_conntrack_proto_gre 内核模块,这是此操作所必需的。

如果您收到“EAP: unknown authentication type 26; Naking”,请打开 /etc/ppp/options.pptp 并注释掉 refuse-chaprefuse-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,其中也提供了一些关于如何执行诸如在启动时连接等操作的提示。这些示例应该很容易改编成守护进程或其他脚本,以帮助自动化您的配置。