Интеграция FreePBX с Active Directory / LDAP: синхронизация корпоративной телефонной книги
- Ошибка
LDAP bind failed: Invalid credentials / Strong authentication requiredпри подключении к контроллеру домена. - IP-телефоны сотрудников не загружают централизованную адресную книгу компании.
- Дублирование и неактуальность внутренних номеров при увольнении или переводе сотрудников.
- Таймаут синхронизации модуля User Management во FreePBX при обращении к Active Directory.
1. Настройка User Management во FreePBX под AD
- Откройте Admin -> User Management -> Settings -> Authentication Engine и выберите
Active Directory / OpenLDAP. - Host:
ldaps://dc01.corp.internal:636(используйте защищенный LDAPS). - Bind DN:
CN=svc_freepbx,OU=ServiceAccounts,DC=corp,DC=internal. - Base DN:
OU=Employees,DC=corp,DC=internal. - User Filter:
(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(telephoneNumber=*)).
2. Скрипт автоматической генерации XML Phonebook для IP-телефонов
Создайте скрипт /var/www/html/phonebook.php для выдачи телефонной книги в формате Yealink Remote Phonebook:
<?php
header("Content-Type: text/xml; charset=utf-8");
$ldap_host = "ldaps://dc01.corp.internal";
$ldap_dn = "DC=corp,DC=internal";
$ldap_user = "svc_freepbx@corp.internal";
$ldap_pass = "SecretPassword123";
$conn = ldap_connect($ldap_host);
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($conn, LDAP_OPT_REFERRALS, 0);
if (@ldap_bind($conn, $ldap_user, $ldap_pass)) {
$filter = "(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(telephoneNumber=*))";
$res = ldap_search($conn, $ldap_dn, $filter, ["displayName", "telephoneNumber", "mail"]);
$entries = ldap_get_entries($conn, $res);
echo '<YealinkIPPhoneDirectory>' . PHP_EOL;
for ($i = 0; $i < $entries["count"]; $i++) {
$name = htmlspecialchars($entries[$i]["displayname"][0]);
$phone = htmlspecialchars($entries[$i]["telephonenumber"][0]);
echo " <DirectoryEntry><Name>{$name}</Name><Telephone>{$phone}</Telephone></DirectoryEntry>" . PHP_EOL;
}
echo '</YealinkIPPhoneDirectory>';
ldap_unbind($conn);
}
?>3. Настройка IP-телефонов (Yealink/Fanvil)
В веб-интерфейсе телефона перейдите в раздел Directory -> Remote Phonebook и укажите URL: http://192.168.1.10/phonebook.php с интервалом обновления 3600 сек.
Частые вопросы (FAQ)
Почему обычный LDAP (порт 389) отклоняет подключение к Windows Server 2019/2022?
Современные версии Windows Server по умолчанию требуют обязательной подписи LDAP (LDAP Channel Binding & Signing). Используйте LDAPS на 636 порту с доверенным сертификатом Root CA домена в системе Linux.
Как фильтровать только активных сотрудников без отключенных учеток?
Используйте битовую маску userAccountControl:1.2.840.113556.1.4.803:=2 в фильтре LDAP. Флаг !(...:=2) исключает заблокированные учетные записи Active Directory.
Где сохраняются импортированные пользователи во FreePBX?
Пользователи синхронизируются во внутреннюю базу данных SQLite/MySQL модуля User Management (userman), после чего их можно привязать к Contact Manager и внутренним экстеншенам.
Можно ли настроить поиск по LDAP прямо на лету с экрана телефона?
Да, практически все Enterprise-телефоны поддерживают функцию LDAP Directory Search на лету (Search Base, Name Filter = (cn=%*), Number Filter = (telephoneNumber=%*)).