Шифрованный VPN туннель к провайдеру: MS-CHAPv2, MPPE, MPPC и все, все , все...

Вопрос "А как подключится по VPN?" сегодня стоит перед многими пользователями сети Интернет вообще и ОС Linux в частности. Настройка "клиентского" подключения может вызвать проблемы у новичков. Будем надеяться, что их разрешению поможет данная статья

[Сергей Сикорский (fagot AT kalinovka DOT net)]

Шифрованный VPN туннель к провайдеру: MS-CHAPv2, MPPE, MPPC и все, все , все...

"А как подключится по VPN..."

Мне кажется, этот вопрос сегодня стоит перед многими пользователями сети Интернет и ОС Linux в частности... в отличие от ответа на него. А настройка такого подключения у новичков вызывает некоторые проблемы.


Да, из Microsoft Windows несколько проще подключится к VPN серверу по протоколу PPTP от Microsoft, используя протокол аутентификации Microsoft MS-CHAPv2, с использованием метода шифрования Microsoft Point-to-Point Encryption и сжатия Microsoft Point-to-Point Compression...

Но к счастью, из под ОС Linux это тоже вполне реализуемо, а на сегодняшний день - еще и довольно просто, что и будет продемонстрировано ниже.

MS-CHAPv2
Это протокол аутентификации, широко используемый в продуктах от Microsoft, в связи с чем стал, по-сути, стандартом. Он более защищен по сравнению с PAP/CHAP и является усовершенствованной версией MS-CHAP, использовавшегося ранее и славящегося своими дырами в плане безопасности сейчас :)

Его поддержка есть в pppd последних версий, для более ранних существуют патчи. К ядру MS-CHAP не имеет никакого отношения.

MPPE и MPPC
MPPE - это Microsoft Point-to-Point Encryption, метод шифрования данных при передаче по VPN-каналу. Тоже довольно популярен, даже используется в некоторых аппаратных шлюзах, роутерах и т.д. Разумеется очень рекомендуется к применению, особенно при построении туннеля через "дикий" Интернет.

Хотя можно и не использовать, тогда никаких патчей искать не нужно.

Для использования MPPE нужна поддержка в самом ядре Linux и в pppd. В pppd поддержка появилась относительно недавно, в ядре... ну, пока что ждем, надеемся и верим :)

А патчи уже есть.

Раньше я использовал патчи ppp-2.4.0-openssl-0.9.6-mppe.patch и linux-2.4.16-openssl-0.9.6b-mppe.patch (http://www.advancevpn.com/cgi-bin/content?lang=1&cid=LIBRARY&hid=15 ), но сейчас это кажется уже не модно :)

С включением в pppd поддержки MPPE, в исходниках была директория include/linux/mppe, в которой тоже лежал патч к ядру, но почему-то в pppd-2.4.2 ее нет.

Также имеется kernelmod с уже готовым модулем, но он тоже считается уже устаревшим и к тому же заточен только под ядра RedHat (поправьте меня, если я ошибаюсь).

Самый распространенный набор патчей на сегодня "живет" на http://public.planetmirror.com/pub/mppe (ранее - http://mirror.binarix.com/ppp-mppe )

Впрочем, я буду использовать немножко другие, авторства Jan Dubiec - http://www.polbox.com/h/hs001


Автор добавил немножко "отсебятины", поэтому для работы требуется пропатчить не только ядро, но и pppd (да, да и новый тоже). Достоинством этих патчей является поддержка MPPC - Microsoft Point-to-Point Compression, если кому надо...

Система: Slackware 9.1, linux-2.4.22

Патчи ложатся на исходный код нормально, без напильника, и кажется работают :) После применения патча к ядру, в `make menuconfig` появляется новая опция - "Microsoft PPP compression/encryption (MPPC/MPPE) (NEW)":

Linux Kernel v2.4.22 Configuration
| | [*] Network device support
| | ARCnet devices --->
| | < > Dummy net driver support
| | <M>Bonding driver support
| | <M>EQL (serial line load balancing) support
| | <M>Universal TUN/TAP device driver support
| | < > Ethertap network tap (OBSOLETE)
| | Ethernet (10 or 100Mbit) --->
| | Ethernet (1000 Mbit) --->
| | [ ] FDDI driver support
| | [ ] HIPPI driver support (EXPERIMENTAL)
| | <M>PPP (point-to-point protocol) support
| | [ ] PPP multilink support (EXPERIMENTAL)
| | [ ] PPP filtering
| | <M>PPP support for async serial ports
| | <M>PPP support for sync tty ports
| | <M>PPP Deflate compression
| | <M>PPP BSD-Compress compression
| | <M>Microsoft PPP compression/encryption (MPPC/MPPE) (NEW)
| | <M>PPP over Ethernet (EXPERIMENTAL)
| | < > SLIP (serial line) support
| | Wireless LAN (non-hamradio) --->
| | Token Ring devices --->
| | [ ] Fibre Channel driver support
| | <M>Red Creek Hardware VPN (EXPERIMENTAL)
| | <M>Traffic Shaper (EXPERIMENTAL)
| | Wan interfaces --->
| | PCMCIA network device support --->

Ее следует включить (CONFIG_PPP_MPPE=y, можно модулем ) и пересобрать ядро. Это уж как кому хочется :)

Установка PPPD
http://samba.org/ppp

Берем последний pppd, собираем, ставим. Тут и далее вместо `make install` будет применятся checkinstall ( http://asic-linux.com.mx/~izto/checkinstall ), кто не знает что это, могут делать по старинке.

Качаем:

user@linux:~$ cd
user@linux:~$ wget ftp://ftp.samba.org/pub/ppp/ppp-2.4.2.tar.gz
user@linux:~$ md5sum ./ppp-2.4.2.tar.gz
362bcf218fba8afbb9afbee7471e5dac ./ppp-2.4.2.tar.gz

Патч к pppd для поддержки MPPE и MPPC:

user@linux:~$ wget http://www.polbox.com/h/hs001/ppp-2.4.2-mppe-mppc-1.0.patch.gz
user@linux:~$ md5sum ./ppp-2.4.2-mppe-mppc-1.0.patch.gz
844c9d343d7511902b5380b27eca417e ./ppp-2.4.2-mppe-mppc-1.0.patch.gz

Собираем и ставим:

user@linux:~$ cd /usr/src/
user@linux:/usr/src$ tar -zxvf ~/ppp-2.4.2.tar.gz
user@linux:/usr/src$ cd ./ppp-2.4.2/
user@linux:/usr/src/ppp-2.4.2$ ./configure
user@linux:/usr/src$ zcat ~/ppp-2.4.2-mppe-mppc-1.0.patch.gz |patch -p1
user@linux:/usr/src/ppp-2.4.2$ make
user@linux:/usr/src/ppp-2.4.2$ sudo checkinstall

Если вы (почему-то) хотите использовать бета-версии pppd. У меня бета (ppp_2.4.2b1) никогда нормально не собиралась:

user@linux:~$ cd /usr/src
user@linux:/usr/src$ tar -zxvf ~/ppp_2.4.2b1.tgz
user@linux:/usr/src$ cd ppp
user@linux:/usr/src/ppp$ ./configure
user@linux:/usr/src/ppp$ make
...
creating config.h
make -C radiusclient
make[3]: Вход в каталог
`/usr/src/ppp/pppd/plugins/radius/radiusclient'
cd . && autoheader
./aclocal.m4:49: error: m4_defn: undefined macro: _m4_divert_diversion
acoldnames.m4:86: AM_PROG_INSTALL is expanded from...
./aclocal.m4:49: the top level
autoconf: tracing failed
make[3]: *** [stamp-h.in] Ошибка 1
make[3]: Выход из каталог
`/usr/src/ppp/pppd/plugins/radius/radiusclient'
make[2]: *** [radiusclient/lib/.libs/libradiusclient.a] Ошибка 2
make[2]: Выход из каталог `/usr/src/ppp/pppd/plugins/radius'
make[1]: *** [all] Ошибка 2
make[1]: Выход из каталог `/usr/src/ppp/pppd/plugins'
make: *** [all] Ошибка 2

Лечится даунгрейдом m4 на время установки, или так:

user@linux:/usr/src/ppp$ cd ./pppd/plugins/radius/radiusclient
user@linux:/usr/src/ppp/pppd/plugins/radius/radiusclient$  rm aclocal.m4
user@linux:/usr/src/ppp/pppd/plugins/radius/radiusclient$ update
user@linux:/usr/src/ppp/pppd/plugins/radius/radiusclient$ aclocal
user@linux:/usr/src/ppp/pppd/plugins/radius/radiusclient$ cd ../../../..
user@linux:/usr/src/ppp$ make
user@linux:/usr/src/ppp$ sudo checkinstall

Ядро
http://kernel.org

Качаем и устанавливаем патч к ядру для поддержки MPPE и MPPC. На сайте разработчика (патча, не ядра :) есть куча патчей под разные версии ядра, поищите, что вам больше подходит.

user@linux:~$ cd
user@linux:~$ wget http://www.polbox.com/h/hs001/linux-2.4.22-mppe-mppc-0.98.patch.gz
user@linux:~$ md5sum ~/linux-2.4.22-mppe-mppc-0.98.patch.gz
90d3dffa4bada645ce2fa9605684565e /home/fagot/linux-2.4.22-mppe-mppc-0.98.patch.gz

user@linux:~$ su -
root@linux:~# cd /usr/src/linux
root@linux:/usr/src/linux# zcat /home/fagot/linux-2.4.22-mppe-mppc-0.98.patch.gz |patch -p1
root@linux:/usr/src/linux# make menuconfig

Собираем то, что вышло:

root@linux:/usr/src/linux# make dep
root@linux:/usr/src/linux# make bzlilo
root@linux:/usr/src/linux# mv /vmlinuz /System.map /boot
root@linux:/usr/src/linux# lilo
root@linux:/usr/src/linux# make modules
root@linux:/usr/src/linux# make modules_install

Если все прошло нормально, можно попробовать загрузить модуль. Если поддержка MPPE была включена как модуль, систему можно не перегружать.

root@linux:/usr/src/linux# modprobe ppp_mppe_mppc
root@linux:/usr/src/linux# lsmod|grep ppp_mppe_mppc
ppp_mppe_mppc 20568 0 (unused)
ppp_generic 16444 0 [ppp_mppe_mppc]

Все получилось. Закрепим результат:

root@linux:/usr/src/linux# echo "alias ppp-compress-18 ppp_mppe_mppc" >>/etc/modules.conf

Установка PPTP-клиента 
http://pptpclient.sourceforge.net

Если в системе уже есть (или планируется pptpd), pptp-клиент (linux-pptp) не нужен. Иначе -- в путь-дорожку:

Кажаем linux-pptp с http://pptpclient.sourceforge.net/#download

user@linux:~$ cd
user@linux:~$ md5sum ./pptp-linux-1.4.0.tar.gz
9e5c07de3e347c7125ed94824cebeaee ./pptp-linux-1.4.0.tar.gz

user@linux:~$ cd /usr/src/
user@linux:/usr/src$ tar -zxvf ~/pptp-linux-1.4.0.tar.gz
user@linux:/usr/src$ cd ./pptp-linux-1.4.0/
user@linux:/usr/src/poptop-1.1.4$ make
user@linux:/usr/src/pptp-linux-1.4.0$ sudo checkinstall

Настройка сводится к минимуму:

user@linux:/usr/src/pptp-linux-1.4.0$ sudo mkdir /etc/ppp/peers

Файл /etc/ppp/peers/ISP-NAME:
name LOGIN
remotename ISP-NAME
debug
lock
deflate 0
defaultroute
file /etc/ppp/options.pptp
pty "/usr/sbin/pptp SERVER --nolaunchpppd"

Файл /etc/ppp/options.pptp:
lock noauth nobsdcomp nodeflate

Файл /etc/ppp/pap-secrets ИЛИ /etc/ppp/chap-secrets:
# client server secret IP addresses
LOGIN ISP-NAME PASSWORD *

Тут LOGIN - логин на сервере, PASSWORD - соответствующий пароль, ISP-NAME - что угодно, чтоб было понятно, куда звоним, SERVER - IP-адрес или имя сервера провайдера.

Запуск:

user@linux:~$ sudo /usr/sbin/pppd call ISP-NAME

Если `ifconfig` покажет интерфейс ppp0, значит все гут, можно пингануть Яндекс для уверенности. Если нет - смотреть /var/log/messages (внимательно)

Бонус: для того, чтоб с клиента сделать сервер делаем следующее:

Установка PPTPD 
http://www.poptop.org

Качаем pptpd-1.1.4-b4.tar.gz с понравившегося зеркала - http://sourceforge.net/project/showfiles.php?group_id=44827


user@linux:~$ cd
user@linux:~$ md5sum ./pptpd-1.1.4-b4.tar.gz
58603224998f22542e8d7ecb357bc006 ./pptpd-1.1.4-b4.tar.gz

user@linux:~$ cd /usr/src/
user@linux:/usr/src$ tar -zxvf ~/pptpd-1.1.4-b4.tar.gz
user@linux:/usr/src$ cd ./poptop-1.1.4/
user@linux:/usr/src/poptop-1.1.4$ ./configure --prefix=/usr/local --sysconfdir=/etc --localstatedir=/var
user@linux:/usr/src/poptop-1.1.4$ make
user@linux:/usr/src/ppp-2.4.2$ sudo checkinstall

Файл /etc/pptpd.conf:
debug

Файл /etc/ppp/options:
require-mschap-v2
mppe required

Остальные опции додумаете сами - man pppd (параметр mppe там тоже есть)

Файл /etc/ppp/chap-secrets:
# client server secret IP addresses
test * test 10.0.0.1
test1 * test1 10.0.0.2
test2 * test2 10.0.0.3

Запуск:

user@linux:/$ sudo /usr/local/sbin/pptpd

Проверяем запустился, или нет. Если что-то ему не понравится, pptpd об этом прямо на консоль и скажет, кстати.

user@linux:/$ ps -A|grep pptpd
20425 ? 00:00:00 pptpd

Вот и все, приехали. Тут и сказочке конец, а кто слушал... тот быстренько пошел на машину с Windows XP, создал новое VPN-соединение, проверил в параметрах, стоит ли галка использовать шифрование, используется ли MS-CHAPv2 и соединился с свеже-запущенным сервером.

Если все прошло хорошо - откройте окно состояния соединения, на вкладке "Сведения" должно быть:
Проверка подлинности: MS CHAP V2
Шифрование: MPPE 128
Сжатие: MPPC
IP-адрес клиента: тот, что вы указали в chap-secrets

Если же ничего не вышло - смотрим /var/log/messages, /var/log/debug, запоминаем с какой ошибкой вылетает клиент - и вперед на Google.com...

(c) Sergey Sikorsky AKA fagot 24.06.2004, час ночи
mail-to:fagot#kalinovka.net

PS. Сразу предупреждаю, на письма вида "А вот я все сделал как написано, но ничего не работает..." отвечать НЕ БУДУ. Есть поисковики, есть форум - http://www.linux.org.ru/profile/fagot/view-group.jsp?group=1340, там и ищите и обрящите.

Статья взята с сатйа FINe.

[ опубликовано 22/07/2004 ]

Сергей Сикорский (fagot AT kalinovka DOT net) - Шифрованный VPN туннель к провайдеру: MS-CHAPv2, MPPE, MPPC и все, все , все...   Версия для печати