Данная статья является логическим продолжением экспериментов с тестовым сервером FreeACS. Тогда я влюбился в этот инструмент, и обещал немногочисленным комментаторам довести дело до продакшн. Так что, сегодня мы установим сервер, настроим до рабочего состояния и прикрутим ssl-сертификат. А во второй части — разберем настройки и режимы, прогоним основные рабочие сценарии обслуживания устройств Mikrotik и слегка коснемся автоконфигурации IP-телефонов.

Перед стартом, хочу кратко напомнить основные постулаты:

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

На этом первая часть закончена. У нас есть рабочий сервер автоконфигурации, обслуживающий устройства по защищенному соединению на отдельном порту, который легко мониторить. Во второй части будут картинки, скрипты и опыт боевой работы с устройствами.

Спасибо всем, кто читал. Буду рад любым комментариям и поправкам.

Комментарии (2)


  1. rionnagel
    25.10.2021 04:30
    +1

    Первая статья была про установку и подключение микротика. Я 2 года ждал и получил то же самое, только с ssl). Давайте уже сценарии использования. Жду второй части).


    1. Louie Автор
      25.10.2021 09:53
      +1

      Понимаю, поэтому покороче, без воды, и разделил на части. Но, при всей простоте материала, некоторое количество сил было затрачено на отлаживание конфигурации под выбранную схему работы, и без ssl никак нельзя -)