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

4 марта 2015

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

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

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

Чтобы поднять свой VPN, вам потребуется собственный сервер с Ubuntu Linux (или любым другим Linux/*BSD, но тогда вам будет довольно сложно следовать инструкциям данной заметки), а также права root’а на нем. Если сервер у вас уже есть, хорошо. Если нет, то не расстраивайтесь. В наши дни купить подходящий VDS/VPS можно за смешные 150 рублей в месяц. Компаний, предлагающих соответствующие услуги — десятки, некоторые были названы в начале заметки. Советовать какой-то конкретный сложно. Если вам нужна машина где-то в США, оплата только с помощью банковских карт и цены в долларах не смущают, присмотритесь к DigitalOcean. Если устраивает расположение сервера в Амстердаме c российским IP и хочется платить как можно меньше, используя Яндекс.Деньги, WebMoney или подобне системы (соответственно, с комиссией) попробуйте VDSina. Ну и, само собой разумеется, не поленитесь изучить вопрос самостоятельно, так как к моменту прочтения вами этих строк ситуация на рынке 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

Попробуем запустить 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 или ip.xss.ru — теперь все должно работать. Если это не так, курим логи. Если все ОК, сохраняем правила фаервола на сервере:

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 действительно занимает всего лишь несколько минут. Безопасного и быстрого вам веб-серфинга! А также, как всегда, я буду искренне рад вашим вопросам и дополнениям.

Метки: , .

Подпишись через RSS, E-Mail, Google+, Facebook, Vk или Twitter!

Понравился пост? Поделись с другими: