Содержание
Существует два способа организации клиентского PPTP-соединения из FreeBSD: 1) используя связку ppp + pptpclient, 2) используя связку netgraph и mpd5. Второй способ более универсален и, как говорят на форумах, намного лучше первого. В данной статье будет рассмотрен первый вариант, как проверенный автором.
Исходные данные
Дано:
- Компьютер с установленной системой FreeBSD 10;
- Провайдер Интернет-услуг, предоставляющий доступ по VPN (PPTP) с выдачей "серого" ip-адреса пользователю;
- Провайдер автоматически назначает ip-адрес компьютерам пользователей в транспортной сети;
- В транспортной сети не используется основной шлюз.
Задача: настроить VPN-соединение для выхода в сеть Интернет через провайдера.
Уровень пользователя: средний, умеющий работать в консоли, с файловыми менеджерами и с текстовыми редакторами.
Решение:
В таких сетях, где провайдер предосталяет услуги, обычно создаётся транспортная сеть, где размещены, например файловые или игровые серверы. К этой же сети подключаются и пользователи, но для доступа в сеть Интернет, пользователь должен настроить как бы "тоннель во внешний мир Интернета" с помощью VPN-соединения.
Конечно, у разных провайдеров свои способы предоставления услуг доступа в Интернет, но остановимся на таком, что предоставляет доступ посредством VPN PPTP.
Итак, для настройки VPN-соединения, провайдер должен выдать параметры этого соединения. Предположим они такие:
| логин: | user-login |
| пароль: | user-password |
| сервер доступа: | 10.0.0.1 или vpn.provider.ru |
| тип vpn-соединения: | PPTP |
| тип аутентификации: | CHAP, MS-CHAP |
| параметры TCP\IP: | автоматические |
| шифрование данных: | нет |
| компрессия данных: | MPPE 128 bit |
Немного о строке "параметры TCP\IP - автоматически" - это означает, что провайдер сам выдаёт адрес и дополнительные сетевые параметры для подключения. Пользователю в этом случае, в параметрах TCP\IP для этого VPN-подключения ничего настраивать не надо.
Установка нужных пакетов
Для настройки собственно VPN-соединения, потребуется установка: ppp, pptpclient и некоторые зависимости. Выбор способа установки - на усмотрение пользователя.
Из портов
Обновляем дерево портов, если не актуально.
# portsnap fetch # portsnap fetch extract
Переходим в каталог pptpclient и производим сборку
# cd /usr/ports/net/pptpclient/ # make # make install clean # rehash
Из бинарных пакетов
# pkg install pptpclient # rehash
Настройка соединения
Редактируем файл /etc/ppp/ppp.conf
Комментируем все строки в секции default, но саму секцию оставляем. В конец файла дописываем параметры нашего соединения:
- ppp.conf
default: # provider: set log phase set ifaddr 0 0 set authname user-login set authkey user-password set timeout 0 set reconnect 3 5 resolv readonly disable vj pred1 deflate deny vj pred1 deflate set mppe * stateless
Строки с параметрами в секции должны начинаться с пробела как показано выше! Имя секции (профиля) начинается с новой строки!
Так как логин\пароль содержатся в этом файле в открытом виде, к файлу нужно ограничить права:
# chmod 600 /etc/ppp/ppp.conf # ls -l /etc/ppp/ppp.conf -rw------- 1 root wheel 1389 Apr 7 20:32 /etc/ppp/ppp.conf
Некоторые пояснения к параметрам:
| provider: | Имя профиля. Оно будет необходимо при запуске |
| set log phase | Устанавливает уровень логгирования работы ppp. phase - уровень установки соединения. События пишутся в лог: /var/log/ppp.log |
| set ifaddr 0 0 | Так как провайдер сам выдаёт адреса клиентам, ставим нули. |
| set authname user-login | Здесь устанавливается логин vpn-аккаунта. |
| set authkey user-password | Здесь устанавливается пароль vpn-аккаунта. |
| set timeout 0 | Здесь устанавливается время в секундах, когда соединение будет разорвано при неактивности. Если 0 - держать активным всегда. |
| set reconnect 3 5 | Переустановить соединение после 5 неудавшихся попыток передачи данных. Интервал между попытками - 3 секунды. |
| resolv readonly | Если DNS-адреса провайдера уже указаны пользователем в /etc/resolv.conf , то, значение readonly указывает не менять параметры в resolv.conf при установке соединения. Иначе демон ppp-соединения перепишет значения в /etc/resolv.conf на провайдерские. |
| disable vj pred1 deflate | Указывает не использовать компрессию заголовков Van Jacobson, не использовать предиктор протокола компрессии, deflate-компрессию. |
| deny vj pred1 deflate | Тоже, но отключает полностью. |
| set mppe * stateless | Указывает использовать шифрование MPPE любой битности в режиме "stateless" (переинициализация словаря шифрования для каждого пакета). |
Последние 3 параметра уточняются у провайдера или подбираются экспериментально по успешному запуску линка. Более подробно все параметры описаны в man ppp.
Переходим к запуску.
Методы запуска соединения
Вучную
# /usr/local/sbin/pptp vpn.provider.ru provider
, где vpn.provider.ru - это адрес VPN-сервера, provider - имя профиля соединения в /etc/ppp/ppp.conf .
После запуска возможны сообщения об ошибках, но их можно игнорировать. Соединение будет активно, пока не будет завершен процесс соединения по kill или Ctrl-C.
Автозапуск соединения при загрузке ОС
Если необходимо, чтобы vpn-соединение активировалось после загрузки ОС, необходимо создать скрипт запуска соединения, поместить его в каталог скриптов инициализации и указать в /etc/rc.conf разрешение на запуск.
В любимом редакторе создаём скрипт запуска с именем providervpn и сохраняем его в /usr/local/etc/rc.d/ :
- providervpn
#!/bin/sh name="providervpn" rcvar="providervpn_enable" pidfile="/var/run/${name}.pid" vpn_server="vpn.provider.ru" conn_name="provider" tun0_pid="/var/run/tun0.pid" case "$1" in start) if [[|f $tun0_pid ]]; then echo "Connection already active!" else echo "Connection not active yet. Starting." /usr/local/sbin/pptp ${vpn_server} ${conn_name} & 2>&1 touch $pidfile fi ;; stop) if [[|f $tun0_pid ]]; then echo "Connection is active. Stopping." tun0_pid_value=`cat ${tun0_pid}` kill $tun0_pid_value rm -f $pidfile else echo "Connection not active yet!" fi ;; status) if [[|f $tun0_pid ]]; then tun0_pid_value=`cat ${tun0_pid}` echo "Connection is active. PID=${tun0_pid_value}." else echo "Connection not active yet!" fi ;; * ) echo "Usage: `basename $0` {start|stop|status}" >&2 exit 64 ;; esac exit 0
Делаем файл скрипта выполняемым:
# chmod +x /usr/local/etc/rc.d/providervpn
Далее, разрешаем загрузку при старте - открываем на редактирование /etc/rc.conf и добавляем строку:
providervpn_enable="YES"
Обратите внимание, что providervpn_enable - это значение параметра, определённое в переменной rcvar скрипта запуска соединения.
Пробуем ручной запуск, который обеспечит активацию и работу соединения в фоновом режиме:
# /usr/local/etc/rc.d/providervpn start
Обратите внимание, что данный скрипт сделан для классической системы инициализации. Во FreeBSD 10, наравне с классической системой инициализации, используется и новая система, в которой можно указывать разные зависимости. Автор пока не разобрался с новой системой, поэтому, не удивляйтесь, что утилита инспектирования процесса запуска:
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
выдаст очередь запуска скрипта vpn-соединения в секции DAEMON, а не NETWORKING.
Установка параметров и выполнение скриптов после старта или останова соединения
Также как и в Linux, во FreeBSD есть возможность запуска скриптов при включении и отключении соединения, но взаимодействие и семантика скриптов другая.
Конфиги /etc/ppp/ppp.linkup и /etc/ppp/ppp.linkdown - соответственно содержат команды и параметры исполняемые во время включения и выключения соединения. Для разделения параметров, как и в /etc/ppp.conf применяется имя профиля соединения.
Пример установки маршрута по умолчанию на провайдерский шлюз после активации соединения
/etc/ppp/ppp.linkup
providervpn: add default HISADDR
Пример установки своих DNS-адресов, а не провайдерских
При запуске, ставим DNS-сервер от google и назначаем основной маршрут на провайдера: /etc/ppp/ppp.linkup
providervpn: add default HISADDR ! sh -c "echo 'nameserver 8.8.8.8' >> /etc/resolv.conf"
При отключении возвращаем провайдерский DNS, действующий в транспортной локальной или WAN сети.
/etc/ppp/ppp.linkdown
providervpn: ! sh -c "echo 'nameserver 10.0.0.1' >> /etc/resolv.conf"
Отладка запуска соединения
Рабочее соединение создаёт интерфейс типа tun* . Внизу секции этого интерфейса указывается PID-файл процесса ppp, ответственного за соединение.
# ifconfig rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=2008<VLAN_MTU,WOL_MAGIC> ether 00:01:18:2a:b7:e5 inet 10.10.10.195 netmask 0xffffff00 broadcast 10.255.255.255 media: Ethernet autoselect (100baseTX <full-duplex>) status: active lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6> inet 127.0.0.1 netmask 0xff000000 tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1498 options=80000<LINKSTATE> inet 192.168.1.168 --> 192.168.1.1 netmask 0xffffffff Opened by PID 622
Если интерфейс не создаётся, смотрим лог: /var/log/ppp.log на предмет каких-либо ошибок. Для более подробного логгирования процесса работы демона ppp, можно прописать другие значения параметра "set log" в конфиге /etc/ppp/ppp.conf . Например:
set log Phase Chat LCP IPCP CCP tun command
После отладки соединения, чтобы лог не "разбухал" значение "set log" лучше выставить в phase .
Смотрите также
- man ppp
- man pptp