Привет, Хабр! На связи снова Дмитрий, инженер по инфраструктурным решениям РЕД СОФТ. В прошлой статье мы разбирали, как настроить службу каталогов РЕД АДМ в ручном режиме, а также рассматривали самые распространённые ошибки в этом процессе. А в сегодняшней статье я постараюсь дать ответ, пожалуй, на весьма сложный вопрос — как работает репликация в РЕД АДМ «под капотом».

Эта статья — больше технический обзор, чем какой-либо чек-лист или инструкция. Мы дотошно пройдёмся по каждому этапу репликации. Я расскажу, что означают сообщения в терминале и подскажу, как на них реагировать. Материал будет интересен всем, кто хочет разобраться во внутренних процессах репликации: её логике, командах и функциях.

Начнём с начала! А именно – с первой команды

Предположим, вы настроили все файлы конфигурации, проверили nmap`ом порты и протоколы, прописали команду samba-tool domain join DC с нужными ключами:

/opt/reddc/bin/samba-tool domain join dom.del DC -U Administrator --dns-backend=BIND9_DLZ --realm=DOM.DEL --backend-store=mdb --backend-store-size=60Gb

Сама по себе команда очень базовая. Пробежимся по нескольким важным ключам:

--server=<fqdn-srv> – данная опция позволяет указать к какому именно серверу вы хотите подключиться для первичного стягивания данных. Лучше указывать владельца FSMO-ролей для этой процедуры, но не обязательно.

--option="ad dc functional level =2012\2012_R2\2016” – указание функционального уровня уже существующего домена. Если это не настроить, то ввод точно будет провальным.

-d 1-10 – опция debug. Помогает получить больше информации в процессе ввода. Наша техническая поддержка или отдел технического сопровождения всегда запрашивает такой файл лога с необходимым уровнем логирования для анализа.

Итак, жмём «Enter». Кстати, в команде ввода samba-tool domain join DC –U administrator вы указываете имя пользователя. После нажатия «Enter» система запросит пароль. Эти данные были переданы в переменные и теперь будут использоваться в процессе ввода в домен.

Итак, начинается сборка необходимых параметров: workgroup, realm, различных DN (base_dn, schema_dn). В фоне идет формирование NC – Naming Context`ов для предстоящей репликации.

В консоли появятся такие строчки:

INFO 2025-10-27 13:14:15,341 pid:11143 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1986: workgroup is DOM 

INFO 2025-10-27 13:14:15,341 pid:11143 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1989: realm is dom.del

Они сообщают о том, что будущий контроллер домена связался с существующим и обнаружил область REALM.

Создание доменных объектов

После того, как связь была установлена, появятся следующие строчки:

Adding CN=TR3,OU=Domain Controllers,DC=dom,DC=del

Adding CN=TR3,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=dom,DC=del

Adding CN=NTDS Settings,CN=TR3,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=dom,DC=del

RED DC создал для себя необходимые объекты. Например, CN=TR3,OU=Domain Controllers – это объект типа «компьютер».

Adding SPNs to CN=TR3,OU=Domain Controllers,DC=dom,DC=del

Setting account password for TR3$

Enabling account

Adding DNS account CN=dns-TR3,CN=Users,DC=dom,DC=del with dns/ SPN

Setting account password for dns-TR3

Дальше идёт добавление SPN-записей для объекта типа компьютер, таких как GC, LDAP, HOST и т.д. Включается учётная запись, для неё устанавливается случайный пароль, состоящий из 120 символов. Также в домене создаётся специальная учетная запись dns-TR3, где TR3 – короткое имя машины. Данная служебная запись нужна для того, чтобы входящий в состав RED DC BIND9 работал корректно.

Предварительное создание бекапов и настройка служебных баз данных

INFO 2025-10-27 13:14:36,929 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/netcmd/backup.py #36: The backup folder was created: /opt/reddc-backup 

INFO 2025-10-27 13:14:36,969 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/netcmd/backup.py #62: Backup folder has been archived as: /opt/reddc-backup/25.10.27_13:14:36_conf.tar.gz 

lpcfg_load: refreshing parameters from /opt/reddc/etc/smb.conf

Тут RED DC делает бекап всех заполненных ранее файлов конфигурации. Подробнее рассказывали о них в статье о подготовке RED DC к вводу.

После бекапа появится строчка refreshing parameters from /opt/reddc/etc/smb.conf – это значит, что RED DC обновил файл конфигурации smb.conf и внёс изменения. Он заполнил секцию REALM, установил функциональный уровень домена и т.д.

INFO 2025-10-27 13:14:37,015 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #2147: Looking up IPv4 addresses 

INFO 2025-10-27 13:14:37,016 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #2164: Looking up IPv6 addresses 

INFO 2025-10-27 13:14:37,314 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #2576: Setting up share.ldb 

INFO 2025-10-27 13:14:37,368 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #2580: Setting up secrets.ldb 

INFO 2025-10-27 13:14:37,379 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #2585: Setting up the registry

Далее производится настройка баз данных. Так, например, в secrets.ldb указываются данные служебной учётной записи dns-tr3 и её пароля в зашифрованном виде. Изнутри это выглядит так:

INFO 2025-10-27 13:14:37,415 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #2588: Setting up the privileges database 

INFO 2025-10-27 13:14:37,438 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #2591: Setting up idmap db 

INFO 2025-10-27 13:14:37,451 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #2598: Setting up SAM db 

INFO 2025-10-27 13:14:37,455 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #897: Setting up sam.ldb partitions and settings 

INFO 2025-10-27 13:14:37,455 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #909: Setting up sam.ldb rootDSE 

INFO 2025-10-27 13:14:37,458 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/__init__.py #1333: Pre-loading the Samba 4 and AD schema

Последующие строки отражают тот же процесс. Настраиваются специальные базы данных, которые потребуются для будущей работы. Они заполняются полями и типовыми значениями формата key-value. Так, например, в sam.ldb хранится критически важная информация, которая будет обеспечивать работу доменного контроллера.

Именно тут вы можете найти информацию о  конкретном объекте в базе, его SPN-записях и другую информацию, которая записывается в атрибуты. Администраторы с опытом работы в AD DS наверняка увидят для себя много знакомых атрибутов.

Если вы увидели вот такие строчки:

Provision OK for domain DN DC=dom,DC=del

Starting replication

Это значит, что опрос первичной информации прошёл успешно, а базы прошли первичное формирование. Строчка “starting replication” говорит о том, что сейчас начнётся процесс репликации доменных контекстов.

Репликация доменных контекстов

Transaction start: transaction_size: (inf)

Schema-DN[CN=Schema,CN=Configuration,DC=dom,DC=del] objects[1000/1770] linked_values[0/0]

chunk processed: 0, used memory: 15%

Schema-DN[CN=Schema,CN=Configuration,DC=dom,DC=del] objects[1770/1770] linked_values[0/0]

Analyze and apply schema objects

Бегущие строчки сообщают, что в текущий момент было среплецировано некое количество объектов из контекста. Рассмотрим этот процесс изнутри.

Под капотом задействуется RPC-интерфейс для вызова функций drsuapi. Первое, что требуется сделать новому контроллеру, — установить BIND-соединение с уже существующим контроллером, чтобы вычитать содержимое контекстов.

RPC вызывает DRSBind для установки соединения с существующим контекстом.

Schema и принцип её работы

Самым первым контекстом всегда стягивается Schema. Это незыблемое правило, ведь Schema хранит в себе все объекты и классы, которые потом ссылаются на этот контекст. Для понимания: если вы решили просмотреть атрибуты пользователя, воспользовавшись командлетом:

Samba-tool user show user1

То увидите, что у объекта типа «пользователь» есть атрибут ObjectsClass.

Сам атрибут и значение этого атрибута прописаны в контексте схемы. Вы не сможете добавить еще один objectsClass пользователю, если он не добавлен в схему. Система при попытке изменений просто отклонит запрос и сообщит, что в CN=Schema отсутствует упоминание данного атрибута. Администраторы, которые пробовали вручную расширять схему домена через собственные .ldif файлы, знакомы с этой историей очень хорошо.

Configuration

Сразу после схемы идёт контекст «конфигурация» (CN=Configuration). Этот контекст хранит в себе служебную информацию, например, о сайтах и поддоменах.

Служба каталогов RED DC позволяет создать поддомен по принципу как в MS AD. Информация о существующем поддомене будет прописана на корневом домене в CN=Partitions,CN=Configuration. Поэтому когда вы увидите строчки:

Partition[CN=Configuration,DC=dom,DC=del] objects[2630/1630] linked_values[82/0]

Replicated 1000 objects (0 linked attributes) for CN=Configuration,DC=dom,DC=del

chunk processed: 1000, used memory: 18%

Partition[CN=Configuration,DC=dom,DC=del] objects[3260/1630] linked_values[164/82]

Replicated 630 objects (82 linked attributes) for CN=Configuration,DC=dom,DC=del

знайте, что в текущий момент производится репликация именно этого контекста.

BASE_DN - основной контекст домена

Далее идёт репликация основного контекст домена, так называемого base_dn – DC=dom,DC=del:

Replicating critical objects from the base DN of the domain

Partition[DC=dom,DC=del] objects[112/112] linked_values[23/23]

Replicated 112 objects (23 linked attributes) for DC=dom,DC=del

chunk processed: 0, used memory: 19%

Partition[DC=dom,DC=del] objects[476/476] linked_values[26/26]

Replicated 476 objects (26 linked attributes) for DC=dom,DC=del

chunk processed: 0, used memory: 19%

Done with always replicated NC (base, config, schema)

Строчка «Done with always replicated NC (base, config, schema)» даёт понять, что закончилась репликация трёх существующих контекстов: schema, configuration, base_dn.

DomainDnsZones

Следом идёт репликация контекстов DomainDnsZones и ForestDnsZones. Здесь вас может смутить сообщение:

WARNING: Unable to replicate own RID Set, as server tr1.dom.del (the server we joined) is not the RID Master.

NOTE: This is normal and expected, RED DC will be able to create users after it contacts the RID Master at first startup.

Не получилось связаться с сервером, который является RID Master. В этом нет ничего страшного. Сразу после того, как вы запустите службы, контроллер сам обратится к владельцу FSMO в роли RID master, запишет информацию RID set о себе и получит RID pool.

Commiting SAM DataBase

Процесс не завис, он просто требует определённого количества времени:

Committing SAM database - this may take some time

Всё, что происходило выше, записывалось в оперативную память. Как было указано в терминале ранее, chunk processed: 0, used memory: 19%. Тут указывается процент использования оперативной памяти, вся отреплецированная информация записывается именно в ОЗУ.

Когда вся информация получена, и мы имеем полную картину внутри ОЗУ, начинается запись на диск. Данные из оперативной памяти переносятся в базы данных, которые хранятся по пути /opt/reddc/private/sam.ldb.d/

INFO 2025-10-27 13:14:46,337 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1180: Committed SAM database 

INFO 2025-10-27 13:14:46,393 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/netcmd/backup.py #62: Backup folder has been archived as: /opt/reddc-backup/25.10.27_13:14:46_conf.tar.gz 

INFO 2025-10-27 13:14:46,393 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/netcmd/backup.py #62: Backup folder has been archived as: /opt/reddc-backup/25.10.27_13:14:46_conf.tar.gz 

INFO 2025-10-27 13:14:46,394 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1336: Adding 1 remote DNS records for TR3.dom.del

Связываем контроллеры домена

Конечно, пришлось подождать. Но вот, коммитинг завершился. После этого будет создан архив для бекапа с конфигами, добавлена А-запись в домене с FQDN вашего нового контроллера домена, а также добавлена CNAME запись в зону _msdcs. Она отвечает за репликацию между контроллерами домена и общение между ними.

INFO 2025-10-27 13:14:46,433 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1402: Adding DNS A record TR3.dom.del for IPv4 IP: 192.168.11.83 

INFO 2025-10-27 13:14:46,451 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1447: Adding DNS CNAME record cfa2e40b-3a18-40c4-9a01-9f1941aacb3d._msdcs.dom.del for TR3.dom.del 

INFO 2025-10-27 13:14:46,470 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1464: All other DNS records (like ldap SRV records) will be created sambadnsupdate on first startup 

INFO 2025-10-27 13:14:46,470 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1653: Replicating new DNS records in DC=DomainDnsZones,DC=dom,DC=del

Так как чуть ранее мы стягивали только критичные объекты, то теперь дотягиваем всё остальное содержимое контекстов DomainDnsZones и ForestDnsZones.

INFO 2025-10-27 13:14:46,621 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1241: Committed SAM database 

INFO 2025-10-27 13:14:46,621 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1243: Root context replication completed successfully 

INFO 2025-10-27 13:14:46,621 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1668: Sending DsReplicaUpdateRefs for all the replicated partitions 

INFO 2025-10-27 13:14:46,647 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1698: Setting isSynchronized and dsServiceName 

INFO 2025-10-27 13:14:46,648 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #1713: Setting up secrets database

Коммитинг завершён. Запись Root Context replication completed будет означать, что репликация всех контекстов также завершена.

Дальше отправляется RPC-функция DRSUpdateRefs. Она отвечает за информирование соседей по репликации о наличии нового контроллера домена в сети и заполнении атрибута RepsTo в DSA объектах.

INFO 2025-10-27 13:14:47,097 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/sambadns.py #1386: See /opt/reddc/bind-dns/named.conf for an example configuration include file for BIND 

INFO 2025-10-27 13:14:47,097 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/provision/sambadns.py #1388: and /opt/reddc/bind-dns/named.txt for further documentation required for secure DNS updates 

INFO 2025-10-27 13:14:47,106 pid:11154 /opt/reddc/lib64/python3.8/site-packages/samba/join.py #2136: Joined domain DOM (SID S-1-5-21-4039423950-2894173283-293384212) as a DC

Всё! Ввод в домен успешно завершен, у него также появился SID. Дальше вам нужно действовать по инструкции и грамотно запустить службы, чтобы контроллер начал работать.

И у вас может появиться вполне логичный вопрос: а где же тут процесс репликации непосредственно? В каком-то смысле вы будете правы. Тут описано первичное стягивание, но оно практически полностью совпадает с оригинальным процессом репликации, который происходит на постоянной основе между контроллерами домена.

Надеюсь, сегодняшняя статья поможет сориентироваться в процессе репликации службы каталогов РЕД АДМ. Если у вас остались вопросы – пишите в комментариях, какой этап нужно раскрыть подробнее.