Установки и настройка OpenVPN в Ubuntu Linux за 5 минут

4 марта 2015

Постоянные читатели этого блога, скорее всего, уже пару-тройку раз в своей жизни настраивали OpenVPN. Но думается, что новичкам данная заметка будет интересна и полезна. Из нее вы узнаете, как за пять минут поднять собственный VPN сервер, а также зачем он, собственно, нужен. Ну хорошо, учитывая время на регистрацию в каком-нибудь Amazon’е, DigitalOcean, Vscale.io или FastVDS и оплату VDS, пожалуй, потребуется не пять минут, а «целых» пятнадцать.

Итак, зачем же кому-то ходить в сеть через VPN? На то есть целый ряд причин. Например, чтобы ваши пароли, передаваемые по HTTP, не утекли, когда вы сидите с открытых WiFi точек неизвестного происхождения. Да и вообще, даже вашему обычному провайдеру не обязательно знать, на какие сайты вы ходите. Еще — чтобы не палить свой IP в IRC сетях и прочих сервисах, с которыми вы работаете. Им знать ваше местоположение тоже совсем ни к чему. Также вам может захотеться попробовать какой-нибудь новый сервис, который пока что недоступен для пользователей с российским IP. Кроме того, трафик между вами и VPN сервером не только шифруется, но и сжимается, что нередко может создать ощущение более быстрого интернета. Еще OpenVPN может быть полезен в ряде других случаев, например, для доступа сотрудников ко внутренним ресурсам компании, когда они не в офисе.

Почему VPN, а не какие-нибудь прокси или пробрасывание портов через SSH, надеюсь, тоже понятно. VPN достаточно настроить один раз и сразу весь трафик всех приложений пойдет через VPN cервер, в сжатом и зашифрованном виде.

Чтобы поднять свой VPN, вам потребуется собственный сервер с Ubuntu Linux (или любым другим Linux/*BSD, но тогда вам будет довольно сложно следовать инструкциям данной заметки), а также права root’а на нем. Если сервер у вас уже есть, хорошо. Если нет, то не расстраивайтесь. В наши дни купить подходящий VDS/VPS можно за смешные 5$ в месяц или даже меньше. Компаний, предлагающих соответствующие услуги — десятки, некоторые были названы в начале заметки. Лично я рекомендую присмотреться к DigitalOcean. Но не поленитесь изучить вопрос самостоятельно, так как к моменту прочтения вами этих строк ситуация на рынке VDS может измениться.

Заходим на сервер, становимся root’ом, говорим:

apt-get update
apt-get install openvpn

Раньше в OpenVPN входила утилита под названием easy-rsa, предназначенная для генерации ключей и сертификатов. Начиная с версии 2.3 эту утилиту из пакета выпилили, поэтому придется скачать и собрать ее самостоятельно:

cd /tmp
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
apt-get install unzip
unzip master.zip
cd easy-rsa-master
./build/build-dist.sh
tar xvzf ./EasyRSA-git-development.tgz
cd EasyRSA-git-development

Генерируем все необходимые ключи и сертификаты. Приготовьтесь вводить для них пароли. Так как мы настраиваем персональный VPN сервер, то, видимо, можно использовать один-единственный пароль, но подлиннее:

./easyrsa init-pki
./easyrsa build-ca
./easyrsa build-server-full server
./easyrsa build-client-full client1
./easyrsa gen-dh

Выполнение последней команды может занять несколько минут.

Переносим полученные ключи и сертификаты в каталог /etc/openvpn/:

mv ./pki/dh.pem /etc/openvpn/dh.pem
mv ./pki/private/client1.key /etc/openvpn/
mv ./pki/private/server.key /etc/openvpn/
mv ./pki/ca.crt /etc/openvpn/
mv ./pki/issued/client1.crt /etc/openvpn/
mv ./pki/issued/server.crt /etc/openvpn/

В том же каталоге создаем файл server.conf:

mode server
dev tun
server 10.128.0.0 255.255.255.0
push "redirect-gateway def1"
# важно! иначе будем ходить в DNS провайдера
push "dhcp-option DNS 8.8.8.8"
tls-server
ca ca.crt
cert server.crt
key server.key
dh dh.pem
proto tcp-server
port 1194
# клиенты видят друг друга
client-to-client
comp-lzo
keepalive 10 120
verb 4
cipher AES-256-CBC
user nobody
group nogroup
max-clients 10
# если вы хотите, чтобы несколько клиентов
# использовали один ключ одновременно:
# duplicate-cn

Попробуем запустить OpenVPN. При запуске от вас будет требоваться ввести пароль. Соответственно, после ребута поднимать OpenVPN придется руками. Но поскольку мы настраиваем персональный VPN, вряд ли это представляет собой бОльшую проблему, чем ключи, лежащие в открытом виде, или еще хуже — сохраненные пароли. Запускаем:

service openvpn start

Проверяем:

netstat -tuwpan

Сервер должен слушать порт 1194. Если это не так, курим /var/log/syslog.

Теперь что касается клиентской стороны. Нам понадобятся файлы client1.crt, client1.key и ca.crt:

mkdir vpn
cd vpn
scp vpn-server:/etc/openvpn/client1.crt ./
scp vpn-server:/etc/openvpn/client1.key ./
scp vpn-server:/etc/openvpn/ca.crt ./

Создадим файл client.conf:

client
proto tcp
dev tun
# !!! замените на настоящий ip адрес сервера
remote 123.45.67.89 1194

# следующие две строчки актуальны только для *nix систем
# на практике они не очень удобны, так как OpenVPN не сможет
# нормально все за собой почистить по завершению работы

# user nobody
# group nogroup

persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
cipher AES-256-CBC
comp-lzo
verb 3

Подрубаемся к серверу, внимательно читаем логи:

sudo openvpn --config client.conf

В соседнем терминале говорим:

ping 10.128.0.1
traceroute mail.ru

Если все было сделано правильно, вы обнаружите, что пинги успешно доходят до 10.128.0.1 (первая команда), но пакеты через него никуда не проходят (вторая команда). Это потому что мы забыли настроить на сервере NAT. Что мне лично кажется странным. Я смутно припоминаю, что когда в свое время я поднимал OpenVPN на FreeBSD, подобного шага не требовалось. Впрочем, я могу и ошибаться.

На сервере открываем файл /etc/sysctl.conf и раскомментируем в нем строчку:

net.ipv4.ip_forward=1

Чтобы не пришлось перезагружаться, говорим:

echo 1 >> /proc/sys/net/ipv4/conf/all/forwarding

Затем:

iptables -A FORWARD -s 10.128.0.0/24 -j ACCEPT
iptables -A FORWARD -d 10.128.0.0/24 -m state \
  --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.128.0.0/24 \
  -j SNAT --to-source 123.45.67.89

… где 123.45.67.89 — это IP сервера. Переподключаемся клиентом, попробуем зайти на какие-нибудь 2ip.ru или eax.me/ip — теперь все должно работать. Если это не так, курим логи. Если все ОК, сохраняем правила фаервола на сервере:

iptables-save > /etc/iptables.rules

… и проверяем, что в файле /etc/network/interfaces есть строчка:

pre-up iptables-restore < /etc/iptables.rules

Если на сервере ранее уже настраивался фаервол, может оказаться, что правила хранятся в файле с именем, отличным от /etc/iptables.rules.

Можно сказать reboot и проверить, что настройки держатся после перезагрузки сервера:

cat /proc/sys/net/ipv4/conf/all/forwarding
iptables -L -n

Сервер OpenVPN, разумеется, придется перезапустить руками.

Осталось сделать последний штрих на клиенте. Дело в том, что (1) запускать openvpn в отдельном терминале и следить, не упал ли он там, неудобно. Кроме того, (2) если на клиенте сказать:

nm-tool | grep DNS
sudo iptables -A OUTPUT -d 192.168.0.1 -j DROP
# ^ для удаления правила введите ту же команду с -D вместо -A

… где 192.168.0.1 — DNS вашего провайдера (выводится утилитой nm-tool), вы обнаружите, что резолвинг доменов сломался, а следовательно клиент все еще использует DNS провайдера. Можно убить двух зайцев, сказав:

sudo apt-get install network-manager-openvpn-gnome

… и настроив VPN через NetworkManager (иконку сети в правом верхнем углу Unity). Делается это несложно, фактически нужно повторить текстовый конфиг клиента при помощи галочек и полей ввода. Понять, какая галочка какой строчке в конфиге соответствует, очень легко. Главное — не полениться залезть во всякие продвинутые свойства сети и прочие разделы настроек. Если же вы где-то ошибетесь, проблему можно с легкостью диагностировать при помощи файла /var/log/syslog.

Несмотря на то, что заметка получилась довольно длинной, настройка OpenVPN действительно занимает всего лишь несколько минут. Безопасного и быстрого вам веб-серфинга!

Дополнение: Я столкнулся с такой проблемой, что OpenVPN не переподключался к серверу после выхода ноутбука из спящего режима. Исправить ситуацию помогла команда sudo pkill --signal SIGHUP --exact openvpn, выполняемая сразу после выходя из спящего режима. Для этого соответствующая команда была дописана в скрипт, который я использую для входа в спящий режим, откуда она вызывается с небольшой задержкой. Чтобы это работало, у пользователя должно быть право говорить sudo без пароля. Кроме того, в конфиге сервера OpenVPN мне пришлось убрать параметр keepalive, а в клиентском конфиге добавить ping-restart 0.

Дополнение: Вы можете держать OpenVPN и веб-серер (например, Nginx) на одном порту. Для этого веб-сервер должен слушать, к примеру, 127.0.0.1:4443, а у OpenVPN в конфиге следом за port 443 нужно написать port-share 127.0.0.1 4443. Конкретно порт 443 интересен тем, что на нем обычно живет HTTPS. Поэтому интернет-провайдеры редко режут или как-то модифицируют трафик, идущий на этот порт. Если держать VPN на другом порту, он может оказаться недоступен по Wi-Fi в каком-нибудь кафе или аэропорте.

Дополнение: Вас также могут заинтересовать статьи, посвященные sshuttle и Tor. А из поста про роутер на базе Raspberry Pi вы узнаете, как можно завернуть в VPN сетевой трафик сразу всех ваших устройств.

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.