Как программно создать PPTP VPN соединение на macOS Sierra/High Sierra?
Apple удалила поддержку высокого уровня PPTP в macOS Sierra из своей системы конфигурации сети. Тем не менее, все внутренние механизмы ГЧП все еще там, в том числе /usr/sbin/pppd
а также /etc/ppp/
,
Как программно инициировать VPN-соединение PPTP в macOS Sierra / High Sierra, используя то, что осталось?
1 ответ
Ответ:
Этот метод создает 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 и закройте его одним 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: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 (т.е. 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
может создать и удалить этот файл по требованию.
Чтобы отправить весь трафик (и если вы не знаете подсеть назначения), раскомментируйте #defaultroute
в файле подключения PPP и оставьте ip-up
& ip-down
пустые записи (например, VPNBook
пример). Чтобы переопределить ваш DNS с VPN, раскомментируйте usepeerdns
,