Как программно создать PPTP VPN-соединение на macOS Sierra / High Sierra? - PullRequest
0 голосов
/ 24 мая 2018

Apple удалила поддержку высокого уровня PPTP в macOS Sierra из своей системы конфигурации сети.Однако все внутренние компоненты PPP все еще там, включая /usr/sbin/pppd и /etc/ppp/.

Как программно инициировать VPN-соединение PPTP на macOS Sierra / High Sierra, используя то, что осталось?

1 Ответ

0 голосов
/ 24 мая 2018

Ответ:

Этот метод создает PPTP-соединение, которое не отправляет весь трафик и не переопределяет других провайдеров DNS, что означает, что он работает с несколькимиодновременные VPN-соединения, каждое из которых имеет разные домены поиска DNS, и упорядоченно закрывает его.

Чтобы не отправлять весь трафик, необходимо заранее знать подсеть VPN.Если вы этого не сделаете, вы должны отправить весь трафик (см. Ниже), поскольку ванильный PPP / LCP не имеет возможности сообщить клиенту свою подсеть (хотя теоретически сценарии ip-up и ip-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, где AcmeOffice - имя соединения PPP, и закройте его с помощью одного элемента управления.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:wheel и chmod 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 (т. Е. * 1043)*), создайте файл в /etc/resolver/, названный в честь суффикса DNS, например /etc/resolver/office.acme.com, с содержимым, например:

nameserver 192.168.1.1
domain office.acme.com

Обратите внимание, что для этого необходимо заранее знать целевой домен и сервер имен.Теоретически ip-up & ip-down может создавать и удалять этот файл по требованию.

Чтобы отправить весь трафик (и, если вы не знаете целевую подсеть), раскомментируйте #defaultroute в файле подключения PPP иоставьте записи ip-up & ip-down пустыми (например, пример VPNBook).Чтобы переопределить DNS с VPN, раскомментируйте usepeerdns.

...