Пора двигаться дальше в практике системного администрирования, сегодня очередная задумка я бы так сказал мой большой проект, я хочу разобрать как управлять корпоративными Android-устройствами (в последствии и Iphone-устройствами). Задумка очень интересна, преследуемая цель поднабраться опыта и повысить себя как специалиста, а еще я планирую всего процесса оформить как видео для моих каналов на Youtube & Rutube.
У меня сейчас есть практические наработки в плане
- Удаленное управление
Windows, Ubuntuсистемами — это проектAspia - Сетевое развертывание
Windows, Ubuntuсистемы — это проектFog Project - Удаленное управление
Androidсистемами (Смартфоны,PDA-терминалы — этоOpen-Sourceпроект в лицеHeadwind MDM(Система управления мобильными устройствами с открытым кодом)
• Устанавливать только то ПО, что разрешено
• Блокировать функции смартфона
• Собирать статистику.
текущая же заметка — это оптимизацию всего накопленного опыта на базе системы Ubuntu, а именно Ubuntu 22.04 LTS Server
Я за предварительное тестирование инструментов (именно после этого я имею отлаженную работу внедренного), и в очередной раз буду обкатывать все настройки на своем тестовом гипервизоре в лице связки Debian 12 + Proxmox 8.2.2, создаю виртуальную машину:
RAM: 8GbCPU: 1 sockets, 4 cores (Type: host)Storage: 70Gb (SATA)OS: Ubuntu 22.04 LTS ServerIP: 172.33.33.18
ekzorchik@srv-us2204a:~$ sudo hostnamectl hostname srv-hmdm
На заметку: Видео всей заметки у меня на Youtube-канале.
На заметку: Видео всей заметки у меня на Rutube-канале.
Шаг №1: Выполняю на системе скрипт предварительной настройки у Вас как системного администратора это свои наработки, свои не публикую, т.к. по мере его использования что-то да добавляется, убирается, изменяется.
ekzorchik@srv-hmdm:~$ sudo ./tips_ubuntu_22_04_preconfigure_v1.sh
Шаг №2: Перед последующими действиями в систему нужно установить дополнительные пакеты:
На заметку: пакет aapt — Это Android Asset Packaging Tool
На заметку: для проекта Headwind MDM нет совместимости с Tomcat10 если что.
ekzorchik@srv-hmdm:~$ sudo apt install -y aapt libtomcat9-java postgresql vim certbot unzip net-tools unzip ncdu tomcat9
ekzorchik@srv-hmdm:~$ dpkg -l | grep postgresql
ii postgresql 14+238 all object-relational SQL database (supported version)
ii postgresql-14 14.24-0ubuntu0.22.04.1 amd64 The World's Most Advanced Open Source Relational Database
ii postgresql-client-14 14.24-0ubuntu0.22.04.1 amd64 front-end programs for PostgreSQL 14
ii postgresql-client-common 238 all manager for multiple PostgreSQL client versions
ii postgresql-common 238 all PostgreSQL database-cluster manager
ekzorchik@srv-hmdm:~$
Шаг №3: Проверяем, что сам PostgreSQL—сервер запущен, если нет, то запускаем:
ekzorchik@srv-hmdm:~$ sudo systemctl status postgresql
○ postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: inactive (dead)
ekzorchik@srv-hmdm:~$ sudo systemctl restart postgresql.service
ekzorchik@srv-hmdm:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2026-10-07 11:57:09 MSK; 1s ago
Process: 43787 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 43787 (code=exited, status=0/SUCCESS)
CPU: 938us
Oct 07 11:57:09 srv-hmdm systemd[1]: Starting PostgreSQL RDBMS...
Oct 07 11:57:09 srv-hmdm systemd[1]: Finished PostgreSQL RDBMS.
ekzorchik@srv-hmdm:~$
Шаг №4: Настраиваю сервис базы данных Postgres (Базу, Пользователя, Пароль):
ekzorchik@srv-hmdm:~$ sudo su - postgres
postgres@srv-hmdm:~$ psql
psql (14.24 (Ubuntu 14.24-0ubuntu0.22.04.1))
Type "help" for help.
postgres=#
postgres=# CREATE USER us_hmdm WITH PASSWORD 'Aa1234567aA';
CREATE ROLE
postgres=# CREATE DATABASE db_hmdm WITH OWNER=us_hmdm;
CREATE DATABASE
postgres=# \q
postgres@srv-hmdm:~$ exit
logout
ekzorchik@srv-hmdm:~$
Шаг №5: Скачиваю с официального сайта разработчика установочный файл (инсталлятор), распаковываю и устанавливаю в текущую систему:
ekzorchik@srv-hmdm:~$ wget https://h-mdm.com/files/hmdm-5.41-install-ubuntu.zip
тут такой момент, по каким-то причинам Роскомнадзор блокирует доступ к сайту (https://h-mdm.com/ - Загрузить - (Инсталлятор)) и приходится через VPN скачать файл (hmdm-5.41-install-ubuntu.zip) и перенести на эту систему, либо же задействовать связку wget + VPS + 3proxy:
ekzorchik@srv-hmdm:~$ wget -e use_proxy=yes -e https_proxy=http://<WAN_IP>:<PORT>/ -S https://h-mdm.com/files/hmdm-5.41-install-ubuntu.zip
--2026-10-07 09:47:06-- https://h-mdm.com/files/hmdm-5.41-install-ubuntu.zip
Connecting to <WAN_IP>:<PORT>... connected.
Proxy request sent, awaiting response...
HTTP/1.1 200 OK
Date: Wed, 07 Oct 2026 06:47:06 GMT
Server: Apache/2.4.58 (Ubuntu)
Last-Modified: Thu, 03 Sep 2026 13:32:03 GMT
ETag: "2991fd0-65a942d5d1ac0"
Accept-Ranges: bytes
Content-Length: 43589584
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/zip
Length: 43589584 (42M) [application/zip]
Saving to: ‘hmdm-5.41-install-ubuntu.zip’
hmdm-5.41-install-ubuntu.zip 100%[===============================================>] 41.57M 1.81MB/s in 26s
2026-10-07 09:47:32 (1.60 MB/s) - ‘hmdm-5.41-install-ubuntu.zip’ saved [43589584/43589584]
ekzorchik@srv-hmdm:~$
ekzorchik@srv-hmdm:~$ unzip hmdm-5.41-install-ubuntu.zip
Что содержится в архиве:
ekzorchik@srv-hmdm:~$ ls -l hmdm-install/
total 42640
-rw-r--r-- 1 ekzorchik ekzorchik 892 Mar 4 2020 INSTALL.txt
-rw-r--r-- 1 ekzorchik ekzorchik 11523 Jul 12 2019 LICENSE
-rw-r--r-- 1 ekzorchik ekzorchik 461 Dec 15 2021 NOTICE
-rw-r--r-- 1 ekzorchik ekzorchik 342 Jul 16 2019 TROUBLESHOOTING.txt
-rwxr-xr-x 1 ekzorchik ekzorchik 2390 Nov 3 2021 cpu_monitor.sh
-rw-rw-r-- 1 ekzorchik ekzorchik 43593184 Sep 3 16:40 hmdm-5.41.1-os.war
-rwxr-xr-x 1 ekzorchik ekzorchik 19463 Sep 3 16:27 hmdm_install.sh
drwxr-xr-x 4 ekzorchik ekzorchik 4096 Oct 5 2025 install
-rwxr-xr-x 1 ekzorchik ekzorchik 182 May 19 2021 iptables-tomcat.sh
-rwxr-xr-x 1 ekzorchik ekzorchik 2673 Jun 20 2024 letsencrypt-ssl.sh
-rwxr-xr-x 1 ekzorchik ekzorchik 392 Mar 24 2025 logrotate.sh
-rwxr-xr-x 1 ekzorchik ekzorchik 1057 May 15 2024 update-web-app.sh
ekzorchik@srv-hmdm:~$
Перехожу в распакованный каталог и запускаю процесс установки:
ekzorchik@srv-hmdm:~$ cd hmdm-install/
ekzorchik@srv-hmdm:~/hmdm-install$
ekzorchik@srv-hmdm:~/hmdm-install$ sudo ./hmdm_install.sh
Please choose the installation language (en/ru) [en]: ru
PostgreSQL host [localhost]: localhost
PostgreSQL port [5432]: 5432
PostgreSQL database [hmdm]: db_hmdm
PostgreSQL user [hmdm]: us_hmdm
PostgreSQL password: Aa1234567aA
Headwind MDM storage directory [/var/lib/tomcat9/work]: /var/lib/tomcat9/work — нажимаю клавишу "ENTER"
Headwind MDM scripts directory [/opt/hmdm]: /opt/hmdm — нажимаю клавишу "ENTER"
Protocol (http|https) [https]: изменяю на http и нажимаю клавишу "ENTER"
Domain name or public IP (e.g. example.com):172.33.33.18 и нажимаю клавишу "ENTER"
Port (e.g. 8080, leave empty for default ports 80 or 443): нажимаю клавишу "ENTER"
Project path on server (e.g. /hmdm) or ROOT: ROOT нажимаю клавишу "ENTER"
Setup SMTP credentials [Y/n]?: выбираю "n" и нажимаю клавишу "ENTER"
Ready to install!
Location on server: /var/lib/tomcat9/work
URL: http://172.33.33.18
Is this information correct [Y/n]? Y — Подтверждаю выбор символом "y" и нажимаю клавишу "ENTER"
Waiting for undeploying the previous version
……….
Tomcat config file created: /var/lib/tomcat9/conf/Catalina/localhost/ROOT.xml
Deploying hmdm-5.41.1-os.war to Tomcat: /var/lib/tomcat9/webapps/ROOT.war
…………………………………………………………………………………………………………
ERROR: failed to deploy WAR file!
Please check /var/lib/tomcat9/logs/catalina.out for details.
ekzorchik@srv-hmdm:~/hmdm-install$
Так почему не установилось.
, смотрю лог catalina.out
ekzorchik@srv-hmdm:~/hmdm-install$ sudo grep -iE "SEVERE|ERROR|Exception|Caused by|failed|Unable" /var/lib/tomcat9/logs/catalina.out | tail -n 100
grep: /var/lib/tomcat9/logs/catalina.out: No such file or directory
ekzorchik@srv-hmdm:~/hmdm-install$
ekzorchik@srv-hmdm:~/hmdm-install$ sudo systemctl status tomcat9 --no-pager -l
○ tomcat9.service - Apache Tomcat 9 Web Application Server
Loaded: loaded (/lib/systemd/system/tomcat9.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://tomcat.apache.org/tomcat-9.0-doc/index.html
ekzorchik@srv-hmdm:~/hmdm-install$
ekzorchik@srv-hmdm:~/hmdm-install$ sudo systemctl restart tomcat9.service && sudo systemctl status tomcat9.service
● tomcat9.service - Apache Tomcat 9 Web Application Server
Loaded: loaded (/lib/systemd/system/tomcat9.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-10-07 12:18:45 MSK; 8ms ago
Docs: https://tomcat.apache.org/tomcat-9.0-doc/index.html
Process: 44381 ExecStartPre=/usr/libexec/tomcat9/tomcat-update-policy.sh (code=exited, status=0/SUCCESS)
Main PID: 44385 ((sh))
Tasks: 1 (limit: 9384)
Memory: 768.0K
CPU: 8ms
CGroup: /system.slice/tomcat9.service
└─44385 "(sh)"
Oct 07 12:18:45 srv-hmdm systemd[1]: Starting Apache Tomcat 9 Web Application Server...
Oct 07 12:18:45 srv-hmdm systemd[1]: Started Apache Tomcat 9 Web Application Server.
ekzorchik@srv-hmdm:~/hmdm-install$
Снова запускаю установочный скрипт:
ekzorchik@srv-hmdm:~/hmdm-install$ sudo ./hmdm_install.sh
PostgreSQL host [localhost]: localhost
PostgreSQL port [5432]: 5432
PostgreSQL database [hmdm]: db_hmdm
PostgreSQL user [hmdm]: us_hmdm
PostgreSQL password: Aa1234567aA
The database is already setup.
To re-deploy Headwind MDM, the database needs to be cleared.
Clear the database? ALL DATA WILL BE LOST!
Type «erase» to clear the database and continue setup:
набираем "erase" и нажимаю клавишу "ENTER"
Deployment successful, initializing the database…
======================================
Minimal installation of Headwind MDM has been done!
At this step, you can open in your web browser:
http://172.33.33.18:8080
Login: admin:admin
======================================
Setup HTTPS via LetsEncrypt [Y/n]?: n
Use iptables to redirect port 443 to 8443 [Y/n]?: n
Move required APKs from h-mdm.com to your server [Y/n]?: Y
Downloading https://h-mdm.com/files/hmdm-6.39-os.apk…
—2026-10-07 12:22:05— https://h-mdm.com/files/hmdm-6.39-os.apk
Resolving h-mdm.com (h-mdm.com)… 159.203.179.23
Connecting to h-mdm.com (h-mdm.com)|159.203.179.23|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: 6531138 (6.2M) [application/vnd.android.package-archive]
Saving to: ‘hmdm-6.39-os.apk’
Блин, но в скрипте идет скачивание пакетов с официального сайта, но т.к. сайт у меня открывается только через VPN то его нужно поправить на работу с ним.
ekzorchik@srv-hmdm:~/hmdm-install$ nano +478 hmdm_install.sh
wget $FILE
заменяю на
#wget $FILE
wget -e use_proxy=yes -e https_proxy=http://<WAN_IP>:<PORT>/ -S $FILE
Запускаю установщик заново
Minimal installation of Headwind MDM has been done!
At this step, you can open in your web browser:
http://172.33.33.18:8080
Login: admin:admin
======================================
Setup HTTPS via LetsEncrypt [Y/n]?: n
Use iptables to redirect port 443 to 8443 [Y/n]?: n
Move required APKs from h-mdm.com to your server [Y/n]?: Y
и файлы пошли скачиваться
https://h-mdm.com/files/hmdm-6.39-os.apk
https://h-mdm.com/files/pager-1.02.apk.
https://h-mdm.com/files/phoneproxy-1.02.apk
https://h-mdm.com/files/LauncherRestarter-1.04.apk.
======================================
Headwind MDM installation is completed!
To access your web panel, open in the web browser:
http://172.33.33.18
Login: admin:admin
======================================
ekzorchik@srv-hmdm:~/hmdm-install$
ekzorchik@srv-hmdm:~/hmdm-install$ cd ~/
ekzorchik@srv-hmdm:~$
На заметку: Скачанные с сайта apk файлы после располагаются в системе по пути /var/cache/tomcat9/files
ekzorchik@srv-hmdm:~$ sudo ls -l /var/cache/tomcat9/files
total 12040
-rw-r--r-- 1 tomcat tomcat 6531138 Sep 3 13:43 hmdm-6.39-os.apk
-rw-r--r-- 1 tomcat tomcat 1653792 Nov 20 2019 LauncherRestarter-1.04.apk
-rw-r--r-- 1 tomcat tomcat 2785022 May 8 2022 pager-1.02.apk
-rw-r--r-- 1 tomcat tomcat 1354991 Aug 21 2019 phoneproxy-1.02.apk
ekzorchik@srv-hmdm:~$
Вроде как все.
На заметку: т.к. средствами iptables в мастере установки я не дал добро сделать перенаправление при обращении на 8080 -> 80, то установщик написал, что Web-панель доступна на 80 порту, но увы это не так.
Шаг №6: Проверяю что система слушает порты развернутого сервиса выше:
ekzorchik@srv-hmdm:~$ ss -tulpn
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
udp UNCONN 0 0 172.33.33.18%ens18:68 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:*
udp UNCONN 0 0 [::1]:323 [::]:*
tcp LISTEN 0 244 127.0.0.1:5432 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 4096 [::ffff:172.33.33.18]:31000 *:*
tcp LISTEN 0 100 *:8080 *:*
tcp LISTEN 0 128 [::]:22 [::]:*
ekzorchik@srv-hmdm:~$
Шаг №7: Запускаю браузер с административной системы под управлением Windows 10 Pro, к примеру, Google Chrome и в строке URL адреса указываю, URL: http://172.33.33.18:8080 и вижу, окно ввода аутeнтификационных данных в "Headwind MDM"

в качестве связки имя пользователя и пароль использую те что предопределены в скрипте установки
Имя пользователя или email: adminПароль: admin

и нажимаю "Войти", при первом входе получаю запрос от системы на тему изменения дефолтного пароля, изменяю
Новый пароль: указываю к примеру, 712mbddr@Подтверждение: подтверждаю, 712mbddr@

и нажимаю "Установить пароль"
и вот я внутри Web-панели управления Headwind MDM (Оболочка для корпоративных Android-устройств Версия 5.41.1)

Если через правый верхний угол перейти в admin - "о приложении", то по дефолту и для бесплатного использования доступны следующие плагины:
Push-сообщенияАудитДетальная информацияДругие плагиныЖурналыСообщения
по такому же принципу переходим в admin - "Проверить наличие обновлений" и снимаем галочки
Автоматически обновлять мобильные приложенияОтправить статистику использования поставщику услуг для повышения производительности системы
и нажимаю "Обновить"
Возвращаюсь на главный экран путем перехода кликнув в левом верхнем углу на название: "Headwind MDM"
Шаг №8: Устройства на базе Android подключаются в "Headwind MDM" через QR—код, но если я сейчас нажму на иконку с ним

то увы получаю ошибку, а потому что сейчас URL выглядит так:
http://172.33.33.18/#/qr/6fb9c8dc81483173a0c0e9f8b2e46be1/h0001
Поняли в чем проблема, т.к. я отказался при установке средствами Iptables сделать редирект с 8080 на 80, то и функционал в Web-панели поехал.
поправляю, как внедрение на этой системы обратного прокси на базе Web-сервиса nginx:
ekzorchik@srv-hmdm:~$ sudo apt install -y nginx
ekzorchik@srv-hmdm:~$ sudo rm /etc/nginx/sites-available/default
ekzorchik@srv-hmdm:~$ sudo rm -f /etc/nginx/sites-enabled/default
ekzorchik@srv-hmdm:~$ sudo rm -f /var/www/html/index.nginx-debian.html
ekzorchik@srv-hmdm:~$ sudo nano /etc/nginx/sites-available/hmdm.conf
upstream hmdm {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name 172.33.33.18;
access_log /var/log/nginx/hmdm-access.log;
error_log /var/log/nginx/hmdm-error.log;
proxy_redirect off;
location / {
proxy_pass http://hmdm;
proxy_buffering off;
client_max_body_size 0;
proxy_connect_timeout 3600s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
send_timeout 3600s;
}
}
После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора).
ekzorchik@srv-hmdm:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-hmdm:~$ sudo ln -s /etc/nginx/sites-available/hmdm.conf /etc/nginx/sites-enabled/hmdm.conf
ekzorchik@srv-hmdm:~$ sudo systemctl restart nginx.service
Шаг №9: Закрываю систему Ubuntu 22.04 Server надстройкой над правилами в лице firewalld: (я не использую в чистом виде iptables) — Т.е. доступ к ней теперь по SSH и через 80 порт:
ekzorchik@srv-hmdm:~$ apt-cache show firewalld | grep Version
Version: 1.1.1-1ubuntu1
ekzorchik@srv-hmdm:~$ sudo ufw disable
Firewall stopped and disabled on system startup
ekzorchik@srv-hmdm:~$ sudo apt-get install -y firewalld
ekzorchik@srv-hmdm:~$ sudo systemctl enable firewalld
ekzorchik@srv-hmdm:~$ sudo systemctl start firewalld
ekzorchik@srv-hmdm:~$ sudo firewall-cmd --state
running
ekzorchik@srv-hmdm:~$ ip r | awk '{print $5}' | head -n1
ens18
ekzorchik@srv-hmdm:~$ sudo firewall-cmd —zone public —change-interface=ens18 —permanent
success
ekzorchik@srv-hmdm:~$ sudo firewall-cmd --reload
success
ekzorchik@srv-hmdm:~$ sudo firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources:
services: dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
ekzorchik@srv-hmdm:~$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
success
ekzorchik@srv-hmdm:~$ sudo firewall-cmd --reload
success
ekzorchik@srv-hmdm:~$ sudo firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources:
services: dhcpv6-client ssh
ports: 80/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
ekzorchik@srv-hmdm:~$
После чего доступ к хосту Ubuntu 22.04 Server возможен только через SSH (22/tcp) и через Web (80/tcp), т.е. URL адрес вида: http://172.33.33.18:80 тем самым я попадаю на правильную страницу авторизации в Headwind MDM:
Имя пользователя или email: указываю, т.е. adminПароль: тот на который изменили, т.е. 712mbddr@

и нажимаю "Войти"
А вот теперь уже нажав на QR-код в колонке "Действия", откроется QR-код, посредством которого и будет идти заведение устройства на базе Android в систему управления.

Итого, я реализовал, как мне кажется, более правильный и удобный вариант организации работы с сервисом Headwind MDM.
Я не стал изменять стандартный порт, на котором работает Tomcat — сервис, лежащий в основе Headwind MDM. То есть вместо того, чтобы редактировать /etc/tomcat9/server.xml и перенастраивать сам Tomcat, я оставил его конфигурацию без изменений.
Для организации внешнего доступа я использовал Nginx в качестве обратного прокси. На мой взгляд, это более правильный подход: нет необходимости дополнительно задействовать iptables для перенаправления портов, поскольку эту задачу удобно и наглядно решает Nginx.
Таким образом, схема получилась следующей:
Tomcat продолжает работать на своём стандартном внутреннем порту;
Nginx принимает внешние HTTP/HTTPS-запросы и выполняет обратное проксирование на Tomcat;
перенаправление портов выполняется средствами Nginx, без использования iptables для NAT/redirect;
ограничение доступа к самому серверу и его сервисам выполняется с помощью firewalld, который предоставляет более удобный и понятный уровень управления правилами фильтрации по сравнению с непосредственным редактированием правил iptables.
В результате конфигурация получилась более прозрачной:
-
Tomcatотвечает непосредственно за работуHeadwind MDM, Nginx— за внешний доступ и reverse proxy,- а
firewalld— за сетевую фильтрацию и ограничения доступа.
В последующих заметках я покажу, как завести Android устройства в Web-панель и как их подготовить для подключения.
На этом текущая практическая заметка успешно завершена, с уважением автор блога ekzorchik.