我有一个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);
}
答案 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
参见:
答案 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进行连接......)