Данная статья является логическим продолжением экспериментов с тестовым сервером FreeACS. Тогда я влюбился в этот инструмент, и обещал немногочисленным комментаторам довести дело до продакшн. Так что, сегодня мы установим сервер, настроим до рабочего состояния и прикрутим ssl-сертификат. А во второй части — разберем настройки и режимы, прогоним основные рабочие сценарии обслуживания устройств Mikrotik и слегка коснемся автоконфигурации IP-телефонов.
Перед стартом, хочу кратко напомнить основные постулаты:
1. Протокол TR-069 используется десятками миллионов устройств, и, де факто, является стандартом для обновления ПО, диагностики и конфигурации сетевого оборудования. В документации FreeACS, необходимые системные требования к серверу начинаются с 50 тыс. обслуживаемых устройств, и заканчиваются на 2 млн. Это могучий специализированный инструмент.
2. Системы управления конфигурациями (SCM), такие как Ansible, могут быть использованы, в том числе, для удаленного выполнения команд и скриптов в RouterOS, но не являются альтернативой ACS.
3. Проблемы безопасности TR-069 кратко описаны здесь, и состоят в том, что протокол предполагает использование шифрования, но не обязывает. Поэтому 80% устройств передают данные открыто, а часть использует самоподписанные сертификаты. Не надо так.
Ресурсы: Минимум 4 GB RAM, 10 GB HDD, Centos 7/8
Домен: Сервер будет доступен из Интернет, поэтому необходимо купить домен или добавить DNS-запись поддомена, указывающую на внешний ip-адрес FreeACS. И соответственно настроить FQDN имя хоста.
Сертификат: Если у вас уже есть рабочий домен и доступен какой-то из способов проверки подлинности сертификата — можно сразу выпустить сертификат. Я использовал самый дешевый Sectigo Positive SSL, доступный повсеместно за 500-1000 руб./год
Если рабочего домена нет — выпустим сертификат после установки сервера, с проверкой по Хэш-файлу. Идеи с Letsencrypt и иже с ним — «экономия на спичках».
Как и в предыдущей статье, проще всего это сделать скриптом.
Скрипт установит все необходимое. Останется лишь немного доработать.
Проверьте работу веб-интерфейса по http://<серый адрес хоста>, смените дефолтный пароль и можно ехать дальше
Пора настроить Nginx. Если вы еще не получили сертификат — давайте его получать и подтверждать.
Например, вы купили домен mydomain.ru, настроили DNS запись acs и заказали сертификат для acs.mydomain.ru с подтверждением владения по Хэш-файлу.
Поставщик предоставит информацию, типа:
Т.е. проверка сертификата поддомена acs проходит через подтверждение владением доменом 2-го уровня, и если на нем у вас уже есть какой-то веб-ресурс, то файл надо разместить там.
Если такого нет, то Хэш-файл можно разместить на сервере с FreeACS, предварительно изменив DNS-запись mydomain.ru. Надо создать директорию с данным файлом:
И добавить дополнительную секцию server в конфиге Nginx. Удобно сделать нестандартный порт, чтобы потом открыть наружу по http только нужное
После рестарта Nginx и проброса 80 внешнего порта на порт 8044 хоста FreeACS, файл .http://mydomain.ru/.well-known/pki-validation/5C7E984684D01FAF787171DB395A6F4A.txt должен быть виден из интернета. А значит, как только пройдет проверка, поставщик выдаст вам сертификат, цепочку промежуточных сертификатов и закрытый ключ. Будет что-то типа acs_mydomain_ru.crt, acs_mydomain_ru.ca-bundle и 11005566.key
Для Nginx сертификаты надо слепить, ключ переименовать, и оба файла положить в /etc/pki
Теперь добавим ssl в конфиг Nginx. Порт для проксирования TR-069 будет тоже нестандартным 8099.
На данном этапе, весь конфиг будет выглядеть как-то так:
Перезапускаем Nginx. Пробрасываем 8099 на хост с FreeACS. Теперь у нас есть сервер, который может обслуживать клиентов TR-069 по адресу: .https://acs.mydomain.ru:8099/tr069/prov
Откройте этот адрес в браузере из Интернет. Если в ответ выдается 404 с валидным сертификатом, то пора пробовать подключать устройства.
Для начала надо включить автоопределение моделей устройств.
Потом эту опцию можно будет отключить, завести второй сервер для обучения новым моделям, а потом переносить на прод через экспорт/импорт, но для старта она очень полезна.
На вашем пробном Mikrotik надо импортировать сертификат, который мы делали для Nginx — acs_mydomain_ru.chained.crt в System/Certificates/Import.
Затем поставить пакет tr069-client и указать ACS URL: .https://acs.mydomain.ru:8099/tr069/prov Username:<серийный номер>. И готово.
По нажатию Apply, устройство соединится с сервером по https, в окошке изменится Periodic inform interval, а на сервере появится новый Unit type и, соответственно, Unit
На этом первая часть закончена. У нас есть рабочий сервер автоконфигурации, обслуживающий устройства по защищенному соединению на отдельном порту, который легко мониторить. Во второй части будут картинки, скрипты и опыт боевой работы с устройствами.
Спасибо всем, кто читал. Буду рад любым комментариям и поправкам.
Перед стартом, хочу кратко напомнить основные постулаты:
1. Протокол TR-069 используется десятками миллионов устройств, и, де факто, является стандартом для обновления ПО, диагностики и конфигурации сетевого оборудования. В документации FreeACS, необходимые системные требования к серверу начинаются с 50 тыс. обслуживаемых устройств, и заканчиваются на 2 млн. Это могучий специализированный инструмент.
2. Системы управления конфигурациями (SCM), такие как Ansible, могут быть использованы, в том числе, для удаленного выполнения команд и скриптов в RouterOS, но не являются альтернативой ACS.
3. Проблемы безопасности TR-069 кратко описаны здесь, и состоят в том, что протокол предполагает использование шифрования, но не обязывает. Поэтому 80% устройств передают данные открыто, а часть использует самоподписанные сертификаты. Не надо так.
Часть1. Установка FreeACS + SSL
0. Подготовка
Ресурсы: Минимум 4 GB RAM, 10 GB HDD, Centos 7/8
Домен: Сервер будет доступен из Интернет, поэтому необходимо купить домен или добавить DNS-запись поддомена, указывающую на внешний ip-адрес FreeACS. И соответственно настроить FQDN имя хоста.
Сертификат: Если у вас уже есть рабочий домен и доступен какой-то из способов проверки подлинности сертификата — можно сразу выпустить сертификат. Я использовал самый дешевый Sectigo Positive SSL, доступный повсеместно за 500-1000 руб./год
Если рабочего домена нет — выпустим сертификат после установки сервера, с проверкой по Хэш-файлу. Идеи с Letsencrypt и иже с ним — «экономия на спичках».
1. Установка FreeACS
Как и в предыдущей статье, проще всего это сделать скриптом.
wget https://raw.githubusercontent.com/freeacs/freeacs/master/scripts/install_centos.sh
chmod +x install_centos.sh
./ install_centos.sh
Скрипт установит все необходимое. Останется лишь немного доработать.
# Установить часовой пояс
timedatectl set-timezone Asia/Novosibirsk
# Установить Xorg-fonts. Без этого, в веб-интерфейсе не будет графиков
yum -y install xorg-x11-fonts-misc
# MySQL часовой пояс и лимиты. Без этого в веб-интерфейсе будет UTC и файлы не загрузятся
# /etc/my.cnf
default-time-zone='+07:00'
max_allowed_packet=32M
innodb_buffer_pool_size=1024M
Проверьте работу веб-интерфейса по http://<серый адрес хоста>, смените дефолтный пароль и можно ехать дальше
2. Nginx
Пора настроить Nginx. Если вы еще не получили сертификат — давайте его получать и подтверждать.
Например, вы купили домен mydomain.ru, настроили DNS запись acs и заказали сертификат для acs.mydomain.ru с подтверждением владения по Хэш-файлу.
Поставщик предоставит информацию, типа:
Хеш файл должен быть доступен по адресу:
http://mydomain.ru/.well-known/pki-validation/5C7E984684D01FAF787171DB395A6F4A.txt
Содержимое файла:
75D5AB94B09B408A2A7DD93696BA69B736CA8A5E0DFD80DBB45186EF70AB1A77
comodoca.com
Т.е. проверка сертификата поддомена acs проходит через подтверждение владением доменом 2-го уровня, и если на нем у вас уже есть какой-то веб-ресурс, то файл надо разместить там.
Если такого нет, то Хэш-файл можно разместить на сервере с FreeACS, предварительно изменив DNS-запись mydomain.ru. Надо создать директорию с данным файлом:
mkdir -p /var/www/.well-known/pki-validation
vi /var/www/.well-known/pki-validation/5C7E984684D01FAF787171DB395A6F4A.txt
#сюда аккуратно скопировать содержимое
И добавить дополнительную секцию server в конфиге Nginx. Удобно сделать нестандартный порт, чтобы потом открыть наружу по http только нужное
# /etc/nginx.conf
...
server {
listen 8044;
server_name mydomain.ru;
location /.well-known/pki-validation/ {
root /var/www/;
}
...
После рестарта Nginx и проброса 80 внешнего порта на порт 8044 хоста FreeACS, файл .http://mydomain.ru/.well-known/pki-validation/5C7E984684D01FAF787171DB395A6F4A.txt должен быть виден из интернета. А значит, как только пройдет проверка, поставщик выдаст вам сертификат, цепочку промежуточных сертификатов и закрытый ключ. Будет что-то типа acs_mydomain_ru.crt, acs_mydomain_ru.ca-bundle и 11005566.key
Для Nginx сертификаты надо слепить, ключ переименовать, и оба файла положить в /etc/pki
cat acs_mydomain_ru.crt acs_mydomain_ru.ca-bundle > acs_mydomain_ru.chained.crt
mv 11005566.key acs_mydomain_ru.key
cp acs_mydomain_ru.chained.crt /etc/pki
cp acs_mydomain_ru.key /etc/pki
Теперь добавим ssl в конфиг Nginx. Порт для проксирования TR-069 будет тоже нестандартным 8099.
На данном этапе, весь конфиг будет выглядеть как-то так:
events {
worker_connections 19000;
}
http {
client_max_body_size 32m;
server {
listen 8099 ssl;
server_name acs.mydomain.ru;
# SSL
ssl_certificate /etc/pki/acs_mydomain_ru.chained.crt ;
ssl_certificate_key /etc/pki/acs_mydomain_ru.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
#ssl connections for CPE
location /tr069/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header HTTPS YES;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
proxy_pass http://localhost:8085/tr069/;
}
}
server {
#SSL hash check
listen 8044;
server_name mydomain.ru;
location /.well-known/pki-validation/ {
root /var/www/;
}
}
server {
listen 80;
server_name 10.110.0.117;
location = / {
return 301 /web/index;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
}
location /tr069/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
proxy_pass http://localhost:8085/tr069/;
}
location /web/ {
proxy_pass http://localhost:8081/web/;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
}
location /monitor/ {
proxy_pass http://localhost:8090/monitor/;
}
location /webservice/ {
proxy_pass http://localhost:8088/webservice/;
}
location /syslog/ {
proxy_pass http://localhost:8086/syslog/;
}
location /core/ {
proxy_pass http://localhost:8083/core/;
}
location /stun/ {
proxy_pass http://localhost:8087/stun/;
}
}
}
Перезапускаем Nginx. Пробрасываем 8099 на хост с FreeACS. Теперь у нас есть сервер, который может обслуживать клиентов TR-069 по адресу: .https://acs.mydomain.ru:8099/tr069/prov
Откройте этот адрес в браузере из Интернет. Если в ответ выдается 404 с валидным сертификатом, то пора пробовать подключать устройства.
Для начала надо включить автоопределение моделей устройств.
#/opt/freeacs-tr069/config/application-config.conf
# Discovery Mode can be set to true if you want to automatically add a new
# unittype and unit. This mode is violating the security of the system,
# because it allows unknown units to connect and then changes will be performed
# in the database. So use this option with caution, preferably when you want to
# add a new unittype to the system. Default is false.
#discovery.mode = false
discovery.mode = true
Потом эту опцию можно будет отключить, завести второй сервер для обучения новым моделям, а потом переносить на прод через экспорт/импорт, но для старта она очень полезна.
На вашем пробном Mikrotik надо импортировать сертификат, который мы делали для Nginx — acs_mydomain_ru.chained.crt в System/Certificates/Import.
Затем поставить пакет tr069-client и указать ACS URL: .https://acs.mydomain.ru:8099/tr069/prov Username:<серийный номер>. И готово.
По нажатию Apply, устройство соединится с сервером по https, в окошке изменится Periodic inform interval, а на сервере появится новый Unit type и, соответственно, Unit
На этом первая часть закончена. У нас есть рабочий сервер автоконфигурации, обслуживающий устройства по защищенному соединению на отдельном порту, который легко мониторить. Во второй части будут картинки, скрипты и опыт боевой работы с устройствами.
Спасибо всем, кто читал. Буду рад любым комментариям и поправкам.
rionnagel
Первая статья была про установку и подключение микротика. Я 2 года ждал и получил то же самое, только с ssl). Давайте уже сценарии использования. Жду второй части).
Louie Автор
Понимаю, поэтому покороче, без воды, и разделил на части. Но, при всей простоте материала, некоторое количество сил было затрачено на отлаживание конфигурации под выбранную схему работы, и без ssl никак нельзя -)