FreeBSD как pptp клиент

25 марта 2011 г.

Часто бывает так, что компании организуют VPN-серверы для доступа извне в свою корпоративную сеть. Делается это для того, чтобы сотрудники в командировке или на больничном, или вообще в принципе удаленно работающие, могли получить полноценное рабочее место не находясь в офисе. Подключившись сначала к vpn-серверу, а затем, допустим, по RDP к своей рабочей машине. Подключение виндовых клиентов проще простого, а вот с остальными иногда приходится повозиться.
Как настроить pptp`шный vpn-клиент на базе FreeBSD (ну и Linux)?

Статей на тему настройки различных типов серверов (pptp, openvpn и т.д.) в интернете куча.
Вот и в нашей компании используется такой подход. Крутится PopTop (он pptp`шный) на FreeBSD, настроенный еще со времен 4-ой фряшной ветки.

Клиенты в 99% случаев виндовые, и настраиваются минимальным количеством телодвижений. Т.е. тупо виндовым мастером создается новое подключение (в win7 оно зовется «connect to a workplace»), указывается имя коннекта, адрес сервера, логин, пасс и все. Готово. Можно пользоваться. Но, как правило, мы еще убираем галку «Use default gateway on remote network» и добавляем маршрут к нашей сети. Так сотруднику будет доступна и локальная сеть и наша корпоративная (при условии, что у них не одинаковые подсети, иначе будет работать через одно место).

Соединиться по pptp во FreeBSD можно 2 способами (в Linux вообще только одним – первым. Действия в Linux скорей всего будут аналогичными или очень похожими, там ведь есть ppp):

1. Используя связку ppp и pptpclient

Для этого мы используем фряшный штатный ppp, а также нужно доустановить pptpclient из портов (/usr/ports/net/pptpclient. В Linux также известен как pptp-linux).

1.1

Настраиваем конфиг /etc/ppp/ppp.conf. Ничего не трогаем от начального варианта, нужно только добавить в конец следующие строки (далее все переменные пользовательские значения будут выглядеть как MyVariable):

MyCompanyName:

set ifaddr 0 0
set authname MyLoginName
set authkey MyPasswodKey
set timeout 0
disable vj pred1 deflate
deny vj pred1 deflate
set mppe * stateless

Имя соединения MyCompanyName без пробела, далее сами настройки с пробелом в начале каждой строчки (важно!).
Адреса DNS-серверов в /etc/resolv.conf заменятся сами при подключении.

1.2

Нужно создать файл /etc/ppp/ppp.linkup и положить туда:
# cat /etc/ppp/ppp.linkup
MyCompanyName:
! sh -c "echo 'domain MyCompanyDomain.ru' >> /etc/resolv.conf"
add 192.168.0.0/16 HISADDR

Так создадим маршрут при поднятии нашего соединения (у нас корпоративная сеть 192.168.0.0/16) и скажем что мы в корпоративном домене.

1.3

Нужно создать файл /etc/ppp/ppp.linkdown и положить туда:
# cat /etc/ppp/ppp.linkdown
MyCompanyName:
! sh -c "echo 'domain MyLocalDomain' > /etc/resolv.conf ; echo 'nameserver IpProviderDnsServer' >> /etc/resolv.conf"

Так после отключения мы вернем в /etc/resolv.conf IP-адрес нашего домашнего провайдерского DNS.

1.4

Подключаемся:
# pptp vpn-server.address.ru MyCompanyName &
После чего создастся tun0 и мы подключимся к VPN. Адреса в /etc/resolv.conf заменятся. Отключиться можно killall pptp.

Хотя я предпочитаю пользоваться скриптом
$ cat ~/bin/pptp.sh
#!/bin/sh
vpn='vpn-server.address.ru'
ps=`ps ax | grep $vpn | wc -l`
if [ $ps -ge 2 ]; then
echo "WARNING!";
echo "You are already connected to $vpn";
exit 1;
else echo "Connecting to $vpn";
/usr/local/sbin/pptp --loglevel 0 $vpn MyCompanyName > /dev/null 2>&1 &
exit 0;
fi

Не очень хороший скрипт, но большее писать мне лень) убивать опять же killall pptp

По вашему усмотрению можно всячески менять ppp.link*, как и способ запуска соединения.

2. С помощью netgraph и mpd5

Обычно во FreeBSD по-умолчанию есть netgraph, даже при пересборке ядра чтобы его не было нужно его как-то специально отключить. Mpd5 ставим из портов (/usr/ports/net/mpd5).

2.1

Конфиг:
# cp /usr/local/etc/mpd5/mpd.conf.sample /usr/local/etc/mpd5/mpd.conf

Правим в /usr/local/etc/mpd5/mpd.conf:

default:
load pptp_client

pptp_client:
#
# PPTP client: only outgoing calls, auto reconnect,
# ipcp-negotiated address, one-sided authentication,
# default route points on ISP's end
#

create bundle static B1
set iface route 192.168.0.0/16
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
set iface up-script /usr/local/etc/mpd5/up.sh
set iface down-script /usr/local/etc/mpd5/down.sh

# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
set bundle enable compression
set bundle enable encryption
set ccp yes mppc
set mppc yes compress e40 e56 e128 stateless

create link static L1 pptp
set link action bundle B1
set auth authname MyLoginName
set auth password MyPasswodKey
set link max-redial 0
set link mtu 1460
set link keep-alive 20 75
set pptp peer Vpn-Server.Address.Ru
set pptp disable windowing
open

2.2

Создаем /usr/local/etc/mpd5/up.sh
#!/bin/sh

cp /etc/resolv.conf /usr/local/etc/mpd5/resolv.conf.orig
echo "nameserver IpCorpDnsServer" > /etc/resolv.conf

2.3

Создаем /usr/local/etc/mpd5/down.sh
#!/bin/sh

mv /usr/local/etc/mpd5/resolv.conf.orig /etc/resolv.conf

2.4

Подключаемся
/usr/local/etc/rc.d/mpd5 start
Отключаемся /usr/local/etc/rc.d/mpd5 stop

Да, и по вашему усмотрению можете менять up.sh/down.sh.

В Ubuntu, где есть network-manager все делается через него. Там снимаются галочки с такими же названиями, как в первом варианте.

P.S. На второй способ с mpd5 я потратил очень мало времени. А вот первый никак не хотел заводиться, я уж думал забить. Загвоздка была в том, что в логе /var/log/ppp.log вываливалась ошибка
Warning: deflink: Peer rejected (required) MPPE negotiation
И ничего не соединялось. Решилось все это добавлением disable vj pred1 deflate и deny vj pred1 deflate. На то чтобы заставить это работать, т.е. на поиски вот этих двух строчек ушло оооочень много времени (где-то неделя чтения мана ppp и методов проб и ошибок) =).
В инете никто эту проблему не описывает, только вопросы задают.
Кстати, в этом же инете для FreeBSD все очень советуют юзать mpd. Наверное, отчасти потому что не могут настроить ppp с pptp.

Теги: рубрика FreeBSD
  • Похожие статьи
  • Предыдущие из рубрики