Установка и настройка клиента OpenVPN в Ubuntu






Когда-то давным-давно, когда арбузы на деревьях были совсем ещё зелёными, я познакомился с замечательным проектом OpenVPN, сделавшим мою работу по связыванию распределённых локальных сетей воедино. Первым опытом стала настройка сервера под FreeBSD, ну а дальше, как говорится, понеслось. На сегодняшний день почти все сервера, настроенные мной, работают под Ubuntu Linux той или иной версии.

И вот недавно я обратил внимание на то, что среди барахла, хранящегося в /etc/init.d, скромненько притаился скрипт с именем «openvpn». «Ну и чё?» — тут же спросит опытный администратор. Всё дело в том, что до недавних пор поднятие сетевых интерфейсов, в том числе и TUN, я организовывал исключительно через /etc/network/interfaces, оперируя опциями pre-up для запуска демона OpenVPN и опциями pre-down для его останова. Всё это «безобразие» повсеместно разбавлялось различными командами, манипулирующими таблицами маршрутизации... В общем, довольно громоздкая картинка получалась. В принципе, всё работало вполне себе прилично, но раз есть предоставленный разработчиками иной (Ubuntu-way?) путь, то почему бы им не воспользоваться, тем более, что это позволит значительно разгрузить /etc/network/interfaces. Итак, что у меня получилось.


Установка OpenVPN

Установка OpenVPN в Ubuntu не требует каких-либо финтов ушами:

$ sudo apt-get install openvpn

Обязательно подтвердите установку всех зависимостей.

Тем же, кому хочется/нужно установить OpenVPN из исходных кодов, придётся ознакомиться с соответствующей информацией.

Если вас интересуют бинарные пакеты под другие платформы, посетите страницу загрузок проекта.

Размещение файлов ключей

Раз уж в этой в этой статье я решил рассказать о настройке клиентской части OpenVPN, то будем думать, что файлы ключей шифрования у вас уже имеются (вам их выдал администратор OpenVPN-сервера). Количество и тип ключей зависит от того, как сконфигурирован OpenVPN-сервер, к которому вы подключаетесь. В этой статье предполагается, что  для шифрования и аутентификации используются три файла:

  • закрытый ключ шифрования клиента  в формате .pem (назовём файл client.key);
  • подписанный центром сертификации сертификат клиента в формате .pem, (назовём файл client.crt);
  • сертификат центра сертификации сервера в формате .pem, которым был подписан файл client.crt (назовём файл ca.crt)

Получив ключ и сертификаты, обязательно позаботьтесь об их безопасности. Хорошим решением будет размещение всего этого добра на флешке, зашифрованной, например, TrueCrypt. В этой статье будем полагать, что ключи и сертификаты размещены в каталоге /media/keys. Также, обязательно оставьте минимум прав доступа к каталогу с ключом и сертификатами:

$ sudo chown -R root.root /media/keys
$ sudo chmod 0700 /media/keys
$ sudo chmod 0600 /media/keys/*
# ls -la /media/keys
drwx------ 2 root root 1024 2010-08-18 15:32 .
drwx------ 5 root root 1024 2010-08-18 15:24 ..
-rw------- 1 root root 1265 2010-08-18 22:27 ca.crt
-rw------- 1 root root 3821 2010-08-18 15:13 client.crt
-rw------- 1 root root 887 2010-08-18 15:13 client.key

Файл конфигурации

Фалы конфигурации OpenVPN, как правило, располагаются в каталоге /etc/openvpn или /usr/local/etc/openvpn. В этой статье я предполагаю, что вы установили OpenVPN из репозитариев Ubuntu и каталогом для хранения конфигурации является /etc/openvpn.

Если вы подключаетесь к OpenVPN-серверу, настроенному не вами, то обычно этот кто-то должен вам дать «базовый» файл конфигурации, содержащий минимально-необходимый набор параметров. Среди конфигурационных параметров OpenVPN индивидуальными для клиентского хоста, чаще всего являются пути к файлам ключей и сертификатов, а также пути к внешним скриптам скриптам инициализации.

Допустим, что сервер, к которому вы подключаетесь, называется myvpnsrv.com. Достаточно удобно называть файлы конфигурации (их может быть несколько, если вы пользуетесь несколькими подключениями или несколькими вариантами какого-либо подключения) в соответствии с именами серверов. Так, в нашем примере файл конфигурации будет находится в /etc/openvpn/myvpnsrv.conf со следующим содержанием:

client
remote myvpnsrv.com
ca /media/keys/ca.crt
key /media/keys/client.key
cert /media/keys/client.crt
daemon
dev tun
proto udp
comp-lzo

Первая строка сообщает OpenVPN, что подключение будет осуществляться в режиме клиента.

Значение параметра remote определяет имя хоста или IP-адрес сервера.

Значения параметров ca, keys и cert определяют пути к файлу сертификата CA, закрытому ключу и сертификату клиента соответственно.

Указанием параметра daemon мы заставляем OpenVPN отцепиться от консоли и работать в фоновом режиме.

Параметр dev указывает тип сетевого интерфейса, который будет использоваться для обмена шифрованным трафиком с сервером. Может иметь значение tun или tap. Принципиальную разницу между этими двумя типами интерфейсов можно узнать здесь и здесь.

Параметр proto определяет протокол, в который будет заворачиваться шифрованный трафик. Предпочтительней использовать UDP.

Наличие параметра comp-lzo заставляет OpenVPN сжимать трафик, что очень полезно при наличии «узкого» канала передачи данных.

Маршрутизация и внешние скрипты

OpenVPN среди всего прочего позволяет запускать внешние программы после запуска, а также до и после остановки демона. Очень удобная штука, если вам необходимо шаманить таблицами маршрутизации при поднятии туннеля.

Сразу же отметьте себе один тонкий момент. Для того, чтобы OpenVPN-демон смог запускать внешние программы, ему необходимо это явно разрешить делать, передав параметр script-security со значением, не ниже 2. Безопасность, однако.

Для того, чтобы указать путь к программе, вызываемой автоматически после того, как сетевой интерфейс будет поднят, используйте параметр up, передав ему в качестве значения путь к программе и, возможно,  дополнительные параметры.

Для того, чтобы запускать внешнюю программу после отключения сетевого интерфейса, используйте параметр down, сообщив ему, естественно, путь и параметры вызываемой программы. Если же необходимо, что программа запускалась перед отключением интерфейса, также укажите параметр down-pre без значения.

Теперь немного о специфике вызова внешних программ демоном OpenVPN. Дело в том, что они не просто «тупо» вызываются, а им передаются ещё некоторые параметры подключения, что очень удобно при работе с таблицами маршрутизации.

Формат вызова внешней программы демоном OpenVPN при инициализации tun-интерфейса следующий:

tun_dev tun_mtu link_mtu ifconfig_local_ip ifconfig_remote_ip [init|restart]

где

  • tun-dev — имя сетевого интерфейса, например tun1;
  • tun_mtu — MTU сетефого интерфейса;
  • link_mtu — MTU соединения;
  • ifconfig_local_ip — IP-адрес клиента (на «нашей» стороне);
  • ifconfig_remote_ip — IP-адрес клиента (на стороне сервера);
  • init — передаётся в случае, если программа вызывается во время запуска демона;
  • restart — передаётся, если программа вызывается во время перезапуска демона (например, если была потеря связи);

Для tap-интерфейса формат тот же, за исключением того, что вместо ifconfig_remote_ip передаётся ifconfig_netmask, содержащий маску подсети, в которой находится наш клиент.

Также, следует отметить, что все параметры, которые вы будете передавать внешней программе, при помощи up/down, будут подставлены перед параметрами, перечисленными выше.

Теории, думаю, достаточно, перейдём к делу. Допустим, вам необходимо, чтобы во время запуска/перезапуска/остановки демона OpenVPN каким-то образом видоизменялась таблица маршрутизации вашего хоста. Для двух сетевых интерфейсов я решил эту задачу следующим скриптом на bash:

А вызов скрипта осуществляется двумя параметрами OpenVPN:

up '/usr/local/bin/routes.sh up'
down '/usr/local/bin/routes.sh down'

То есть, запускаемый скрипт получает примерно такие  параметры:

  • $1 — up или down;
  • $2 — имя интерфейса. В рассматриваемой мной системе им может быть tun0 или tun1;
  • $3 — например, 1500;
  • $4 — например, 1542
  • $5 — например, 10.8.0.5
  • $6 — например, 10.8.0.6
  • $7 — init или restart (параметр мной полностью игнорируемый, так что манипуляции с маршрутами выполняются всегда, даже если сетевой интерфейс не был отключён, а всего лишь имел место «штатный» перезапуск демона в связи с отсутствием связи).

Само-собой разумеется, можно (и нужно) использовать значения параметров $3 — $6. Например, если вы хотите какую-то часть трафика «завернуть» через VPN-туннель, то можно в скрипте использовать что-то вроде:

ip route add from 192.168.0.0/24 via ${6}

используя значение переменной $6, чтобы определить адрес маршрутизатора, через который необходимо направлять трафик.

Запуск и останов демона

Собственно, к чему все эти танцы с вызовом внешних скриптов и отказом от старого-доброго /etc/network/interfaces? А вот к чему.

Откройте файл /etc/default/openvpn и в переменной AUTOSTART укажите имя файла (или нескольких, через пробел) конфигурации из каталога /etc/openvpn, откусив расширение «.conf». Для нашего примера это будет выглядеть так:

AUTOSTART="myvpnsrv"

Или же, если нужно, чтобы OpenVPN выполнил подключения на основе всех найденных файлов конфигурации:

AUTOSTART="all"

Теперь «достаточно одной таблэтки» в виде:

sudo service openvpn start

и скрипт из /etc/init.d/openvpn заботливо запустит OpenVPN для всех найденных конфигураций.

Остановка демона также не очень сложна:

sudo service openvpn stop

И напоследок. Если вам понадобилось, чтобы ни один из существующих в /etc/openvpn конфигурационных файлов не обрабатывался, достаточно определить в /etc/default/openvpn:




Установка и настройка клиента OpenVPN в Ubuntu: 5 комментариев

  1. А если нет никаких ключей, есть только голый Убунту и голая Винда 7 ? Откуда взять ключи если хочется управлять из 7ки Убунтой.

  2. Спасибо! Не смог вкурить до конца как запретить весь любой трафик, идущий не через vpn. Т.е. если произошел обрыв соединения с впн, то трафик никуда не шел.

Комментарии запрещены.