Как поднять собственный VPN на сервере. Ч.4.

by @redterror
Как поднять собственный VPN на сервере. Ч.4.

Шалом, бегущие в тенях. Это заключительная часть достаточно ёмкой и доходчивой инструкции по подъёму собственного VPN.

Утечка DNS под Windows и Linux

Если вы будете юзать этот конфиг на Windows, в конфиг добавляем следующую строку:

setenv opt block-outside-dns

Да, вот так просто. Под MacOS с Tunnelblick все норм.

А под Linux есть файл update-resolv-conf, который находится в папке /etc/openvpn на клиентской машине. Файл может иметь название или update-resolv-conf или update-resolv-conf.sh. Поэтому на клиентском Линукс вводим в терминале:

ls /etc/openvpn | grep update

И узнаем название файла.

Далее, в конфиг .ovpn нужно вставить следующие строки:

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

где update-resolv-conf - название файла, которое вы получили выше.

Перекидываем конфиг .ovpn с серва на клиент.

Можете просто открыть клиентский конфиг, скопировать все полностью и вставить у себя на машине, окда.

Если вы создавали пользователя и запрещали ssh коннект от рута, то первым делом нужно поместить .ovpn конфиг в домашнюю папку созданного пользователя. У меня это был pp-ruloh

cp /etc/openvpn/easy-rsa/keys/client1/client.ovpn /home/pp-ruloh

Изменить права у файла:

chown pp-ruloh:pp-ruloh /home/pp-ruloh/client.ovpn

Linux. Будем юзать sftp.

sftp -P 1488 pp-ruloh@ip

где 1488 - порт на котором слушает sshd.

Как законнектились, мы уже будем в домашней папке pp-ruloh. Можем посмотреть файлы - вводим ls.

копируем конфиг:

get client.ovpn ~/

Windows, linux, MacOS: скачиваем программу для работы по FTP - FileZilla

и подключаемся к серву по sftp. Нужено будет указать port sftp (у меня 1488), пользователя (pp-ruloh, ибо руту зарпетили). Копируем файл куда хотим и радуемся. Как пользоваться программой разберетесь сами.

Поднимаем OpenVPN скриптом

Поднять OpenVPN вручную вам не под силу? Не отчаивайтесь, у меня для вас хорошие новости!

На Github существует Open Source скрипт, который позволяет быстро и легко поднять OpenVPN сервер на вашем VPS. Скрипт называтся openvpn-install, и вот ссылка на Github. И этого скрипта есть куча форков, которые вы можете изучить.

Посмотреть исходный код можно здесь. Приступим. Работаем под пользователем root или суперпользователем.

Для начала, обновим систему:

apt-get update && apt-get dist-upgrade -y

Если вы уже пытались поднять OpenVPN вручную, но у вас ничего не получилось, то нужно сначала его полностью снести. Удаляем openvpn:

apt-get remove --purge openvpn

удаляем папку:

rm -rf /etc/openvpn/

выключаем ufw:

ufw disable

и установим нужные пакеты:

apt-get install -y sudo nano curl perl python wget git iptables openvpn openssl ca-certificates

Скачиваем скрипт в домашнюю папку root:

git clone https://github.com/Nyr/openvpn-install.git ~/nyr-openvpn

Переходим туда:

cd ~/nyr-openvpn/

Запускаем скрипт:

bash openvpn-install.sh

И вы попадете в так называемый Инсталятор. Где нужно будет отвечать на вопросы или что-то вписывать. Для перехода на следующий этап установки жмите Enter.

Первый делом, предложит ввести внешний IP адрес, но вероятнее всего скрипт сам его определит:

IP address: 111.222.111.222

Следующий этап, выбрать протокол. Я жму 1 и выбираю UDP. Далее, выбираете порт. Я поставлю, например 14000. После этого предложит выбрать DNS сервера. Выбор будет из Google, OpenDNS или текущих, которые на VPS и еще каких-то. Я выбираю OpenDNS, жму 3. После этого предложит ввести имя клиента. Я введу "pp-ruloh". Далее начнется скачивание-утановка пакетов, генерация ключей, сертификатов и конфигурационных файлов. когда все закончится, он поместит конфиг. в домашнюю папку юзера, от имени которого запсукался скрипт. То есть, сейчас конфиг лежит по адресу:

/root/

Собственно, на этом конфигурация OpenVPN скриптом завершается. Можно уже сейчас взять новый конфиг и использовать. Интересно, чего он там такого сгенерировал вам, посмотрим на конфиг pp-ruloh.ovpn:

nano ~/pp-ruloh.ovpn

(без ключей и сертификатов)

client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 111.222.111.222 14000
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
setenv opt block-outside-dns
key-direction 1
verb 3

Все вроде бы нормально, да лучше auth SHA512 явно указать. Поэтому добавим

auth SHA512

Вот так:

client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 111.222.111.222 14000
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
auth SHA512
comp-lzo
setenv opt block-outside-dns
key-direction 1
verb 3

Обратите внимание, что скрипт уже запихнул фичу для предотвращения утечки DNS под клиент Windows:

setenv opt block-outside-dns

Если у вас Linux или MacOS - эту строку лучше закомментировать.

Теперь посмотрим на серверный конфиг server.conf:

nano /etc/openvpn/server.conf
port 14000
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
cipher AES-256-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem

Здесь также добавляем auth SHA512 (а то работать не будет, если на клиенте указан а на серве нет), делаем verb 0. Также нужно проделать следующее. Нужно закомментировать строку.

status openvpn-status.log

И добавить log:

log /dev/null 2>&1

Где-то выше писал, зачем он нужен. Получилось так:

port 14000
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
cipher AES-256-CBC
auth SHA512
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
#status openvpn-status.log
log /dev/null 2>&1
verb 0
crl-verify crl.pem

Берем клиентский файл-конфиг и помещаем на ваше устройство. Об этом я писал выше.

При повторном запуске скрипта из-под рута:

bash /root/nyr-openvpn/openvpn-install.sh

Скрипт предложит создать нового клиент, удалить существующего (не сможет больше коннектиться) или удалить OpenVPN.

Клиенты OpenVPN под разные ОС

Поскольку OpenVPN не встроен по-умолчанию ни в одну популярную ОС, то требуется установить сторонее ПО - клиент OpenVPN.

Windows

Под Windows есть официальный клиент, называется OpenVPN GUI.

Скачать его можно на офф. сайте OpenVPN. Скачиваете, устанавливаете. Появится ярлык на раб. столе, после запуска - иконка в трее.

Далее, помещаете ваш .ovpn файл в папку config, в установленной папке OpenVPN. В общем, если устанавливать OpenVPN GUI по-умолчанию в папку Program Files, то адрес такой:

C:\Program Files\OpenVPN\config

В эту папку кидаем конфиги .ovpn. Потом из трея можно запускать VPN. Все достаточно просто.

Linux

На Линукс в репозиориях вашего дистрибутива пакет скорее всего будет называется "openvpn" (еще может openvpn-client), и ставится следующим образом:

sudo apt-get install openvpn

Если у вас Debian-подобные дистрибутивы (Debian, Ubuntu, Mint). Если у вас дистрибутив другой линейки - сами разберетесь как ставить.

Работает это следующим образом. У вас есть .ovpn файл, далее вы в терминале вводите команду:

sudo openvpn --config <путь до файла .ovpn>

где <путь до файла .ovpn>, собственно, путь до файла .ovpn.

Или можете скормить файл network-manager ' у.

MacOS

Под MacOS из клиентов OpenVPN я знаю только Tunnelblick. Скачать его можно здесь. Устанавливается просто, требует права суперпользователя. По-умолчанию будет отпрыать файлы с расширением .ovpn. Будет иконка в трее, там конектимся. Можно настроить, что бы коннектился к OpenVPN сразу при загрузке системы. Когда соеденение обрывается с VPN, интернет пропадает. В этом случае нужно вручную отсоеденяться от VPN.

Android

Официальный клиент OpenVPN Connect под Android доступен для скачивания на Google Play

iOS

Для iOS клиент скачиваем из AppStore.

Клиенты, предоставляемые провайдером VPN. Некоторые провайдеры предоставляеют свой собственный OpenVPN клиент под разные ОС и платформы. Использовать их или нет, решать вам. Но это потенциально не очень безопасно.

Запрещаем весь траффик не через OpenVPN на клиенте

Правила iptables. Только для адептов Луникса. Что делать если VPN внезапно отключился? Или вы забыли его включить вообще? Обычно, когда внезапно обнаруживаешь, что траффик идет не через VPN, и при этом ты не используешь Whonix, то через 3 секунды понимаешь что твои штаны полны говна. Что нужно делать чтобы явно ограничить весь траффик?

А вот и сами правила:

# запрещаем все входящие и исходящие
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# разрешаем уже установленные соединения и локалхост
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# разрешаем соединения до VPN (VPN_IP заменить на ip вашего VPN сервера)
iptables -A OUTPUT -d VPN_IP -j ACCEPT

# разрешаем любые соединения через VPN
iptables -A OUTPUT -o tun+ -j ACCEPT

В конце:

# разрешаем любые соединения через VPN
iptables -A OUTPUT -i tun+ -j ACCEPT

Было изменено на:

# разрешаем любые соединения через VPN
iptables -A OUTPUT -i tun+ -j ACCEPT

Есть у нас правила, че дальше? Теперь открываем терминал в вашем Линуксе

И создаем файл, который назовем vpn.rules:

touch ~/vpn-rules.sh

Поместим туда все правила:

nano ~/vpn-rules.sh

В самом верху файла пишем:

#!/bin/sh

Далее, правила из кода выше. Копируете - вставляете, меняете

# разрешаем соединения до VPN (VPN_IP заменить на ip вашего VPN сервера)
iptables -A OUTPUT -d VPN_IP -j ACCEPT

там где VPN_IP на IP вашего сервера (указан в .ovpn конфиге).

Сохраняете - закрываете.

Запсукае скрипт из под рута или sudo:

sudo sh ~/vpn-rules.sh

Теперь у нас применились правила. Можете проверить - без VPN инет работать не будет. Этот скрипт можно запускать каждый раз. А можно сохранить правила:

sudo iptables-save &gt; /etc/iptables/iptables.rules

И сделать сервис iptables автозапускающимся при загрузки системы:

systemctl enable iptables

На этом все. В этой статье мы рассмотрели достаточно простенькую и вполне себе работоспособную схемку, нужную для того, чтобы сделать шаг в более красивую и богатую жизнь.

July 21, 2018
by @redterror