Как поднять собственный 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 > /etc/iptables/iptables.rules
И сделать сервис iptables автозапускающимся при загрузки системы:
systemctl enable iptables
На этом все. В этой статье мы рассмотрели достаточно простенькую и вполне себе работоспособную схемку, нужную для того, чтобы сделать шаг в более красивую и богатую жизнь.