Установка OpenVPN
Установка OpenVPN в Ubuntu не требует каких-либо финтов ушами:
$ sudo apt-get install openvpn
Обязательно подтвердите установку всех зависимостей.
Тем же, кому хочется/нужно установить OpenVPN из исходных кодов, придётся ознакомиться с .
Если вас интересуют бинарные пакеты под другие платформы, посетите .
Размещение файлов ключей
Раз уж в этой в этой статье я решил рассказать о настройке клиентской части OpenVPN, то будем думать, что файлы ключей шифрования у вас уже имеются (вам их выдал администратор OpenVPN-сервера). Количество и тип ключей зависит от того, как сконфигурирован OpenVPN-сервер, к которому вы подключаетесь. В этой статье предполагается, что для шифрования и аутентификации используются три файла:
- закрытый ключ шифрования клиента в формате .pem (назовём файл client.key);
- подписанный центром сертификации сертификат клиента в формате .pem, (назовём файлclient.crt);
- сертификат центра сертификации сервера в формате .pem, которым был подписан файлclient.crt (назовём файл ca.crt)
Получив ключ и сертификаты, обязательно позаботьтесь об их безопасности. Хорошим решением будет размещение всего этого добра на флешке, зашифрованной, например,. В этой статье будем полагать, что ключи и сертификаты размещены в каталоге/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:
AUTOSTART="none"