Существует два способа организации клиентского 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 .

Смотрите также

Печать/экспорт