Ответ:
Этот метод создает 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
.