Уже установили Wirenboard всем своим знакомым и родственникам и вроде бы все предусмотрели, но запросы на докрутку софта все еще продолжают поступать? Ездить по домам порядком надоело? Выход есть - OpenVPN.
Кстати не обязательно Wirenboard, любое устройство на линуксе тоже подойдет, Raspberry Pi, например. Эта статья тестировалась именно на и для Wirenboard, поэтому речь про него. Нет проблем проделать тоже самое и на малине.
Столкнулся с этой проблемой и я. Решил что так больше продолжаться не может, нужно что-то решать. В официальной документации есть инструкция (внизу в разделе VPN) по настройке удаленного доступа. Из нее мы возьмем лишь часть, установим openvpn и easy-rsa:
apt-get install openvpn easy-rsa cp -R /usr/share/easy-rsa /etc/openvpn/
Запустим и убедимся, что все работает корректно:
root@wirenboard-XXXXXXXX:~# service openvpn start
root@wirenboard-XXXXXXXX:~# service openvpn status
Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)
Active: active (exited) since Sat 2020-10-10 13:19:51 08; 2 days ago #показатель что все корректно запустилось
Main PID: 2383 (code=exited, status=0/SUCCESS) CGroup: /system.slice/openvpn.service
окт 10 13:19:50 wirenboard-XXXXXXXX systemd[1]: Starting OpenVPN service...
окт 10 13:19:51 wirenboard-XXXXXXXX systemd[1]: Started OpenVPN service.
Далее нам потребуется арендовать собственный linux-сервер где-то на просторах интернета, чтобы не зависеть ни от кого и он был постоянно доступен с любого устройства. Мой выбор пал на сервис https://vscale.io/ (не реклама, выбирайте любой). При поиске учитывался единственный параметр - это дешевизна, а так как сверхзадач на нем выполняться не планируется, мощность железа особо не важна. Итого вышло - 200р./мес. Достаточно гуманно, считаю, для получаемых возможностей.
Предположим, что сервер вы уже приобрели, стартанули, залогинились по ssh. Прежде всего, рекомендую всё обновить до последних версий:
atp-get update atp-get upgrade
Далее установим на сервер OpenVPN строго по инструкции:
wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh
Готово! Теперь для каждого аппарата на линуксе нужно создать свой конфиг, для этого просто запускаем сам скрипт:
bash openvpn-install.sh
Выбираем цифру 1 и создаем пользователя:
OpenVPN is already installed. #ничего страшного, скрипт на установку и запуск один и тот же.
Select an option:
1) Add a new client # Добавление нового пользователя
2) Revoke an existing client # Удаление созданных пользователей
3) Remove OpenVPN # удаление OpenVPN
4) Exit # Выход
Option: 1 Provide a name for the client:
Name: Sprut #Вводим имя пользователя, главное чтоб вам было понятно кто это и что за устройство
Ура! Ура! У нас появился файлик в /root/Sprut.ovpn, достаточно его переименовать в Sprut.conf и поместить на клиентское устройство в папку /etc/openvpn/client/Кстати говоря, можно сразу поправить немного скрипт на сервере и файл будет сам переименовываться:
nano openvpn-install.sh
# Строка 495
# Generates the custom client.ovpn
new_client
echo cp ~/"$client.ovpn" ~/"$client.conf" #эту строку добавляем
echo "$client added. Configuration available in:" ~/"$client.conf" #тут тоже ovpn поменял на conf для красоты
exit
Все практически готово, осталось запустить наш конфиг на клиенте и проверить его работоспособность, а также добавим запуск в автозагрузку:
systemctl start openvpn-client@Sprut #стартуем
systemctl status openvpn-client@Sprut #проверяем статус
systemctl enable openvpn-client@Sprut #включаем автозагрузку при старте системы
Если увидели Active: active (running), значит все хорошо! И теперь мы можем удаленно цепляться к нашему устройству.Для этого создайте еще один профиль конкретно для себя и запустите на своем рабочем месте любой OpenVPN клиент (под свою OS выбирайте, например, тут) с полученным конфигом. После проделанных процедур, вы окажетесь в локальной сети со всеми своими устройствами и сможете по ip адресу, выданному сервером, заходить на Веб-интерфейс Wirenboard, SprutHub, mqtt, ssh и т.д. Никакие порты нигде пробрасывать не потребуется. Все уже работает.IP адреса, выданные устройствам, можно посмотреть (на вашем сервере) в файле логов следующей командой:
cat /etc/openvpn/server/openvpn-status.log
Бонус!
Можно запустить на вашем сервере сайт, который будет отображать подключенных клиентов. К сожалению, вариантов не много для реализации задуманного, более-менее поддерживаемый - это OpenVPN-Monitor. Установка описана ниже:
#установка библиотек
apt install python3-dev uwsgi uwsgi-plugin-python3 geoipupdate git
#установка openvpn-monitor
cd /srv
git clone https://github.com/furlongm/openvpn-monitor.git
cd openvpn-monitor
virtualenv..
bin/activate
pip install -r requirements.txt #конфигурим uWSGI
nano /etc/uwsgi/apps-available/openvpn-monitor.ini
# текст:
[uwsgi]
base = /srv
project = openvpn-monitor
logto = /var/log/uwsgi/app/%(project).log
plugins = python3
chdir = %(base)/%(project)
virtualenv = %(chdir)
module = openvpn-monitor:application
manage-script-name = true
mount=/openvpn-monitor=openvpn-monitor.py
# конфигурим Nginx
nano /etc/nginx/sites-available/openvpn-monitor
# текст:
server { listen 80; location /openvpn-monitor/
{ uwsgi_pass unix:///run/uwsgi/app/openvpn-monitor/socket; include uwsgi_params; } }
# Стартуем сервис
ln -s /etc/uwsgi/apps-available/openvpn-monitor.ini /etc/uwsgi/apps-enabled/
service uwsgi restart
unlink /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/openvpn-monitor /etc/nginx/sites-enabled/
service nginx restart
Теперь по адресу http://IP_адрес_сервера/openvpn-monitor/ будет доступен экран такого вида:
К сожалению, на карте так и не удалось настроить отображение местонахождения клиентов. Возможно, кто-то сможет подсказать в комментариях. Основной плюс этого сайта заключается в том, что можно мониторить состояние (если подключение есть, то клиент в списке виден, если нет - значит удаленного доступа нет).И есть основной минус - это отсутствие авторизации на этом сайте, т.е. вся эта инфа доступна любому в сети. Скорее всего, это можно настроить, моих знаний пока не хватило.
В планах
Сделать все-таки карту.Прикрутить авторизацию.Выдавать всем статические ip (это не сложно, не стал пока реализовывать и описывать).Сделать создание новых пользователей прямо в веб-интерфейсе.Создать у каждого клиента ссылки на необходимые ресурсы прямо из веб-интерфейса (SH, WB, MQTT, SSH).