Ранее я уже выкладывал на Пикабу статьи про личные VPN, личные хранилища файлов и прочие штуки для защиты личной информации. Это статья про интересную оболочку для OpenVPN. Если у Вас никогда не было личного VPN сервера, самое время им обзавестись. Ниже пошаговая инструкция с картинками. Это просто. Вы сможете. Поберегите товарища майора, зачем ему нервничать из-за Ваших предпочтений в сети Интернет?
Примечание 1: это статья рассчитана на нулевой или начальный уровень читающего. Очень подробно и просто, без занудства.
Примечание 2: Всё описанное в этой статье приведено только в обучающих целях и не должно быть использовано для противоправных действий.
Примечание 3: статья может и будет дорабатываться. Наиболее актуальный вариант как всегда в первоисточнике. Да и конфиги там выглядят как надо.
Pritunl — тот же OpenVPN, но с преферансом и куртизанками. Почитать можно здесь. На самом деле Pritunl является оболочкой для OpenVPN, предоставляя удобный графический интерфейс для создания конфигураций OpenVPN сервера, создания пользователей, генерации ключей и т.д. Продукт предназначен для энтерпрайза, но есть и бесплатная версия. Её функционал урезан, однако для личных целей или для малого офиса его вполне достаточно. Установка не сложная, советую попробовать.
Нам понадобится любой VPS с поддержкой TUN/TAP. Pritunl можно поставить практически на любую операционную систему. Про это можно почитать здесь. В рамках данной статьи будет применяться CentOS 7.
Обновим сервер командами:
yum -y install epel-release
yum -y update
Для начала настройте безопасную аутентификацию на сервере, как написано здесь. Далее настроим правила файрволла. В текущей статье будет настраиваться следующая конфигурация: порт для web-консоли — 4445, порт для подключение ovpn-клиентов — 443. Для настроийки файрволла используйте вот эту инструкцию. Единственный момент — в файл ipt-set вписывайте не то, что указано в инструкции, а вот такое содержимое:
#!/bin/sh
IF_EXT="venet0"
VPN_PORT="443"
WEBADMIN_PORT="4445"
IPT="/sbin/iptables"
IPT6="/sbin/ip6tables"
# flush
$IPT --flush
$IPT -t nat --flush
$IPT -t mangle --flush
$IPT -X
$IPT6 --flush
# default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
$IPT6 -P INPUT DROP
$IPT6 -P OUTPUT DROP
$IPT6 -P FORWARD DROP
# loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT6 -A INPUT -i lo -j ACCEPT
$IPT6 -A OUTPUT -o lo -j ACCEPT
# allow forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# INPUT chain
# #########################################
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ssh
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT
# pritunl_web
$IPT -A INPUT -p tcp --dport $WEBADMIN_PORT -j ACCEPT
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
# pritunl_vpn
$IPT -A INPUT -p tcp --dport $VPN_PORT -j ACCEPT
$IPT -A INPUT -p udp --dport $VPN_PORT -j ACCEPT
# OUTPUT chain
# #########################################
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT6 -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Не забудьте про правильное имя внешнего интерфейса в переменной IF_EXT.
Если всё сделано верно, то по команде
iptables -L -n
будет получен такой вывод:
Обратите внимание, что открыт также порт 80. Это нужно для получения и обновления сертификатов от LetsEncrypt для нашей web-консоли. Не лишним будет проверить, что этот порт не занят. Такое может быть, если при установке операционной системы сразу установлен apache или иной web-сервер. Выполните команду:
netstat -tulnp | grep 80
В ответ мы должны получить ровно ничего, а значит порт свободен.
Если система ругается, что -bash: netstat: command not found, то выполняем команду:
yum install net-tools -y
Теперь пробуем:
netstat -tulnp | grep 80
Если в выводе команды видим:
то значит порт занят, в данном случае, службой httpd. Остановим её и уберем из автозагрузки:
systemctl stop httpd
systemctl disable httpd
Таким же способом можно проверить незанятость порта 443.
Теперь добавим репозиторий mongodb командой:
tee /etc/yum.repos.d/mongodb-org-4.0.repo << EOF
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64...
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF
Добавим репозиторий pritunl командой:
tee /etc/yum.repos.d/pritunl.repo << EOF
[pritunl]
name=Pritunl Repository
baseurl=https://repo.pritunl.com/stable/yum/centos/7/
gpgcheck=1
enabled=1
EOF
Импортируем ключи:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7....
gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 7568D9BB55FF9E5287D586017AE645C0CF8E292A
gpg --armor --export 7568D9BB55FF9E5287D586017AE645C0CF8E292A > key.tmp; rpm --import key.tmp; rm -f key.tmp
Теперь можно установить mongodb и pritunl командами:
yum -y install pritunl mongodb-org
Запустим службы mongodb и pritunl и добавим в автозагрузку mongodb:
systemctl start mongod pritunl
systemctl enable mongod
Запустите приведенные ниже команды, чтобы увеличить ограничение на количество открытых файлов на сервере. Это нужно для нормальной работы mongodb:
sh -c 'echo "* hard nofile 64000" >> /etc/security/limits.conf'
sh -c 'echo "* soft nofile 64000" >> /etc/security/limits.conf'
sh -c 'echo "root hard nofile 64000" >> /etc/security/limits.conf'
sh -c 'echo "root soft nofile 64000" >> /etc/security/limits.conf'
Когда вы запускаете Pritunl в первый раз, на веб-сервере, работающем через порт 443, вам будет показано приглашение настроить базу данных. Программа установки базы данных запросит ключ установки и URI MongoDB. Чтобы получить ключ установки запустите команду:
pritunl setup-key
В ответ получите тот самый setup-key из цифр и букв.
Теперь можно перейти по адресу https://[IP-адрес вашего сервера] в браузере. Так как сертификат для https пока самоподписанный, то увидим предупреждение. Соглашаемся:
Получаем приглашение настроить базу данных:
Используем секретный ключ, полученный ранее командой pritunl setup-key. Строчку URI не трогаем.
Некоторое время будет идти создание и настройка базы данных.
После это появится запрос логина и пароля.
Логин и пароль получим в ssh-консоли командой:
pritunl default-password
Вводим логин и пароль и попадаем в web-консоль. Нас сразу попросят сделать базовые настройки.
Здесь вам нужно сделать как инимум одну настройку: поменять порт с 443 на 4445. Также рекомендую изменить имя пользователя и пароль с дефолтных на свои.
Также, если у Вас есть доменное имя и настроена DNS-запись на IP-адрес сервера (подробнее можно найти в этой статье), то може вписать это имя в поле «Lets Encrypt Domain». Это позволит ходить в консоль по имени, а не по IP-адресу и не получать указанное выше предупреждение браузера при каждом входе. Если использовать доменное имя не планируется, оставьте поле пустым. Вы всегда можете вернуться к этим настройкам позднее.
Когда настройки сделаны, нажмите Save. Если вы ввели доменное имя, то некоторое время будет происходить получение сертификата Lets Encrypt . Обычно 5-10 секунд.
Так как порт мы поменяли, то в браузере нужно открыть новый адрес:
-- https://[IP-адрес вашего сервера]:4445 — если доменное имя не используется
-- https://[имя сервера]:4445 — если доменное имя используется
Теперь мы видим консоль
Осталось сделать еще одну вещь, прежде, чем мы начнем конфигурировать vpn-сервер.
Мы будем в web-консоли создавать vpn-серверы, а pritunl будет сам прописывать правила для них в iptables. При этом, в начале статьи, мы сделали свои настройки iptables. Нужно сделать так, чтобы это всё уживалось и не конфликтовало. Выше, после установки mongodb и pritunl мы добавили в автозагрузку только mongodb. И это неспроста. Теперь в файл /root/ipt-set в самом конце мы допишем строчки:
# Starting Pritunl Service
systemctl start pritunl
Сохраним и перезагрузим сервер командой reboot.
Т.е. теперь у нас будут при запуске сервера отрабатываться настройки iptables из файла ipt-set и только после применения настроек скрипт ipt-set запустит pritunl, а тот уже, в свою очередь, добавит в iptables свои настройки. В итоге никаких конфликтов и никаких лишних доступов.
Всё, ssh-консоль больше не нужна, заходим в web-консоль и работаем с ней. Жмём сверху в меню «Users», а потом кнопку «Add Organization».
Вводим любое имя организации. Не важно.
И нажимаем «Add». Теперь жмём «Add User». Здесь вводим имя будущего пользователя, а также пин-код. В пин-коде должно быть не менее 6 цифр. Он используется как второй фактор при авторизации. Email вводить не обязательно.
Жмём «Add» и получаем запись нового пользователя.
Обратите внимание на иконки слева. Когда создадим vpn-сервер, то с их помощью сможем получить готовый конфиг пользователя.
Сверху в меню выбираем «Servers»
Жмём кнопку «Add Server» и, в появившемся окне, сверху, «Advanced».
На скриншоте цветом выделены параметры, на которые нужно обратить внимание:
-- Name — любое понятное вам имя сервера.
-- Port — порт, на котором будет работать сервер. В моём примере я ставлю 443.
-- Protocol — протокол. В моём примере я ставлю tcp.
-- Encryption Cipher — ставим AES 256bit или 512bit.
-- DNS Server — DNS сервер, к которому будут обращаться клиенты. Я поставил гугловые восьмёрки.
-- Enable Google Authenticator — если поставите галочку, то клиенты смогут дополнительно, при аутентификации, использовать одноразовые пароли из Google Authenticator. Сначала потренеруйтесь без этой опции. Её можно включить позже.
-- Bind Address — впишите внешний IP вашего сервера к которому будет привязан vpn-сервер.
-- Hash Algorithm — ставьте SHA-256.
-- Allow Multiple Devices — если галочка стоит, то клиент сможет использовать свой конфиг и ключи на нескольких устройствах одновременно.
-- Block Outside DNS — если галочка стоит, то клиенты будут использовать только тот DNS -сервер, который прописан здесь.
-- Inter-Client Communication — если галочка стоит, то клиенты могут видеть друг друга по виртуальным IP-адресам.
Настраиваем и жмём Add. Теперь нужно привязать сервер к организации.
Жмём кнопку «Attach Organization»
и привязываем наш сервер к организации.
Т.е. мы можем создать разные организации (например отдельные организации для рабочих и домашних устройств или для разных отделов в офисе), у каждой организции свой набор пользователей и серверов. Это позволит очень гибко предоставлять и прекращать доступы. Один сервер можно привязать к нескольким организациям.
Итоговый вид такой:
Оратите внимание: вместе с организацией к серверу прикрепился и пользователь этой организации.
Запускаем сервер кнопкой «Start Server» и видим, что сервер запустился
Дальше в меню выбираем «Users». Используя иконки напротив имени пользователя скачиваем конфиг с ключами.
Например если так:
То будет предложено несколько временных ссылок на разные типы ахивов. Скачиваем zip, внутри него стандартный ovpn-файл, который добавляем в OpenVPN-клиент.
Или так:
Тогда будет скачан tar-архив, но внтури всё тот же ovpn-файл.
Если нажать на стрелочку, то увидите виртуальный адрес клиента (или несколько адресов, если клиенту разрешено использовать профиль на нескольких устройствах):
Как использовать готовый ovpn-файл, описано во второй половине этой статьи.
На этом, думаю, достаточно. Пользуйтесь. В web-консоли ещё куча кнопок, кроме описанных здесь. Их все можно нажимать, найдёте ещё много интересного.
Связь с автором в чатике канала Телеграм.