1

Apple 从其网络配置系统中删除了 macOS Sierra 中的高级 PPTP 支持。但是,PPP 内部仍然存在,包括/usr/sbin/pppd/etc/ppp/.

如何使用剩下的东西以编程方式在 macOS Sierra / High Sierra 上启动 PPTP VPN 连接?

4

1 回答 1

2

回答:

此方法创建一个发送所有流量且不覆盖其他 DNS 提供商的 PPTP 连接,这意味着它适用于多个同时具有不同 DNS 搜索域的 VPN 连接,并以有序的方式关闭它。

不发送所有流量需要您事先知道 VPN 子网。如果不这样做,则必须发送所有流量(见下文),因为普通 PPP/LCP 无法告诉客户端其子网(尽管理论上ip-upandip-down脚本可以从收到的 IP 地址中猜出它)。

将此 perl 保存为/usr/local/bin/pptp

#!/usr/bin/env perl
if (@ARGV) {
    my $name = $ARGV[0];
    if (length $name && -e "/etc/ppp/peers/$name") {
        my $pid;
        $SIG{"INT"} = "IGNORE";
        die "fork: $!" unless defined ($pid = fork);
        if ($pid) { # parent
            $SIG{"INT"} = sub {
                kill HUP => $pid;
            };
            wait;
            exit;
        } else { #child
            $SIG{"INT"} = "DEFAULT";
            exec "pppd", "call", $name;
            exit;
        }
    } else {
        print "Error: PPTP name: $name\n";
    }
} else {
    opendir my $d, "/etc/ppp/peers" or die "Cannot read /etc/ppp/peers";
    while (readdir $d) {
        print "$_\n" if !($_ eq "." || $_ eq "..");
    }
    closedir $d;
}

运行它sudo pptp AcmeOffice,PPP 连接名称在哪里AcmeOffice,然后使用单个 Control-C/SIGINT 关闭它。

/etc/ppp/peers中,创建 PPP 连接文件,在此示例中/etc/ppp/peers/AcmeOffice

plugin /System/Library/SystemConfiguration/PPPController.bundle/Contents/PlugIns/PPPDialogs.ppp
plugin PPTP.ppp
noauth
# debug 
redialcount 1
redialtimer 5
idle 1800
#mru 1320
mtu 1320
receive-all
novj 0:0
ipcp-accept-local
ipcp-accept-remote
refuse-pap
refuse-chap
#refuse-chap-md5
refuse-eap
hide-password
#noaskpassword
#mppe-stateless 
mppe-128 
mppe-stateful 
require-mppe 
passive 
looplocal 
nodetach
# defaultroute
#replacedefaultroute
# ms-dns 8.8.8.8
# usepeerdns
noipdefault
# logfile /tmp/ppp.AcmeOffice.log 
ipparam AcmeOffice
remoteaddress office.acme.com
user misteracme
password acme1234

最后 4 个选项是特定于连接的。请注意,密码以明文形式存储。chown root:wheelchmod 600推荐。nodetach, ipcp-accept-local, ipcp-accept-remote,noipdefault很关键。

由于我们不会成为/替换默认路由,因此您必须手动更改路由表。在脚本中添加一个AcmeOffice条目:/etc/ppp/ip-up

#!/bin/sh
#params: interface-name tty-device speed local-IP-address remote-IP-address ipparam

PATH=$PATH:/sbin:/usr/sbin

case "$6" in
    AcmeOffice)
        route -n add -net 192.168.1.0/24 -interface "$1"
        ;;
    AcmeLab)
        route -n add -net 192.168.2.0/24 -interface "$1"
        ;;
    AcmeOffshore)
        route -n add -net 192.168.3.0/24 -interface "$1"
        ;;
    VPNBook)
        ;;
    *)
        ;;
esac

和你的/etc/ppp/ip-down脚本:

#!/bin/sh
#params: interface-name tty-device speed local-IP-address remote-IP-address ipparam

PATH=$PATH:/sbin:/usr/sbin

case "$6" in
    AcmeOffice)
        route -n delete -net 192.168.1.0/24 -interface "$1"
        ;;
    AcmeLab)
        route -n delete -net 192.168.2.0/24 -interface "$1"
        ;;
    AcmeOffshore)
        route -n delete -net 192.168.3.0/24 -interface "$1"
        ;;
    VPNBook)
        ;;
    *)
        ;;
esac

如果 VPN 有 DNS 搜索域(即somehost.office.acme.com),则创建一个/etc/resolver/以 DNS 后缀命名的文件,例如/etc/resolver/office.acme.com,内容如下:

nameserver 192.168.1.1
domain office.acme.com

请注意,这需要事先知道目标域和名称服务器。理论上ip-up&ip-down可以按需创建和删除此文件。

要发送所有流量(& 如果您不知道目标子网),请取消#defaultroutePPP 连接文件中的注释并将ip-up&ip-down条目留空(例如VPNBook示例)。要使用 VPN 覆盖您的 DNS,请取消注释usepeerdns

于 2018-05-23T22:08:40.020 回答