Pritunl это по-сути надстройка над openvpn c удобной веб-мордой, а также отсутствием необходимости конфигурирование конфигов openvpn самостоятельно.
О wireguard думаю все слышали, еще одна технология реализации VPN с крайне простой настройкой.
Поднимаем pritunl-vpn:
Официальная дока находится тут. Там все возможные варианты установок под разные платформы. Мы же рассмотрим ubuntu 22.04.
sudo tee /etc/apt/sources.list.d/pritunl.list << EOF
deb http://repo.pritunl.com/stable/apt jammy main
EOF
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com --recv 7568D9BB55FF9E5287D586017AE645C0CF8E292A
curl https://raw.githubusercontent.com/pritunl/pgp/master/pritunl_repo_pub.asc | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list << EOF
deb https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse
EOF
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
sudo apt update
sudo apt --assume-yes upgrade
sudo ufw disable
sudo apt -y install pritunl mongodb-org
sudo systemctl enable mongod pritunl
sudo systemctl start mongod pritunl
Далее открываем веб морду, увидим что-то вроде этого:
Нужно в консоли ввести предложенную команду и получить ключ.
После его ввода увидим следующее:
Вводим в консоли команду и попадаем в админ панель. Нам сразу открываются настройки:
Здесь можно поменять дефолтный пароль и сразу сделать SSL сертификат от Lets Encrypt, но я не хочу этого делать, а хочу «спрятать» админку за nginx, с базовой авторизацией и защитой от fail2ban, а также сертификатом, который будет на стороне nginx.
Устанавливаем nginx, fail2ban и certbot
apt install nginx fail2ban snap -y
snap install --classic certbot
Меняем у pritunl дефолтный 443 порт и отключаем 80:
pritunl set app.server_port 444
pritunl set app.redirect_server false
Конфигурируем nginx — /etc/nginx/conf.d/pritunl.conf:
upstream pritunl-vpn {
server 127.0.0.1:444;
}
server {
listen 80;
root /usr/share/nginx/html;
server_name vpn.example.com;
location /.well-known {
allow all;
}
location / {
return 301 https://vpn.example.com$request_uri;
}
}
server {
server_name vpn.example.com;
location / {
proxy_pass https://pritunl-vpn;
proxy_ssl_verify off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Запускаем:
systemctl enable nginx
systemctl start nginx
Получаем сертификат на домен:
certbot certonly --nginx
И приводим конфиг nginx к следующему виду:
upstream pritunl-vpn {
server 127.0.0.1:444;
}
server {
listen 80;
root /var/www/html;
server_name vpn.example.com;
location /.well-known {
allow all;
}
location / {
return 301 https://vpn.example.com$request_uri;
}
}
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/vpn.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vpn.example.com/privkey.pem;
server_name vpn.example.com;
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass https://pritunl-vpn;
proxy_ssl_verify off;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Как видите у нас добавилась, помимо SSL сертификатов секция auth_basic_user_file /etc/nginx/.htpasswd;
Создать файл можно так:
apt-get install apache2-utils
htpasswd -c /etc/nginx/.htpasswd <user>
Далее добавляем конфиг в fail2ban вот сюда /etc/fail2ban/jail.d/defaults-debian.conf:
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 43200
Перезапускаем nginx и fail2ban:
systemctl restart nginx fail2ban
Теперь наша веб-морда находится за nginx и за базовой авторизацией, которая защищена силами fail2ban. Это можно легко проверить, несколько раз введя неправильные данные и выполнив команду:
fail2ban-client status nginx-http-auth
Далее идем в меню «Users». Нам нужно создать «Организацию» и добавить пользователя.
При создании пользователя, можно указать pin, его нужно будет вводить каждый раз при подключении. Если не указать, подключится автоматически. Но статичный пин это не удобно, если мы хотим нормальную защиту, pritunl позволяет сделать двухфакторную аутентификацию. Далее рассмотрим как.
После идем в «Servers» и настраиваем сам VPN сервер.
Собственно тут и ставим галочку «Enable Google Authenticator»
Pritunl также позволяет создать wireguard сервер, но сделано крайне странно, итоговый конфиг все равно остается в формате openvpn. Поэтому wireguard мы поставим отдельно.
После создания сервера, к ниму нужно прикрепить созданную ранее организацию. После чего запустить.
При добавлении пользователя, достаточно скачать сформированный конфиг тут:
Там же, если нажать на QR код, то отсканировав его в приложении «Google Authenticator» вы получите ту самую двухфакторку и каждый раз подключаясь через скачанный конфиг, будете вводить код из приложения.
Поднимаем wireguard:
Устанавливаем:
apt-get install wireguard wireguard-tools mawk grep iproute2 qrencode
Далее вся настройка будет сводится к использования bash скрипта. Скачиваем его:
wget https://raw.githubusercontent.com/burghardt/easy-wg-quick/master/easy-wg-quick
И запускаем:
chmod +x easy-wg-quick
./easy-wg-quick
После этого в директории запуска будут сгенерированы все нужные конфиги, ключи и прочее. Нас интересует файл wghub.conf. Это конфиг сервера, его следует положить вот сюда:
cp wghub.conf /etc/wireguard/
Запускаем wg:
systemctl start wg-quick@wghub
Если сохраните файл под другим именем, то соответственно после @ нужно будет указать правильное имя.
Чтобы сформировать новый конфиг клиента, нужно выполнить:
./easy-wg-quick test
cp wghub.conf /etc/wireguard/
systemctl start wg-quick@wghub
Конфиг клиента автоматически добавляется в конфиг сервера, следовательно его нужно перекинуть по новой и перезапустить wireguard.
Также при генерации конфига формируется QR код для подключения. Его можно увидеть прямо в консоли в любое время так:
cat wgclient_<user>.qrcode.txt
Для подключения на телефоне достаточно QR кода. На ПК придется импортить конфиг. Все конфиги имеют один принцип формирования имени wgclient_<user>.conf.
Тем самым можно на одной машине, запущенной в нужной локации иметь несколько реализаций VPN.
По итогу что-то не то. Подключается но в интернет не выходит. Смотрим конфиг клиента:
root@epddaccn2a84tsdjehfm:/home/yc-user# cat wgclient_test.conf
# 11: test > wgclient_test.conf
[Interface]
Address = 10.91.49.11/24
DNS = 1.1.1.1
PrivateKey = WAxc28YxE92xmhb3qcwaBUgrkTE16+iSOKLJjV0LlmE=
MTU = 1280
[Peer]
PublicKey = pbtd1zpSPaEum8abZm9nNHETexA9GCoo0F4ms9QSp1c=
PresharedKey = 2I5Ufzt5taGYgCbTASkpbRms8RuR5zEdoPDVoHpWNgU=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 10.129.0.37:11496
PersistentKeepalive = 25
Почему эндпоинт он ставит Endpoint = 10.129.0.37:11496 ведь здесь должен быть внешний ip?
Здравствуйте!
Да, совершенно верно, в Endpoint должен попасть внеший (белый) адрес. В случае если у вас машина на VPS, там как правило нет проблем, т.к. машина имеет только один основной en* интерфейс, который по-умолчанию попадет в конфиг клиента.
Посмотрите список ваших сетевых интерфейсов (ip a, ifconfig), вероятно их больше чем один.
Также нужно понимать, что адрес должен быть статичный, не за NAT провайдера.
Спасибо. Так в итоге не разобрался, а как сделать то, чтобы в веб интерфейсе pritunl отдельно можно было видеть клиентов, которые подключились по WireGuard? Какой смысл то вообще этой опции Enable WireGuard если она по сути формирует файл .ovpn?
В официальной документации не даётся ответа …