当前的LDAP主机IP在循环IP选择中

时间:2016-12-07 12:01:06

标签: php ldap

我有一个LDAP服务器(例如ldaps://abc.example.com)。 我在PHP中使用@ldap_connect()函数和程序来获取与ldap的连接。该主机为其配置了多个ips,并以循环方式使用它们。那么我有什么方法可以获得当前与这些ips内部连接的当前IP?

代码:

$host = "ldaps://abc.example.com";
$binddn = "cn=user,ou=My Accounts,ou=TestUsers,ou=Test System   access,dc=abc,dc=example,dc=com";
$password = "xyz"
for( $i = 0; $i < 3; $i++ )
{
    $conn = @ldap_connect( $host );
    if ( !$conn )
    {
        sleep(1);
        continue;
    }
    echo "Connected at $host (my attempt count is $i): ";
    print_r($conn, true);
    @ldap_set_option( $conn, LDAP_OPT_PROTOCOL_VERSION, 3 );
    @ldap_set_option( $conn, LDAP_OPT_REFERRALS, 0 );
    echo "Binding at $host (my attempt count is $i)";
    $Resource = @ldap_bind( $conn, $binddn, $password );
    if ( $Resource )
    {
        break;
    }
    echo "Bind failed to AD at $host (my attempt count is $i): " . trim (@ldap_error($conn);
    @ldap_close( $conn );
    sleep(1);
}

2 个答案:

答案 0 :(得分:0)

由于您只会连接到同一A条记录,因此您只需使用gethostbyname()功能即可获得已连接服务器的IP。然后,您将使用gethostbyaddr()执行反向查找(IP到主机名)以获取PTR记录。分配给gethostbyaddr()的变量将是您用于进行LDAP查询的主机名,因为您在技术上不查询A记录,但IP地址反过来绕过循环。

$ip = gethostbyname('www.google.com'); //Get the ip via hostname (Given IP from Round Robin)
$address = gethostbyaddr($ip); // Convert the IP to Hostname using reverse lookup/ PTR Lookup

echo $address; //Use this for your LDAP query

在上面的示例中,Google对PTR记录有一个不同的A记录(反向查找记录),所以在这个例子中,结果与我原来的www查询不同并将主机名显示为 lhr35s01-in-f4.1e100.net 。如果您控制DNS(我猜你这样做),您可以创建一个与PTR记录匹配的A记录,以便您的反向查找能够正确解析。

<强>输出:

lhr35s01-in-f4.1e100.net 

参见:

http://php.net/manual/en/function.gethostbyname.php

http://php.net/manual/en/function.gethostbyaddr.php

答案 1 :(得分:0)

如果你真的想知道你正在连接哪个服务器,我的解决方案就是扭转局面。

$dclist = gethostbynamel($host); // will get the list of IPs in round robin fashion (order changes)

$host = $dc[0]; // will contain different IP

// now you can connect to $host while knowing the IP...

(这可能不适用于ssl tho ..对不起,我刚才注意到你使用ldaps进行连接......)