Скромной приватности гид

или как правильно готовить ВПН, ака VPN — virtual private network

Учитывая последние инициативы всяких бешенных принтеров, и прочих контрол-фриков (это такие чудесные звери помешанные на контроле всего и вся) вопрос защиты от онлайн наблюдения встаёт всё острее. И напонимаю: наблюдение === подавление.

Данная статья разбита на три части:

  1. Что такое ВПН, зачем это нужно и где его завести
  2. Настройки OpenVPN серверной части
  3. Настройки OpenVPN клиентской части

Многа-букафф\лень читать: или у меня есть *.ovpn файл конфига — сразу на третью часть.

Что такое ВПН

Если говорить понятным языком — ВПН это способ объединения нескольких персональных компьютеров (к коим сейчас можно относить очень широкий класс устройств) через интернет приватно. Т.е. так, чтобы никто между ними не видел какой информацией происходит обмен. Также это можно использовать для обхода цензуры — запрета определённых сервисов на определенной територии и тому подобное. Как только цензура перестаёт быть внутренней, она становиться вредна.

На сегодняшний день существует море т.н. VPN сервисов, в котором вам дают ключи, т.е. пару логин-пароль, и вы бывает какаете какой-то клиент, а бывает обходитесь настройками в браузере, но в любом случае, ни о какой P, т.е. приватности в данном случае речи не идёт. Т.к. сразу наличествует третья сторона, которая для вас в данном случае является черным ящиком, и одна Вечность знает, что там с вашим трафиком делают. Ещё один важный недостаток таких решений — если вы нашли такой сервис, то и соответсвующие органы его найдут также легко. И ограничат или запретят к нему доступ. Предлагаемое мной решение тоже не даёт 100% гарантии защиты от ограничения доступа (т.к. оно всё равно централизовано), но сводит его к минимуму.

Первое что нам понадобиться — это виртуальный сервер где-то там. Можно использовать для этого Amazon Web Services EC2, MS Azure, Google Compute Cloud или любой другой облачный провайдер. Основная хрень в случае больших провайдеров — это их KYC(Know Your Customer), или знай своего клиента. А целью данного руководства является всё-таки скромная, но приватность. В силу этого был выбран небольшой (по сравнению с гуглом) провайдер — ITL group (ссылко реферальная, но как обычно персональную инфу я не собираю здесь). Для регестрации достаточно емейла, и если пользоваться например protonmail, причём желательно избегать вэб-интерфейса в случае крайней паранои, то вообще всё ОК. Более того данный сервис принимает оплату криптой, т.е. ни карточки, ни прочие персональзированные платёжные системы не требуются.

Для наших целей хватит обычного минимального VDS (виртуального выделенного сервера):

Требуемый виртуальный сервер

Соответсвенно серверу мы выбираем локацию — учитывая, что мы хотим хоть и приватный, но шустрый интернет, т.е. можно забить на всё это и обращаться в сеть исключительно через ТОР, но в этом случае скорость будет варьироваться от модемной (кто еще помнит модемы на 9200, то скорее уж 56к), до полноценного широкополосного, это вне вашего контроля. Т.е. выбираем то, что не очень далеко от вас — из России, например, вполне подойдет Голландия или Латвия. Или даже Украина.

Также к достойнствам данного провайдера стоит отнести простую установку операционной системы, да, мечта — в 1 клик. В целях экономии всего и вся мной была выбрана Centos 7, которая в установке занимает ~600 мегабайт, ещё столько же мы потратим на нужный софт. Да, доступ к нашей виртуальной машинке будет через SSH, т.е. с програмками типа PUTTY для Виндовс, или терминала для Линуксов и Маков. Никакого графического интерфейса конечно не предусмотрено (зачем плодить ненужные сущности?), нормальный чистый шелл. Всё, понеслась, дальше начинается хардкор!

OpenVPN — настройка сервера

Итак, вы получили заветное письмо от провайдера с кредами, от credentials, или паролями-явками:

пример явок-паролей

Собственно нам нужен ИП адрес, юзер (он будет с рут-правами, т.е. полный контроль) и пароль. Пароли есессно надо сразу сменить, в панели провайдера, ибо a) пароли от ssh не один вменяемый клиент не даст запомнить б) ваш емейл провайдер его уже видел в) перебором такое подобрать значительно быстрее чем a_ya_uge_zapomnil_etot_parol. Всё мы оказались в шелл-консоли, теперь нужно установить нужный софт, и да, мы поставим сразу несколько программ одной командной, привет Винда! Погнали:

sudo yum update -y
sudo yum install epel-release -y
sudo yum update -y

Убедились что менеджер пакетов, встроенный в ЦентОС ( это то, что скрывается за буквами yum) актуален. Поставили EPEL ( Extra Packages for Enterprise Linux ) и снова проверили актуальность. Теперь основная котлета. Поскольку данное руководство весьма параноидально, помимо собственно OpenVPN понадобится EasyRSA, да, весь трафик по умолчанию будет сурово защифрован, так что никакой deep packet inspection нас не испугает.

sudo yum install -y openvpn easy-rsa iptables iptables-services wget yum-cron net-tools bind-utils nc mtr 

Также подцепили Iptables. Это то, что называется state-of-art, фаерволл. Теперь нужно изменить конфигурацию сервера:

vi /etc/openvpn/server.conf

Vi — это текстовый редактор по умолчанию, он крайне, предельно минималистичен. Ибо нефик. Украшательства нам не нужны. Можно взять мой файл, можно развлечь себя на пару недель пониманием как ещё можно конфигурировать сервер, напомню сейчас он заточен чтобы предоставлять клиентским компьютерам выход в сеть приватно.

# Базовые настройки сервера
dev tun
proto tcp
port 1194
keepalive 10 120
max-clients 50

# Сертификаты шифрования
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0

# Шифрование и закалка
reneg-sec 0
remote-cert-tls client
crl-verify crl.pem
tls-version-min 1.2
cipher AES-256-CBC
auth SHA512
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

# После инициализации сервера дропаем root-доступ
user nobody
group nobody

# Настройки пула ИП адресов в нашей сети
server 172.31.100.0 255.255.255.0
topology subnet
ifconfig-pool-persist ipp.txt
client-config-dir ccd

# Разное 
persist-key
persist-tun
comp-lzo

# Весь трафик пускаем через OpenVPN и используем публичные днс сервера Гугла. Для совсем параноиков можно поднять свой, но пока так 
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

# Логи. 3 - храним кто когда подключается, и критические диагностические сообщения
log-append /var/log/openvpn.log
verb 3

Многие параметры имеют достаточно описательное наименование. Proto TCP (используем tcp сооединение, можно udp, который обеспечивает лучшую устойчивость к сканированию портов и ддосу, но у меня он как-то не полетел), через порт 1194, макс клиентов — и т.п. Надо отметить что для эксперимента Я протестил все 10 клиентов под тяжёлым трафиком, и при этом нагрузка на наш хиленький виртуальный сервер не превышала 3% по времени процессора и памяти.

Теперь пришло время сформировать сертификаты сервера и клиента. Для этого используем EasyRSA. Сертификаты сервера мы генерируем однажды (секрет держим на сервере) и публичный выдаем клиентам, он нужен для того, чтобы клиенты знали что они именно с нашим сервером связываются, если вдруг где-то что-то пойдёт не так, и например ваш интернет провайдер погонит весь трафик через все порты через свой сервер, клиент не даст установить соединение. Это очень маловероятно, но я тоже когда-то репостнул изображение из группы МДК в контакте. Маловероятно не значит невозможно. Следующие команды набирать (или через shift+insert) последовательно!

mkdir /etc/openvpn/ccd
cd ~

Создаём директорию для файлов клиентов. И на всяк возвращаемся в корень

/usr/share/easy-rsa/3/easyrsa init-pki

Инициализируем PKI т.е. Public Key Infrastructure, иначе говоря всё то что нам понадобиться для генерации ключей.

/usr/share/easy-rsa/3/easyrsa build-ca nopass

Программа спросит имя сервера, я использовал просто «VPN», можно указать FQDN имя сервера (aka Fully Qualified Domain Name), однако же, я предпочёл этого не делать, дабы не потерять портабельность, вдруг я решу перейти на физический сервер или в другое облако, тогда придётся заново создавать все сертификаты, и сервера и клиентов. Nopass потому как мы же не хотим чтобы при каждом соединении пользователю дополнительно ко всем приблудам всплывало окошко с паролем, это уже избыточно.

 /usr/share/easy-rsa/3/easyrsa gen-dh

создаём параметры Diffie-Helllman, нужные для сервера для установки защищённого соединения. Это может занять некоторое заметное время, в окружении использованном мной, около 40 секунд.

/usr/share/easy-rsa/3/easyrsa build-server-full vpn-server nopass

Создаём ключи сервера. vpn-server — имя вашего сервера, какое удобней, но оно понадобиться в будущем так что не стоит использовать рандомную крокозябру. Хоть её и можно будет подсмотреть — но зачем лишний раз?

/usr/share/easy-rsa/3/easyrsa build-client-full klient-1 nopass

В вашем случае klient-1 это местное имя устройства(не обязательно его реальное имя, каким бы оно не было, исключительно для удобства), которое будет подключаться к серверу. Эту команду можо повторять сколько нужно раз, единственно имена должны быть разными.

/usr/share/easy-rsa/3/easyrsa gen-crl

АПДЕЙТ: контрольный сертификат по умолчания действует 180 дней. По-этому можно либо озаботиться увеличением этого времени, либо за день-до запустить команду выше снова и закопировать в директорию openvpn (ниже)

Создаём список для отзыва сертификатов. Мало-ли кто-то станет плохо себя вести?) Но об этом в другой раз.

openvpn --genkey --secret pki/ta.key

Это мы сгенерировали предварительно разделенный ключ (пре-шаред ключ). Это тоже немного поможет нашей параное. Подробнее здесь.

Теперь копируем сгенерированные ключи в папку openvpn, чтобы сервер знал, что происходит. Все нужные файлы находяться в корне в папке pki. Можете проверить это набрав:

cd ~
ls
cd pki

Файлы *.key — это секретная часть ключа, файлы *.crt — это публичная часть ключа, т.н. сертификат. Теперь копируем, если всё было как описано, то это должно выглядеть так:

sudo cp pki/ca.crt /etc/openvpn/ca.crt
sudo cp pki/dh.pem /etc/openvpn/dh.pem
sudo cp pki/issued/vpn-server.crt /etc/openvpn/server.crt
sudo cp pki/private/vpn-server.key /etc/openvpn/server.key
sudo cp pki/ta.key /etc/openvpn/ta.key
sudo cp pki/crl.pem /etc/openvpn/crl.pem

Теперь надо всё это делать запустить. И настроить так, чтобы в случае перезапуска нашего виртуального сервера(сервер это такая машинка которая работает 365\24\7, но бывает что угодно) всё запускалось само:

sudo systemctl -f enable openvpn@server.service
sudo systemctl start openvpn@server.service

Настал хороший момент проверить, что пока всё идёт как надо. Для этого посмотрим хвост(tail) лог файла:

sudo tail -f /var/log/openvpn.log

Ctrl+C, чтобы выйти из просмотра хвоста

Также уже сейчас, можно перейти на финальный этап, конфигурацю клиента, установить соединение и опинговать (Ping 172.31.100.1), если пакеты не теряются, то значит всё ОК, иначе — увидите в хвосте лога. Обычный интернет трафик пока что не пойдёт, тут немного подкрутим iptables. Но для этого нам нужно заставить наш сервер пропускать весь Ip v4 трафик, ибо никакая вменяемая система по умолчанию этого не делает, представьте себе на минуточку, в случае если у вас статичный ИП у ващего интернет-провайдера, через вас кто угодно сможет гнать свой трафик. Не дело же!

vi /etc/sysctl.conf

Добаваляем туда:

net.ipv4.ip_forward = 1

Сохранив файл (нажимаем esc и набираем :wq), применяем изменение:

sudo sysctl -p

Теперь нужно весь трафик загнать в openvpn, дропнуть левых и прочее. Внимание! Таблицы надо вводить разом, проше всего это сделать создав отдельный bash скрипт, предварительно сохранив существующие таблицы:

iptables-save > /tmp/iptables.txt

Внимание, если вам лень разбираться с этим, то немного отклонившись вы можете случайно выбить себя из системы, да так что больше не зайдёте. Создаём файл скрипта для ип-таблиц:

cd ~
touch simple.sh
vi simple.sh

Через ctrl+insert вставляем в него следующее содерджимое:

#!/bin/bash
# Стираем все правила
iptables -F FORWARD
iptables -F INPUT
iptables -F OUTPUT
iptables -X
# Устанавливаем все правила по умолчанию
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Позволяем всему трафику идти через ип таблицы и дальше
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Принимаем весь трафик идуший наружу на интрефейс по умолчанию
iptables -I OUTPUT -o eth0 -d 0.0.0.0/0 -j ACCEPT
# Принимаем все входяшие соединения на интерфейс по умолчанию
iptables -I INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
## Принимаем все входяшие SSH соединения, именно из-за этого и нужен # хороший пароль ssh, но я об этом подумаю позже)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT
# Принимаем весь входяший трафик на порт OpenVPN
iptables -A INPUT -p tcp --dport 1194 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT
# Активируем NAT для VPN
iptables -t nat -A POSTROUTING -s 172.31.100.0/24 -o eth0 -j MASQUERADE
# позволяем TUN соединения для нашего OpenVPN server
iptables -A INPUT -i tun0 -j ACCEPT
# позволяем TUN соединения к нашему серверу идти дальше
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
# Позволяем всем исходяшим соединениям через наш VPN идти куда угодно в интернете
iptables -A FORWARD -i tun0 -s 172.31.100.0/24 -d 0.0.0.0/0 -j ACCEPT
# Пока что блокируем весь межклиентский трафик. Это будет в части два.
iptables -A FORWARD -i tun0 -s 172.31.100.0/24 -d 172.31.100.0/24 -j DROP

Сохраняем файл (esq + :wq) и даём этому скрипту права исполнения(chmod) и запускаем:

chmod +x simple.sh
./simple.sh

Актуализируем новые таблицы маршрутизации:

sudo systemctl enable iptables
sudo systemctl start iptables
sudo service iptables save

Если вдруг что-то не прошло, то возможно стоит очистить текущие таблицы маршрутизации, с помощью след скрипта (всё всюда пропускает):

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

Всё, осталось собрать нужные файлы клиента(ca.crt — корневой сертификат нашего сервера; cleint.crt — сертификат клиента; client.key — секретный ключ клиента; ta.key — предварительно разделенный ключ ) в одном месте и скопировать их на нужное устройство:

mkdir klietn-1-config
/usr/share/easy-rsa/3/easyrsa build-client-full klietn-1 nopass
cp pki/ca.crt klietn-1-config/ca.crt
cp pki/issued/klietn-1.crt klietn-1-config/client.crt
cp pki/private/klient-1.key klient-1-config/client.key
cp pki/ta.key klient-1-config/ta.key

Теперь создаем собственно файл кофигурации (*.ovpn) клиента( сначала touch, затем vi klient-1.ovpn), со следующим содержимым, ВНИМАНИЕ СТРОЧКУ С АДРЕСОМ Remote меняем на адрес своего виртуального сервера, полученный в самом начале:

# Secure OpenVPN Client Config

#viscosity dns full
#viscosity usepeerdns true
#viscosity dhcp true
tls-client
pull
client
dev tun
proto udp
# ЗДЕСЬ ПРОПИСЫВАЕМ АДРЕС ВАШЕГО СЕРВЕРА и порт(если меняли):
remote 123.123.123.123 1194
redirect-gateway def1
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
remote-cert-tls server
ns-cert-type server
key-direction 1
cipher AES-256-CBC
tls-version-min 1.2
auth SHA512
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

Теперь копируем файл в папку клиента и архивируем, чтобы скачать:

cp klient-1.ovpn klient-1-config/client.ovpn
tar cvfz klient-1-config.tgz klient-1-config

Всё готово к третьей части, если вы дочитали до сих пор, то без проблем скачаете файл, например подключившись с логином от ssh через sftp например через Filezilla:

Клиентская часть OpenVPN

У вас есть *.ovpn файл, 4 файла сертификатов, можно начинать настройки клиентской части. Для никсов и винды берём клиент тут. В случае мака(который тоже никсоподобный) есть отдельно. Для андроидов и айфонов есть клиент в соответвующих магазинах приложений: в Гугл Плей, в Аппл Сторе.

Ставим в укзанное место размещения, запоминаем это место, и прямо туда копируем папку с установками. При установке придется несколько раз вбить пароль, или нажать кнопочку «да», но вот клиент запущен. Теперь ему надо подсунуть наши настройки. Для этого открываем настройки (на примере винды, маки аналогичны):

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

В расширенных настройках указываем путь к ovpn файлу:

Теперь также нажимаем connect, ждем некоторое время и вуаля, защищенное соединение в Интернет установлено. Даже Я не смогу следить за вашим траффиком, а уж кто-то там ещё, просто без шансов.

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

Данной скорости вполне достаточно чтобы смотреть нетфликс в 1080п, про 4к не скажу, ибо такого содержимого мало, и оно того не стоит, а для браузинга, и всяких рутинных задач — более чем достаточно.

Послесловие

Даже такой параноидальный впн не даст вам достаточного уровня анонимности и приватности в интернете. Если вы читаете почту на компьютере на котором у вас установлено соединение, но при этом у вас не рутованый телефон с тем же аккаунтом — этому помочь нельзя, ваша геолокация всё время будет известна Гуглам\т.е. кому-угодно. Надо менять свои цифровые привычки. Использовать всякие Firefox, а лучше его форк Waterfox, с установленными приложениями PrivacyBadger, UBlockOrigin, AdNauseaum.

Также один набор ключей-сертификатов можно искользовать на нескольких устройствах, но не одновременно, по каждому набору возможно только одно соединение в единицу времени. Однако если у вас на DDWRT, то ключи-сертификаты можно использовать на нём, и уже к нему будут подключаться все ваши устройства, которые будут и за роутером и за впном. Но это история на другой раз:)

и конечно, если вам данный материал был полезен, жду сатошиков на следующий адрес Ьиткойна: 3CNK4GTmK5M3Nq7CTqzM2ocxabVXEjPj6o