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.noarch.rpm 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-консоли ещё куча кнопок, кроме описанных здесь. Их все можно нажимать, найдёте ещё много интересного.