Настройка OpenVPN в Ubuntu 12.04

29 September 2013 #ubuntu #security #server

Уже несколько месяцев на своем iPad я использую VPN для выхода в интернет. И я не параноик, дело в том, что мне часто приходиться пользоваться чужими WIFI-точками, и порой бывает, что доступными оказываются только часть распространённых портов, и при этом, к примеру, почта оказывается недоступной.

Сначала использовал мобильный сервис Umbrella, о которой описывал в статье Umbrella – синоним слова безопасность. Но сервера расположены в Америке, и скорость соединения оказывается низкой, наблюдаются частые разрывы соединения, в связи с чем о комфортной работе речи вообще не идет. Как раз в это время на сервисе Cloak VPN появляется новый тариф на 5 гигабайт в месяц, с абонентской платой всего в $2.

Из преимуществ данного сервиса можно выделить наличие серверов в различных точках мира. Простоту настройки и использования, к примеру, для iOS есть отдельное приложение, которое устанавливает в систему необходимые профили соединения и позволяет отслеживать затраты трафика. Я использовал для соединения сервера в Великобритании, это много ближе, чем Соединенные Штаты, поэтому особого влияния на скорость своего соединения я не заметил.

Но, как обычно водиться, я опять вспомнил про свой сервер, почему бы не использовать его для проброса туннеля?

Установка OpenVPN

Довольно долго искал в интернете толковое руководство по установке и настройке OpenVPN, нашел только одно, в библиотеке Linode: Secure Communications with OpenVPN on Ubuntu 12.04 (Precise) and Debian 7, наиболее полно соответствующее реальности, хотя и в данной статье есть упущения. Все остальные постоянно что-то упускали и мне приходилось самостоятельно решать целый ряд проблем.

Вообще я удивлен, Ubuntu развивается довольно быстро, и на сегодняшний день представляет собой юзерфрендли дистрибутив, однако OpenVPN все еще имеет ряд проблем и требует ручной настройки. По крайней мере проблемы можно было решить еще на этапе установки, как впрочем и генерацию ключей для сервера. Неужели никому не нужно?

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

Устанавливаем OpenVPN:

$ sudo su
# apt-get update
# apt-get upgrade
# apt-get install openvpn
# cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn

Собственно на этом установка завершается, при этом сам сервис еще не настроен и не запущен. Приступаем к настройке и генерации ключей:

# cd /etc/openvpn/easy-rsa
# ln -s openssl-1.0.0.cnf openssl.cnf
# source vars
# ./clean-all
# ./build-ca

Хотел обратить особое внимание на вторую команду, создание символической ссылки, без которой генерация ключей просто не будет работать. Странно, что в руководствах обычно данный шаг пропускается.

Теперь генерируем ключи:

# ./build-key-server server
# ./build-key client1

Во врем выполнения данных команд следует ответить на ряд вопросов. Первая команда служит для генерации ключей сервера (server – это имя сервера), вторая для генерации ключей пользователя, если пользователей предполагается несколько, то вторую команду следует повторить еще несколько раз, по числу самих пользователей, задавая в качестве параметра их имена (в примере используется имя client1). Мы тем временем продолжаем:

# ./build-dh
# cd keys
# cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# cd /etc/openvpn
# gunzip -d /etc/openvpn/server.conf.gz

Открываем файл конфигурации VPN-сервера, корректируем его, достаточно только указать имена файлов ключей сервера, что были скопированы, в строках:

ca ca.crt
cert server.crt
key server.key
dh dh1024.pem

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

Можно запускать наш сервер:

# service openvpn start

Если вы считаете, что на этом все, то заблуждаетесь. Во-первых, мы еще не настроили клиента для соединения, и во-вторых, даже если нам удастся соединиться с сервером, то интернет работать не будет. Необходимо настроить форвардинг соединений в ядре и в фаерволе:

# vim /etc/sysctl.conf

Находим строку и снимаем с нее комментарий:

# Enable packet forwarding
net.ipv4.ip_forward=1

И теперь UFW, который я использую на своем сервере:

# vim /etc/default/ufw

Находим строку и меняем значение на ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Далее:

# vim /etc/ufw/before.rules

В самом начале файла, после комментариев, но до строки *filter добавляем следующий блок:

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Теперь активируем изменения и добавляем новое правило для пропускания трафика openvpn через фаервол:

# sysctl -p
# service ufw restart
# ufw allow 1194

Вот теперь настройку сервера можно считать завершенной. Переходим к настройке клиента.

Настройка клиентов

Фактически нам необходимо передать сгенерированные в самом начале ключи клиента на свою рабочу машину и использовать их в программном обеспечении. К примеру, для OSX рекомендуется использовать программу Tunnelblick.

Для установки конфигурации необходимо создать директорию с произвольным именем и дополнительным расширением tblk, в которую копируем файлы ключей, загруженных предварительно с сервера и создаем тесктовый файл с расширением ovpn, примерно с таким содержимым:

client

#connect to VPN server
remote server-ip 1194
proto tcp

#DNS server to use
dhcp-option DNS 8.8.8.8

#remove to use your ISP's gateway
redirect-gateway def1

#your access keys
ca in_ca.crt
cert in_juev.crt
key in_juev.key
ns-cert-type server

#use virtual interface 'tap'
dev tun

#keep trying indefinitely to resolve the host name of the OpenVPN server.
resolv-retry infinite

#most clients don't need to bind to a specific local port number.
nobind

#try to preserve some state across restarts
persist-key
persist-tun

#enable compression on the VPN link
comp-lzo

#set log file verbosity.
verb 4

#silence repeating messages
mute 20

Вместо server-ip подставить ip-адрес сервера. Имена ключей должны совпадать с именами файлов, расположенных в этой директории. Теперь можно импортировать созданную конфигурацию и производить подключение.

Для организации подключения на iPad я использовал программу OpenVPN Connect. После установки программы достаточно через iTunes скопировать файлы ключей и подготовленной конфигурации (файл ovpn) в программу и просто организовать соединение.

Рекомендации

Главный вопрос, зачем это нужно, был затронут в самом начале статьи. Безопасность соединения, это далеко не самое важное. Главное, что появляется возможность использования полноценного интернет-соединения в среде органиченного подключения. Плюс появляется возможность обходить ограничения на некоторых сайтах, которые по поводу и без повода начинают блокироваться на территории России, и плюс появляется возможность пользоваться сервисами, до этого не доступными на территории России, к примеру, тот же Spotify.

Если будут наблюдаться проблемы с доступом по определенным портам, или в некоторых WiFI-сетях не будет возможности провести подключение к своему серверу, можно просто сменить используемые порты на часто-используемый 443, который никто в здравом уме перекрывать не будет.

По стоимости, рекомендую обратить внимание на сервис DigitalOcean, где за $5 в месяц предлагают VPS с 512 мегабайтами оперативной памяти, террабайтом трафика и 20 гигабайтами SSD-диска, машинки очень шустрые и стабильно работающие. Есть возможность создавать сервера в Нью-Йорке и Амстердаме. К примеру, мой сервер в Амстердаме:

$ uptime
 13:32:22 up 136 days,  4:31,  1 user,  load average: 0.01, 0.04, 0.05

За это время нареканий или каких-то проблем в работе выявлено не было.

Если сравнивать с GetCloak, то да, выходит дороже, и не будет возможности выбирать точку выхода. Но дороже всего на $3, а ограничений трафика можно сказать пропадают, террабайт по сравнению с 5 гигабайтами это значительно. На мой взгляд, оно того стоит.