Блог ИТ склеротика. Установка и настройка клиента OpenVPN в Ubuntu

Страницы

Расширенный поиск в статьях блога

24 мая 2012 г.

Установка и настройка клиента 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:
#!/bin/bash
case ${1} in
"up")
  case ${2} in
  "tun0")
    ip rule add ...
    ip route add ...
    ;;
  "tun1")
    ip rule add ...
    ip route add ...
    ;;
  esac
;;
"down")
  case ${2} in
  "tun0")
    ip rule del ...
    ip route del ...
    ;;
  "tun1")
    ip rule del ...
    ip route del ...
    ;;
  esac
  ;;
esac




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



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


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




  • $1up или down;


  • $2 — имя интерфейса. В рассматриваемой мной системе им может быть tun0 или tun1;


  • $3 — например, 1500;


  • $4 — например, 1542


  • $5 — например, 10.8.0.5


  • $6 — например, 10.8.0.6


  • $7init или 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:



AUTOSTART="none"









































.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free