Безусловно, это очень упрощенная схема. Но для понимания процесса достаточна. Как видите, у провайдера есть некий-фильтр, который «просматривает» весь ваш трафик и принимает решения, пропустить или нет (настучать на вас или нет :) ). Фактически ваша точка выхода в интернет – это внешние маршрутизаторы вашего провайдера. Именно тут принимается решение, увидите вы тот или иной ресурс или нет.
Что сейчас сделаем мы, запустив наш трафик через интернет:
На наших личных устройствах (компьютер, смартфон, планшет и т.д.) будут установлены и настроены программы-клиенты для VPN сервера. На нашем VPS будет установлена и настроена программа-сервер VPN. Как только они соединятся между собой, появляется наш виртуальный зашифрованный канал поверх всех остальных каналов (красная пунктирная линия на рисунке). Теперь никто не знает, что содержится в трафике между нашими устройствами и нашим VPN сервером, весь трафик надёжно зашифрован. Фактически, теперь наша точка выхода в интернет – это наш VPS. Именно его IP-адрес будут видеть все те Интернет-ресурсы, на которые мы будем заходить. Теперь никакой товарищ майор не узнает, какие видосики вы смотрите, на какие сайты вы ходите и какие сообщения на форумах пишете. Да, если получить доступ к вашему VPS, можно узнать содержимое вашего трафика. Но ведь наш VPS в другой стране, надавить авторитетом на хостера не получится, у него пердставительств и имущества на территории нашей страны и нашего товарища майора пошлют. Нужно затевать полноценное расследование, привлекать международные соглашения, Интерпол, направлять обоснованный (причем обоснованный с точки зрения законодательства страны хостера) запрос. В общем, если вы не натворите чего-нибудь совсем плохого, никто ничего и не получит. Единственное, что от вас требуется: аккуратное обращение с ключами и паролями. Вернёмся к этому вопросу позже.
Хватит теории, переходим к практике.
У вас уже запущены и соединены с сервером PuTTY и WinCSP. Переходим к консоли PuTTY и выполняем следующие команды:
yum install wget -y
yum install unzip zip -y
yum install openvpn -y
Создадим папку для ключей установим её текущей. Для это выполним в консоли команды:
mkdir /etc/openvpn/keys
cd /etc/openvpn/keys
Для генерации ключей мы используем утилиту Easy-RSA. Для начала скачем её себе:
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
Распакуем:
unzip master.zip
Создадим файл с настройками из приложенного образца:
cp vars.example vars
Перейдем в папку с утилитой:
cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
Свернём пока консоль и развернём WinCSP. Перейдём в папку /etc/openvpn/keys/easy-rsa-master/easyrsa3.
Примечание: если в правой панели WinCSP вы вдруг не видите каких-либо файлов или папок, которые там должны быть, нажмите кнопку обновления:
Находим и открываем файл vars. Находим строчки
#set_var EASYRSA_REQ_COUNTRY "US"
#set_var EASYRSA_REQ_PROVINCE "California"
#set_var EASYRSA_REQ_CITY "San Francisco"
#set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL "me@example.net"
#set_var EASYRSA_REQ_OU "My Organizational Unit"
и убираем в начале каждой символ #
Теперь можно включить фантазию и изменить под себя значения в кавычках. Например:
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Moscow"
set_var EASYRSA_REQ_CITY "Moscow"
set_var EASYRSA_REQ_ORG "RosComNadzor"
set_var EASYRSA_REQ_EMAIL "admin@rkn.ru"
set_var EASYRSA_REQ_OU "Otdel besnennogo printera"
Эти параметры обязательны при генерации ключа, но, в нашем случае, ни на что не влияют. Далее находим и приводим к указанному виду следующие параметры:
Строчку
#set_var EASYRSA_KEY_SIZE 2048
превращаем в:
set_var EASYRSA_KEY_SIZE 4096
Строчку
#set_var EASYRSA_DIGEST "sha256"
превращаем в:
set_var EASYRSA_DIGEST "sha512"
В этом файле можно еще много чего поправить, например, срок действия ключа. Но мы не будем этого делать. Перегенерировать ключ раз 180 дней – не так уж и сложно. Закрываем файл с сохранением.
Возвращаемся к консоли PuTTY. Создаем инфраструктуру публичных ключей (PKI, Public Key Infrastructure). Выполним команду:
./easyrsa init-pki
Easy-RSA отвечает нам, что создан каталог /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/
Не буду расписывать, что такое PKI. Про это есть отличная статься с картинками в Википедии.
Нам важно знать, что ключи создаются парами – закрытый и открытый. Для обмена с кем-то защищаемой информацией мы обмениваемся открытыми ключами. В данном случае у сервера будет свой закрытый ключ и открытые ключи клиентов. У клиентов свои закрытые ключи и открытый ключ сервера. А удостоверять подлинность ключей, будет созданный нами же удостоверяющий центр. Его корневой сертификат будет у всех участников обмена.
Создадим свой удостоверяющий центр (СА). По-хорошему, его бы надо создавать не здесь, а на какой-то отдельной машине и, в идеале, не подключенной к интернету. Но, в нашем частном случае, это чрезмерная паранойя. Не будем забывать, что наша задача просто выйти из-под регулирования законодательства своей страны. Если кто-то получит возможность покопаться в нашем сервере, он и так всё узнает. Поэтому не будем усложнять.
Выполним команду:
./easyrsa build-ca
Нас просят придумать пароль:
Да-да, опять пароль. Требования к сложности примерно такие же, как и для пароля ключа SSH. Зачем этот пароль: если корневой сертификат вашего удостоверяющего центра попадёт в чужие руки, то любой сможет сгенерировать пользовательские сертификаты и подключиться к вашему VPN-серверу. Поэтому вы должны беречь от разглашения и закрытый ключ корневого сертификата (файл ca.key), и пароль к нему. Забывать этот пароль также не стоит. Восстановить его нельзя и придется заново создавать корневой сертификат и все пользовательские сертификаты. Не смертельно, но не приятно. В общем придумываем и вводим пароль. Нас попросят ввести его два раза. На следующий вопрос:
просто жмём Enter (также будем поступать для всех остальных ключей). У нас появились файлы ca.crt (корневой сертификат. Он открытый, мы его будем передавать клиентам)
и ca.key (закрытый ключ удостоверяющего центра, его нужно беречь от разглашения. Это самая ценная для вас вещь на вашем сервере).
Теперь создадим пару (открытый, закрытый) ключей для нашего VPN-сервера. Закрытый ключ сервера мы не будем защищать паролем, так как вводить этот пароль пришлось бы при каждой перезагрузке сервера. Создаём запрос на сертификат:
./easyrsa gen-req server nopass
На запрос ввести Common Name просто жмём Enter.
Как видите, на выходе у нас два файла: server.key – это закрытый ключ сервера; server.req – это запрос нашему CA на удостоверение (подписывание) сертификата. Скормим запрос нашему CA:
./easyrsa sign-req server server
CA просит подтвердить, что мы в своём уме и действительно хотим подписать сертификат. Убедим его в этом: наберём yes и нажмём Enter.
Теперь введём пароль от нашего закрытого ключа CA
И вот CA создал подписанный открытый ключ нашего сервера /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/server.crt
А теперь мы сделаем очень нужную штуку. Мы создадим ключ Диффи-Хелмана. Этот ключ защитит наш трафик от расшифровки даже в случае похищения ключей сервера и клиентов. Т.е. если товарищ майор записывал весь ваш шифрованный трафик, скрипя зубами от досады, что не может понять, что ж такое вы делаете. А потом он вдруг заполучит все ваши ключи, то он всё равно не сможет расшифровать тот трафик, который у него записан. Вот такая вот магия математики. Берегите математиков, они умные и защищают нас от товарища майора.
Вводим в консоли команду:
./easyrsa gen-dh
и идём пить чай ибо процесс это не быстрый. А учитывая, что процессор у VPS весьма слабенький, генерация может занять до 15 минут (а может и больше). В общем ждите, магия быстро не делается.
Когда генерация завершится, мы получим файлик /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/dh.pem
Еще мы сделаем список отозванных сертификатов. Он нам пригодится, чтобы сделать недействительными какие-либо клиентские ключи. Например, при утере смартфона с настроенным VPN-клиентом.
Выполним команду:
./easyrsa gen-crl
И получим файл /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/crl.pem. В нём и будет список отозванных сертификатов. Отзывать сертификаты мы потренируемся позже, пока оставим так.
Теперь подкинем VPN-серверу все необходимые ключи. Для этого выполним несколько команд:
cp pki/ca.crt /etc/openvpn/
cp pki/dh.pem /etc/openvpn/
cp pki/crl.pem /etc/openvpn/
cp pki/issued/server.crt /etc/openvpn/
cp pki/private/server.key /etc/openvpn/
Получится вот так:
И сделаем текущей папку VPN-сервера:
cd /etc/openvpn
Еще не много магии для усиления безопасности. Сделаем HMAC (ищите описание на Хабре и в Википедии). Выполним команду:
openvpn --genkey --secret ta.key
Рядом с нашими ключами в папке /etc/openvpn будет создан файл ta.key. Его мы также будем отдавать клиентам.
Теперь с помощью WinCSP поправим права на файлы: ca.crt, crl.pem, dh.pem, server.crt. Сделаем для всех 0644.
А для файлов server.key, ta.key установим права 0600 (по-идее они сразу такие и есть, но на всякий случай проверьте).
В принципе VPN-сервер можно уже сконфигурировать и запускать, но нам пока нечем к нему подключиться. Поэтому создадим ключи для клиента. Вернёмся в папку утилиты Easy-RSA:
cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
Для создания ключа и запроса на подпись используется команда (не спешите вводить, сначала прочитайте то, что ниже):
./easyrsa gen-req client_name nopass
Для подписания запроса и создания открытого ключа команда:
./easyrsa sign-req client client_name
Всё также, как и при создании ключей сервера. Если возникнут вопросы, смотри выше, как мы там это делали.
Обратите внимание на следующее:
- ключ nopass вы можете использовать, а можете не использовать. С ключом nopass вам не потребуется придумывать пароль для закрытого ключа клиента. Тогда, при подключении к VPN-серверу, и вводить его не придётся. Но в этом случае любой, кто завладеет ключом клиента, сможет подключиться к вашему VPN-серверу. Однако, вводить каждый раз пароль не удобно. Ищите компромисс. Например, на домашнем компьютере ключ без пароля, на рабочем – с паролем. Если ваше переносное устройство не имеет дополнительных мер защиты (шифрование накопителя, контроль доступа и пр.) и есть риск потерять устройство, или иным образом скомпрометировать – сделайте ключ с паролем.
- client_name это произвольное, понятное вам название того клиента, который будет им пользоваться. Например, для домашнего компьютера можно сделать имя my_home_pc. Тогда команды будут выглядеть так:
./easyrsa gen-req my_home_pc nopass
./easyrsa sign-req client my_home_pc
А для своего смартфона сделать ключи с именем my_smartphone и с защитой паролем. Тогда команды будут выглядеть так:
./easyrsa gen-req my_smartphone
./easyrsa sign-req client my_smartphone
В общем делайте удобное и понятное имя, чтобы не запутаться в ключах.
Для данной статьи я сделаю тестовые ключи для компьютера и смартфона с именами test_pc и test_smart
Сначала покажу как настроить подключение с компьютера. Мы проверим, что наш VPN работает, а потом расскажу, как настроить на смартфоне.
Клиенту нужно будет передать следующие файлы:
- сгенерированную пару ключей клиента (в моём случае test_pc.crt и test_pc.key)
- открытый сертификат CA (ca.crt)
- ta.key
Никаких других ключей и сертификатов у клиента быть не должно!
Ну вот, все ключи у нас есть. Давайте уже конфигурировать и запускать.
В папке /etc/openvpn создадим файл server.conf (если он там уже есть, удалите и создайте заново). Как создавать файлы, было написано ранее. Содержимое файла будет следующее:
port 443
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
crl-verify crl.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
remote-cert-eku "TLS Web Client Authentication"
keepalive 10 120
tls-server
tls-auth ta.key 0
tls-timeout 120
auth SHA512
cipher AES-256-CBC
comp-lzo
max-clients 10
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 4
Описание опций файла выходит за рамки статьи. О некоторых опциях я расскажу ниже, в процессе.
Сохраним файл. Проверим, чтобы права были 0644.
Теперь пробуем запустить сервер. В консоли команда:
systemctl start openvpn@server
Проверяем, что запустился.
Сначала посмотрим на состояние службы сервера командой:
systemctl status -l openvpn@server
Если всё хорошо, то это будет выглядеть вот так:
Смотрим лог (/etc/openvpn/openvpn.log) и видим там, например:
us=64300 ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)
us=64310 Exiting due to fatal error
Т.е. не найден TUN/TAP драйвер. Об этом я писал в начале статьи. В случае моего текущего хостера это решается просто. В письме (смотри раздел про аренду VPS), которое содержало IP-адрес сервера и пароль на SSH, была дана ссылка на панель управления сервером и логин-пароль к ней. Заходим в эту панель и видим:
Так включим же его. После включения сервер уйдет в перезагрузку, придется закрыть PuTTY и WinCSP, открыть их заново и подключиться к серверу. Возможно, в случае другого хостера, для включения TUN/TAP вам придется написать в тех.поддержку.
Еще раз пробуем запустить службу и проверить её состояние. Всё должно стать хорошо. Если не стало, смотрим логи. Тут универсального рецепта нет. Например, может мешать SELinux (это такая система безопасности Linux). Чиним командой:
semanage port -a -t openvpn_port_t -p udp 443
И опять пробуем запустить службу и проверить состояние.
Еще проверим, что служба VPN-сервера слушает нужный порт (у нас 443):
netstat -tulnp | grep 443
Если напишет что-то типа: -bash: netstat: command not found, то выполняем команду:
yum install net-tools -y
И потом снова:
netstat -tulnp | grep 443
Должно быть так:
Убедившись, что служба стартует без проблем, добавляем её в автозагрузку:
systemctl enable openvpn@server
Ну и отключим логи. На всякий случай ;) Для этого откроем для редактирования файл /etc/openvpn/server.conf и строчку:
log openvpn.log
переделываем в:
log /dev/null
сохраняем и закрываем. Делаем перезапуск службы, чтобы применился новый конфиг:
systemctl restart openvpn@server
И удаляем файл /etc/openvpn/openvpn.log
Нет у нас логов, товарищ майор.
Пришла пора подключиться к нашему серверу. Речь пойдет о компьютерах под управлением операционной системы семейства Windows. Если у вас Linux, то я не пойму, зачем вы всё это читаете.
Скачиваем клиента.
И устанавливаем. В процессе убираем галочку с OpenVPN Service
Остальное не трогаем.
После установки открываем папку C:\Program Files\OpenVPN\config\ и создаем в ней файл client_name.ovpn
В данном случае client_name это произвольное имя, можете сделать его совпадающим с именем ключей.
Содержимое файла:
client
dev tun
proto udp
remote 123.123.123.123 443
resolv-retry infinite
nobind
block-outside-dns
persist-key
persist-tun
mute-replay-warnings
remote-cert-eku "TLS Web Server Authentication"
remote-cert-tls server
tls-client
tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1
auth SHA512
ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\test_pc.crt"
key "C:\\Program Files\\OpenVPN\\config\\test_pc.key"
cipher AES-256-CBC
comp-lzo
verb 3
Вместо 123.123.123.123 вписываем IP-адрес своего сервера. Вместо test_pc.crt, test_pc.key вписываем правильные названия своих клиентских ключей. В общем-то ключи совсем не обязательно должны лежать в папке C:\Program Files\OpenVPN\config\, даже было бы намного лучше, чтобы они здесь не лежали, а находились на флешке и были всегда под контролем. Тогда путь выглядел бы примерно так:
ca "E:\\my_keys\\ca.crt"
Но мы не будем пока мудрить и сделаем так. Сохраняем файл.
При помощи WinCSP скопируем к себе на компьютер все необходимые ключи с сервера:
И запускаем OpenVPN GUI (кнопка Пуск -> OpenVPN -> OpenVPN GUI)
Так как у вас всего один файл .ovpn в папке C:\Program Files\OpenVPN\config\, то соединение должно начаться автоматически. Появится окно с логом соединения:
А как только соединение будет установлено, в трее появится соответствующий значок зеленого цвета:
Щелкнув правой кнопкой мыши на этом значке, можно увидеть меню управления клиентом (отключиться, подключиться, настройка).
Если значок желтый, то клиент в процессе установление соединения.
Если серый, клиент не подключен к VPN-серверу.
Если подключиться не получается, проверяйте настройки файрволла сервера, как это написано выше (в предыдущей части статьи).
Проверяем, что теперь наш видимый в интернете IP-адрес совпадает с IP-адресом сервера. Например, по пройдем по адресу http://myip.ru/ и посмотрим.
Всё, ваша личная VPN сеть работает, товарищ майор больше не может отслеживать ваш трафик.