Поиск домена PHP fsockopen ldap

Контекст:
Я использую адрес доменного имени, чтобы попытаться проверить подключения к контроллеру домена, но не все контроллеры домена доступны с сервера, на котором работает PHP. Поэтому я использую цикл, чтобы увидеть, есть ли контроллер домена, чтобы ответить с помощью fsockopen.

Domain.ad указывает на 15 возможных контроллеров домена. server.domain.ad, server2.domain.ad и т. д.

...
$i = 0;
do
{
    $fp = fsockopen("domain.ad", 389, $errno, $errstr, 1);
    $i++;
}
while(!$fp && $i < 15);
...
//$ip = $fp->getAddress(); or something like that.

Вопрос:
Есть ли способ узнать из соединения fsockopen, с каким IP-адресом/контроллером домена было успешно установлено соединение, чтобы использовать его позже в коде для завершения привязки LDAP? ? Или есть лучший способ сделать это без использования 1 контроллера домена?


person thebtm    schedule 30.01.2017    source источник


Ответы (2)


Я не уверен, чего вы пытаетесь достичь там. fsockopen пытается открыть соединение с данным сервером на указанном порту. Вы также устанавливаете тайм-аут. Но вы делаете это в цикле. Итак, вы пытаетесь открыть соединение 15 раз подряд и увеличиваете время ожидания до сервера на одну секунду при каждом запуске. Но из того, что я читал, доступно несколько контроллеров домена. В зависимости от настройки сети первый доступный должен реагировать и действовать как «ваша» конечная точка. Вам, как пользователю этой системы, не нужно проверять, до какой из них вы можете добраться, а до какой нет. Вы должны просто вернуть дескриптор, когда сделаете ldap_connect('ldap://domain.ad:389);.

В качестве альтернативы вы можете сделать DNS-запрос для контроллера домена через gethostbyname('domain.ad'), который даст вам IP-адрес данного хоста. Но, как я уже сказал, в этом не должно быть необходимости, если ваша сеть правильно обслуживается.

Если у вас есть более одного имени сервера, вы можете использовать их в списке, разделенном пробелами, в качестве параметра для ldap_connectподобного этому:

ldap_connect('ldap://domain.ad:389 ldap://domain2.ad:389 ldaps://domain.ad:123');

Это должно подключиться к первому доступному серверу.

Однако вам придется остерегаться одной проблемы: ldap_connect не подключается! Соединение обычно впервые открывается ldap_bind! Таким образом, проблемы с подключением не возникнут на ldap_connect. Если вы получите false, это просто означает, что предоставленный параметр не соответствует ожиданиям! Вот почему я обычно сначала использую fsockopen, чтобы проверить, доступен ли сервер, если это будет проблемой, чтобы я мог быстро выйти из строя.

person heiglandreas    schedule 31.01.2017
comment
Имеет ли domain.ad 15 CNAME или 15 A-записей? DNS должен возвращать только те серверы, которые доступны с вашего компьютера. В качестве альтернативы выполните DNS-запрос, чтобы найти все A-записи, и переберите их, чтобы найти доступную. - person heiglandreas; 01.02.2017
comment
Это на самом деле хочу, я сделал вчера днем. - person thebtm; 01.02.2017

Мое решение для повторения контроллеров домена.

$ipDomain = dns_get_record("domain.ad", DNS_A);
$i = 0;
do
{
    $fp = fsockopen($ipDomain[$i]['ip'], 389, $errno, $errstr, 1);
    if(!$fp)
    {
        $i++;
        if($i >= sizeof($ipDomain))
        {
            break;
            //die();
        }
    }
}
while(!$fp);
...
ldap_connect($ipDomain[$i]['ip']);
...
person thebtm    schedule 01.02.2017