В самом начале этого блога я писал, как обходить блокировки, но та инструкция немного устарела. Полагаю, пришла пора ее обновить, и я решил сделать это не в изначальном посте, а написать новый, исходя из текущих реалий. На выходе вы получите свой работающий OVPN (OpenVPN), подключающийся по одному клику. Итак, поехали…
Отмазка: подразумевается, что у вас уже есть сервер с Ubuntu на борту, если нет — заведите (чтобы это сделать есть две ссылки справа, одна на Linode, вторая на DigitalOcean). По опыту не все читатели понимают очевидные вещи, поэтому писать буду подробно.
#1: Установим и настроим OpenVPN сервер и его окружение
Обновимся…
1 2 |
apt-get update apt-get upgrade |
Теперь установим OpenVPN и Easy-RSA…
1 |
apt-get install openvpn easy-rsa |
Конфиг по дефолту должен быть распакован в /etc/openvpn, поэтому делаем так…
1 |
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf |
Теперь надо открыть файл server.conf и отредактировать его…
1 |
nano /etc/openvpn/server.conf |
В этот файлик необходимо внести некоторые изменения. Найдите секцию файла, которая выглядит примерно так:
1 2 3 4 5 6 |
# Diffie hellman parameters. # Generate your own with: # openssl dhparam -out dh1024.pem 1024 # Substitute 2048 for 1024 if you are using # 2048 bit keys. dh dh1024.pem |
Замените dh1024.pem на dh2048.pem — это удвоит длину ключа RSA при генерации ключей сервера и клиента. Теперь вам надо найти вот эту секцию файла:
1 2 3 4 5 6 7 8 9 |
# If enabled, this directive will configure # all clients to redirect their default # network gateway through the VPN, causing # all IP traffic such as web browsing and # and DNS lookups to go through the VPN # (The OpenVPN server machine may need to NAT # or bridge the TUN/TAP interface to the internet # in order for this to work properly). ;push "redirect-gateway def1 bypass-dhcp" |
Раскомментируйте строку push “redirect-gateway def1 bypass-dhcp”, чтобы VPN-сервер отправлял клиентский трафик (то есть ваш) куда следует… В итоге, эта строка должна выглядеть так:
1 |
push "redirect-gateway def1 bypass-dhcp" |
Далее ищем вот такую секцию:
1 2 3 4 5 6 7 8 |
# Certain Windows-specific network settings # can be pushed to clients, such as DNS # or WINS server addresses. CAVEAT: # http://openvpn.net/faq.html#dhcpcaveats # The addresses below refer to the public # DNS servers provided by opendns.com. ;push "dhcp-option DNS 208.67.222.222" ;push "dhcp-option DNS 208.67.220.220" |
Аналогично, нужно раскомментировать строки push “dhcp-option DNS 208.67.222.222” и push “dhcp-option DNS 208.67.220.220”. В итоге, они должны выглядеть так:
1 2 |
push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220" |
Эта опция указывает клиенту на необходимость использования сторонних DNS-серверов, это может помочь избежать утечек данных при работе с соединением. Можете заменить прописанные IP-адреса DNS-серверов на 8.8.8.8 и 8.8.4.4, а можете оставить те, которые есть (OpenDNS). С DNS разобрались, ищем теперь вот это:
1 2 3 4 |
# You can uncomment this out on # non-Windows systems. ;user nobody ;group nogroup |
Раскомментируем строки user nobody и group nogroup, чтобы получилось так:
1 2 |
user nobody group nogroup |
По умолчанию OpenVPN работает от рута и имеет полный доступ к машине — на мой взгляд это не есть правильно, поэтому мы только что сконфигурировали его работать от юзера nobody с группой nogroup. Это юзер без каких-либо привиллегий, обычно зарезервированный системой для работы недоверенных приложений. Теперь можно сохранить файл и выйти.
Базовая настройка OpenVPN сервера завершена, но есть еще нюансы, без которых работать нихрена не будет. В частности, есть такая системная опция sysctl, которая указывает ядру сервера на необходимость перенаправлять трафик от клиентских устройств в Интернет. В противном случае, трафик дальше вашего сервера никуда не пойдет. Нам такой вариант не нужен, поэтому включим перенаправление пакетов:
1 |
echo 1 > /proc/sys/net/ipv4/ip_forward |
Нам также надо, чтобы эта настройка была постоянно, а не слетала при каждой перезагрузке сервера, поэтому:
1 |
nano /etc/sysctl.conf |
Почти в самому верху файла вы должны увидеть такие строки:
1 2 |
# Uncomment the next line to enable packet forwarding for IPv4 #net.ipv4.ip_forward=1 |
Раскомментируйте строку net.ipv4.ip_forward, в итоге она должна выглядеть вот так:
1 2 |
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 |
Теперь можно сохранить этот файл и выйти. В Ubuntu, начиная с версии 14.04 есть такая штука — называется Uncomplicated Firewall (ufw), он нам понадобится. ufw это фронтенд для iptables, настроить его легко, нужно просто создать несколько правил и поправить конфиги, а затем включать файрвол. Поехали…
1 |
ufw allow ssh |
Мы будем настраивать OpenVPN на работу по протоколу UDP, поэтому ufw должен разрешать UDP-трафик через порт 1194.
1 |
ufw allow 1194/udp |
Также, для самого ufw нужно задать правило перенаправления пакетов, откроем конфиг:
1 |
nano /etc/default/ufw |
Ищем строку DEFAULT_FORWARD_POLICY=”DROP”. Ее значение нужно изменить с DROP на ACCEPT, чтобы в итоге получилось вот так:
1 |
DEFAULT_FORWARD_POLICY="ACCEPT" |
Теперь надо добавить несколько дополнительных правил для ufw, чтобы включить NAT и маскарадинг для подключенных клиентов:
1 |
nano /etc/ufw/before.rules |
Сразу после этой секции:
1 2 3 4 5 6 7 8 9 |
# # rules.before # # Rules that should be run before the ufw command line added rules. Custom # rules should be added to one of these chains: # ufw-before-input # ufw-before-output # ufw-before-forward # |
Надо добавить:
1 2 3 4 5 6 7 8 |
# 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 |
Теперь можно сохранить файлик и выйти. Затем, включаем ufw:
1 |
ufw enable |
ufw может спросить:
1 |
Command may disrupt existing ssh connections. Proceed with operation (y|n)? |
Скажем, что да и нажмем энтер:
1 |
y |
Если все было сделано правильно — напишет:
1 |
Firewall is active and enabled on system startup |
Можно проверить его статус (не обязательно):
1 |
ufw status |
Ответит, скорее всего, как-то так:
1 2 3 4 5 6 7 8 |
Status: active To Action From -- ------ ---- 22 ALLOW Anywhere 1194/udp ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6) 1194/udp (v6) ALLOW Anywhere (v6) |
На этом настройка OpenVPN сервера и файрвола завершена, едем дальше ;-)
#2: Создадим сертификаты и ключи
OpenVPN использует сертификаты для того чтобы шифровать трафик между клиентом и сервером.
Настроим Certificate Authority (CA) и сгенерируем сертификат и ключ для OpenVPN сервера. OpenVPN поддерживает двухстороннюю авторизацию, основанную на сертификатах. Это означает, что клиент должен авторизовать сертификат сервера и сервер должен авторизовать сертификат клиента прежде чем взаимное доверительное соединение будет установлено. Для этой цели будем использовать скрипты Easy RSA, которые мы скопировали ранее. Поехали:
1 |
cp -r /usr/share/easy-rsa/ /etc/openvpn |
Создадим директорию для хранения ключей:
1 |
mkdir /etc/openvpn/easy-rsa/keys |
У Easy RSA есть файлик с переменными, который мы можем отредактировать (а можем и не трогать, это опционально), для того чтобы создавать сертификаты эксклюзивно для себя, своего бизнеса, и так далее. Эта информация копируется в сертификаты и ключи, и помогает идентифицировать ключи позднее. Откроем файл:
1 |
nano /etc/openvpn/easy-rsa/vars |
В этой секции:
1 2 3 4 5 6 |
export KEY_COUNTRY="US" export KEY_PROVINCE="TX" export KEY_CITY="Dallas" export KEY_ORG="My Company Name" export KEY_EMAIL="sammy@example.com" export KEY_OU="MYOrganizationalUnit" |
Можете редактировать все, что находится в кавычках, вписывая ваши данные (по желанию). В том же файле, проследите, чтобы строка выглядела так:
1 |
export KEY_NAME="server" |
Теперь надо сгенерить параметры Diffie-Hellman, это займет несколько минут (в зависимости от мощности сервера):
1 |
openssl dhparam -out /etc/openvpn/dh2048.pem 2048 |
Сменим рабочую директорию:
1 |
cd /etc/openvpn/easy-rsa |
Инициализируем PKI (Public Key Infrastructure):
1 |
. ./vars |
Ответ должен быть таким:
1 |
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys |
Теперь очистим рабочую директорию от любых возможных старых (или демо) ключей:
1 |
./clean-all |
Почти финал… Осталось сделать билд CA, в процессе спросят о данных — можно либо их вводить, либо оставить дефолтные (нажимая энтер), это не принципиально:
1 |
./build-ca |
Далее нам нужно сгенерировать сертификат и ключ для сервера (в процессе также может запросить данные и challenge пароль, везде давим энтер):
1 |
./build-key-server server |
Спросит:
1 2 |
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n] |
Ответим, что да:
1 |
y |
Если все было ок — скажет так:
1 2 |
Write out database with 1 new entries Data Base Updated |
Теперь надо переместить серверные сертификаты и ключи:
1 |
cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn |
Для того, чтобы проверить, были ли они корректно скопированы:
1 |
ls /etc/openvpn |
На этом вроде бы все, можно запускать:
1 2 |
service openvpn start service openvpn status |
Должно сказать:
1 |
VPN 'server' is running |
На этом настройка сервера завершена. Теперь, нам нужно сгенерить сертификаты и ключи для клиента:
1 |
./build-key client1 |
Как обычно, все это можно не заполнять, везде жмем энтер:
1 2 3 4 |
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: |
Далее будет два запроса:
1 2 |
Sign the certificate? [y/n] 1 out of 1 certificate requests certified, commit? [y/n] |
На оба отвечаем да:
1 |
y |
Если нигде не ошиблись, то должно быть так:
1 2 |
Write out database with 1 new entries Data Base Updated |
Далее:
1 |
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn |
Все. Теперь вам надо зайти на сервер через sftp и забрать следующие файлы к себе на клиентский компьютер:
- ca.crt
- client1.crt
- client1.key
#3: Настроим клиентский компьютер
Я советую платный софт, который называется Viscosity. Стоит всего $9, и он действительно стоит этих денег — не жалейте, покупайте. Есть версии и под винду, и под мак. Лицензия не взаимозаменяема. Скриншоты приводить не стану — там все просто, разберетесь. Нужно создать новое соединение, во вкладке “Аутентификация” выбрать тип “SSL/TLS Client” и скормить ему файлы, которые вы загрузили ранее. Затем там же вкладка “Сеть”, нужно отметить (включить) пункт “Отправлять весь трафик через VPN”. Все.
Если будут какие-либо вопросы — с радостью отвечу на них в комментариях.
Pingback: ФЗ-187: Наиболее правильный обход блокировок — TheWired()
Pingback: Насколько безопасен OpenVPN — TheWired()
Pingback: Как избежать утечки трафика при использовании OpenVPN на Android — TheWired()