Одной из задач системного администратора является удаленное администрирование различных серверов. На Windows 2003 устанавлиавается и настраивается служба маршрутизации и к ней устанавливается клиентское vpn подключение. Так у меня и было настроено, но т.к. клиент у меня был мой рабочий сервер, то это вызывало некоторые неудбства, например вынос шлюза по умолчанию, в результате у моего dns сервера напрочь терялась способность к пересылке запросов на сервер провайдера :) Стоп, подумал я, у меня же есть моя рабочая лошадка — FreeBSD 8, которая по функционалу ничуть не хуже 2003го сервера. И решил я поднять клиента на ней.
Итак, поехали.
В качестве клиента я решил использовать mpd5, ибо разработчики его утверждают, что он полностью совместим с 2003м сервером. Для начала, немного теории — с чем нам придется иметь дело:
Т.к. демон mpd5 использует в своей работе netgraph, то нам нужно пересобрать ядро FreeBSD. Как это делать написано в мане, я лишь приведу какие именно опции нужны:
После установки нового ядра можно приступить к установке mpd5. Ставим из портов (предварительно их обновив), без всяких опций. После установки можно приступить к конфигурированию. Все настройки хранятся в mpd.conf (находится по умолчанию в /usr/local/etc/mpd5).
Пару слов по оформлению конфига. Следует помнить, что mpd чувствителен к пробелам, все отступы должны быть оформлены в виде табуляции. Опции должны быть применены соответственно контекста, т.е. например, set ipcp yes vjcomp не может стоять в секции канального уровня (link), а должна быть только в пакетном (bundle).
Итак, вот, собственно, содержание файла конфигурации:
Запускающий и завершающий скрипты (up.sh и down.sh) нужны нам для установки правильных маршрутов до vpn сервера. Вот их содержимое:
В скриптах, в принципе, все понятно, за исключением параметров $1-$8. Эти параметры передает в скрипт mpd во время его запуска, конкретно $1 — это название интерфейса vpn-подключения (обычно ng0), $3 — ip адрес, выдаваемый клиенту сервером и $8 — это ip интернет адрес vpn сервера.
Установка подключения выполняется командой
После чего этим подключеним можно управлять либо через консоль либо через веб-интерфейс, подключившись к localhost:5006.
Итак, поехали.
В качестве клиента я решил использовать mpd5, ибо разработчики его утверждают, что он полностью совместим с 2003м сервером. Для начала, немного теории — с чем нам придется иметь дело:
- IPCP (англ. Internet Protocol Control Protocol — протокол управления IP)— протокол управления сетевым уровнем для установки, настройки и разрыва IP подключения поверх PPP (Point-to-Point Protocol) соединения. IPCP использует тот же механизм обмена пакетами, что и LCP (Link Control Protocol). Обмен пакетами IPCP не происходит до тех пор, пока PPP не начнёт фазу согласования протокола сетевого уровня. Любые пакеты IPCP, полученные до того, как начнётся эта фаза, должны быть отброшены.
- СCP (англ. Compression Control Protocol — протокол управления сжатием) — протокол управления сжатием, входищий в протокол PPP (Point-to-Point Protocol) регламинтирует использование различных алгоритмов сжатия информации при ее передаче между оконечными узлами линий связи. Он непосредственно отвечает за выбор, настройку и управление процессами сжатия во время соединения
- Метод сжатия заголовков TCP/IP Ван Якобсона — протокол сжатия данных, описанный в RFC 1144, специально был создан Ван Якобсоном для улучшения производительности TCP/IP при медленных последовательных соединениях. Метод сжатия Ван Якобсона уменьшает обычные 40-байтные заголовки TCP/IP-пакетов примерно до 3-4 байт (в лучшем случае). Это достигается за счет запоминания состояния TCP-соединений на обоих концах соединения, и отсылаются только изменения в полях заголовка, что приводит к довольно большой разнице с точки зрения интерактивной производительности на низкоскоростных соединениях, но при этом этот метод никак не борется с задержками при обработке, присущими большинству модемов для коммутируемой связи (dialup).
Сжатие заголовков Ван Якобсона (Van Jacobson Header Compression) (также упоминается как «VJ-сжатие» (VJ compression) или просто как «Сжатие заголовков» (Header Compression)) — дополнительная возможность в большинстве версий PPP. Версии SLIP-протокола с поддержкой VJ-сжатия часто именуются «Сжатым SLIP» (Compressed SLIP).
- Microsoft Point-to-Point Compression (MPPC) — протокол сжатия данных, первоначально разработанный для использования поверх соединений PPP. Использует алгоритм Lempel-Ziv со скользящим окном буфера истории размером 8192 байт.
- Microsoft Point-to-Point Encryption (MPPE) — протокол шифрования данных, используемый поверх соединений PPP. Использует алгоритм RSA RC4. MPPE поддерживает 40-, 56- и 128-битные ключи, которые меняются в течение сессии (частота смены ключей устанавливается в процессе хэндшейка соединения PPP, в принципе возможно генерировать по новому ключу на каждый пакет. MPPE не сжимает данных, но часто используется совместно с Microsoft Point-to-Point Compression, предназначенным для этих целей.
Т.к. демон mpd5 использует в своей работе netgraph, то нам нужно пересобрать ядро FreeBSD. Как это делать написано в мане, я лишь приведу какие именно опции нужны:
#netgraph(4) system
options NETGRAPH
options NETGRAPH_ASYNC
options NETGRAPH_BPF
options NETGRAPH_BRIDGE
options NETGRAPH_CISCO
options NETGRAPH_ECHO
options NETGRAPH_ETHER
options NETGRAPH_FRAME_RELAY
options NETGRAPH_GIF
options NETGRAPH_GIF_DEMUX
options NETGRAPH_HOLE
options NETGRAPH_IFACE
options NETGRAPH_IP_INPUT
options NETGRAPH_KSOCKET
options NETGRAPH_L2TP
options NETGRAPH_LMI
# MPPC compression requires proprietary files (not included)
#options NETGRAPH_MPPC_COMPRESSION
options NETGRAPH_MPPC_ENCRYPTION
options NETGRAPH_ONE2MANY
options NETGRAPH_PPP
options NETGRAPH_PPPOE
options NETGRAPH_PPTPGRE
options NETGRAPH_RFC1490
options NETGRAPH_SOCKET
options NETGRAPH_TEE
options NETGRAPH_TTY
options NETGRAPH_UI
options NETGRAPH_VJC
После установки нового ядра можно приступить к установке mpd5. Ставим из портов (предварительно их обновив), без всяких опций. После установки можно приступить к конфигурированию. Все настройки хранятся в mpd.conf (находится по умолчанию в /usr/local/etc/mpd5).
Пару слов по оформлению конфига. Следует помнить, что mpd чувствителен к пробелам, все отступы должны быть оформлены в виде табуляции. Опции должны быть применены соответственно контекста, т.е. например, set ipcp yes vjcomp не может стоять в секции канального уровня (link), а должна быть только в пакетном (bundle).
Итак, вот, собственно, содержание файла конфигурации:
# cat mpd.conf
# Здесь мы настраиваем консоль, которой можно будет управлять демоном mpd5,
# веб-сервер для того же, но через браузер и параметры авторизации.
startup:
set user admin admin admin
set console self 127.0.0.1 5005
set console open
set web self 0.0.0.0 5006
set web open
# Загружаем секцию, устанавливающую туннель
default:
load vpn
vpn:
#
# 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 ipcp ranges 10.123.12.221/24 10.123.12.231/24
set iface up-script /usr/local/etc/mpd5/up.sh
set iface down-script /usr/local/etc/mpd5/down.sh
set iface enable tcpmssfix
set ipcp yes vjcomp
# 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 crypt-reqd
set ccp yes mppc
set mppc yes compress e40 e56 e128 stateless
#
create link static L1 pptp
set link action bundle B1
set link enable multilink
#
set auth authname [LOGIN]
set auth password [PASSWORD]
set link max-redial 0
set link mtu 1460
set link keep-alive 20 75
set link no eap pap
set link accept chap-msv2
set link enable incoming
#
set pptp peer sample.host.ru
set pptp disable windowing
open
Запускающий и завершающий скрипты (up.sh и down.sh) нужны нам для установки правильных маршрутов до vpn сервера. Вот их содержимое:
# cat up.sh
#!/bin/sh
default_route_old=`route -n get default 2>&1 | grep gateway | awk '{print $2}'`
route_isp=`echo $8`
echo $route_isp > /var/tmp/route_isp
if [ $default_route_old ]; then
echo $default_route_old > /var/tmp/default_route_old
route -nq change default `echo $3 | cut -c1-13` -ifp $1
route -nq add $route_isp $default_route_old -ifp msk0
else
rm -f /var/tmp/default_route_old
route -nq change default `echo $3 | cut -c1-13` -ifp $1
route -nq add $route_isp $default_route_old -ifp msk0
fi
# cat down.sh
#!/bin/sh
# Возвращаем старый шлюз из файла /var/tmp/default_route_old
if [ -r /var/tmp/default_route_old ]; then
default_route_old=`cat /var/tmp/default_route_old`
route_isp=`cat /var/tmp/route_isp`
rm -f /var/tmp/default_route_old /var/tmp/route_isp
route -nq change default $default_route_old
route -nq delete $route_isp
fi
В скриптах, в принципе, все понятно, за исключением параметров $1-$8. Эти параметры передает в скрипт mpd во время его запуска, конкретно $1 — это название интерфейса vpn-подключения (обычно ng0), $3 — ip адрес, выдаваемый клиенту сервером и $8 — это ip интернет адрес vpn сервера.
Установка подключения выполняется командой
# mpd5 vpn
После чего этим подключеним можно управлять либо через консоль либо через веб-интерфейс, подключившись к localhost:5006.