Уже установили 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).
Хорошая статья. когда-то хотел поднять сервер на микротике. чтоб не покупать машинку.
Можно закрыть доступ через .htaccess и.htpasswd, это не топ защита конечно, но лучше чем ничего.
Нашел как сделать рабочей карту.
Download Files, скачиваем GeoLite2 City архив.
geoip_data=/var/lib/GeoIP/GeoLite2-City.mmdb
Есть минус что местоположение определяется про провайдеру. Так что не особо хорошо.
Попробуй для аутентификации этот вариант. Ну и добавь ssl для передачи данных.https://codex.so/http-basic-auth">
https://codex.so/http-basic-au...
Очень полезная статья, спасибо. Если не против, на основе ее запилим видеоурок, также добавим менее качественный, но более простой способ. Спасибо
Конечно. Буду только рад. Можно еще учесть советы, что здесь писали.
Важное дополнение!
При выключении света, иногда роутер не успевает стартануть первым, а стандартные настройки сервиса openvpn почему то это не предусматривают.
Поэтому необходимо это поправить следующим образом:
правим серивис
sudo nano /lib/systemd/system/openvpn-client@.service
Type=forking
А после DeviceAllow добавляем
Restart=always
RestartSec=30
Будет выглядеть так:
https://sprut.ai/static/media/cache/00/29/01/5/7072609/74345/1000x_image.png?1612106268" alt="1000x_image.png?1612106268" />
Каждые 30 секунд будет пытаться переподключиться, если нет коннекта.
И после всех редактирований сервисов не забываем про команду:
sudo systemctl daemon-reload
Restart=always
RestartSec=30
добавил.
а это нужно добавлять? У меня нет таких строчек:
ProtectSystem=true
ProtectHome=true
KillMode=process
Уже не припомню, можно добавить. У меня с таким конфигом больше полугода работает идеально.
ок, тоже добавил ) спасибо за статью! )
Гениально!! Сэкономил пару часов настройки по видео. Там 40 минут описывается то, что тут сделано в пару команд!! Как хорошо, что наткнулся на эту статью! )