PHP 通过 SSH 隧道连接到其他网络中的 LDAP

Posted

技术标签:

【中文标题】PHP 通过 SSH 隧道连接到其他网络中的 LDAP【英文标题】:PHP connect via SSH tunnel to LDAP in other network 【发布时间】:2011-03-20 17:55:46 【问题描述】:

我正在为我的学校开发网站。在那所学校,我们通过 LDAP 对用户进行身份验证,因此有一个想法通过学校站点来做同样的事情。在那个网站上,一切都运行良好,但在开发过程中,我需要经常测试这种解决方案是否有效,或者不是。为了不经常提交我的更改,我想在我的本地计算机上测试这个站点,但是为了连接 LDAP,我想使用 ssh 隧道。在学校网络中,我们通过与学校网络内部连接的女巫拥有一台服务器。它的地址是phoenix.lo5.bielsko.pl。在这个网络中,我们有 LDAP 服务器,开放了 389 和 636 端口。它的地址是auth.lo5。我无法通过 SSH 访问auth.lo5,我只能连接它以获取一些 LDAP 条目。所以,我尝试通过运行来运行 SSH 隧道:

ssh -L 636:auth.lo5:636 hfaua@phoenix.lo5.bielsko.pl

然后,我在我的/etc/hosts 中设置了auth.lo5 指向127.0.0.1。我以这种方式连接到 php 中的 LDAP:

ldap_connect('ldaps://auth.lo5', 636);

但我收到错误 Can't contact LDAP server。我认为,这个问题可能出在phoenix.lo5.bielsko.pl 的 SSH 守护程序配置中或传递给ldap_connect() 函数的参数中。你能告诉我,我应该在 sshd_config 或传递给ldap_connect 的参数中设置什么来让它工作吗?

我在similar thread 中发布了同样的问题,但没有人回答我的问题。

附:在我的/etc/ssh/sshd_config 我有行AllowTcpForwarding yes

【问题讨论】:

如果您使用 LDAP 命令行工具,它们是否有效?首先尝试使用ldapwhoami -H ldaps://auth.lo5 - PHP 报告的有用消息不如命令行 LDAP 实用程序那么多。 @Borealid,我们的 LDAP 服务器不允许匿名绑定,所以我输入了 ldapwhoami -D cn=lo5-www,ou=services,dc=auth,dc=lo5 -W -H ldaps://auth.lo5,在 phoenix 上的答案是 dn:cn=lo5-www,ou=services,dc=auth,dc=lo5,但在我的桌面上是 ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1) 在命令行工具正常工作之前,您的 SSH 隧道尚未启动。由于您使用的命令是即时的(老实说,我印象深刻您知道如何做到这一点 - SSH 隧道很复杂!),我只有一个建议。尝试为本地端口(如ssh -L 9999:auth.lo5.bielsko.pl:636)使用非特权端口(高于 1024)。还要指定一个 FQDN!不过,使用命令行工具进行测试。并确保它们从 phoenix.lo5 到 auth.lo5 工作! 【参考方案1】:

如果我没听错的话,phoenix.lo5 和 auth.lo5 是两台不同的机器。 如果是这样,您必须创建一个到 ssh 机器的隧道,然后将 ldap 查询发送到正确的机器。

如果phoenix.lo5.bielsko.pl 可以通过DNS 或/etc/hosts 解析auth.lo5,则您的命令:ssh -L 636:auth.lo5:636 hfaua@phoenix.lo5.bielsko.pl 是正确的,否则您需要使用其内部IP 地址。

另外,如果你想在你的电脑上使用 636 端口,你需要以超级用户(root 或使用 sudo)运行你的命令,否则你需要使用 Borealid 规定的高端口(1024 以上)

隧道开通后,您必须指向 localhost 才能进行查询

【讨论】:

当然phoenixauth 是不同的机器,我们使用我们的DNS 来解析其名称。我认为,地址在这里不是真正的问题。我使用tcpdump 来检查是否有通过隧道的真实连接以及ldapwhoami 是否正确发送数据包。结果令人困惑:local =[tunnel]=> phoenix => auth (LDAP querying) => phoenix =[tunnel]=> local,所以我认为ldapwhoami 应该给出正确答案,但我得到错误ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)。我在phoenix 上有sudo,所以我认为1024 以下的端口没有问题。你不觉得很奇怪吗? 我遇到了同样的问题。我目前的想法是 SSL 握手失败。我尝试使用本地 /etc/hosts 条目来伪造主机名,但这还没有成功。【参考方案2】:

我遇到了同样的问题。使用-d1 运行显示了这个错误:

TLS: hostname (mylaptop.local) does not match common name in certificate (*.mydomain.com). TLS reverse lookup of 'localhost' is 'mylaptop.local', checking if that matches the certificate common name

你可能遇到了类似的问题。

我可以通过运行来伪造它:

sudo hostname someserver.mydomain.com

这导致 SSL 认为它正在与正确的主机通信。

【讨论】:

【参考方案3】:

我也收到了错误hostname (mylaptop.local) does not match common name in certificate (*.mydomain.com)。但是我不想编辑我的机器的主机名以匹配 LDAP 服务器的主机名。相反,我编辑了 hosts 文件(Linux 上的etc/hosts)文件,添加了一行拦截对 LDAP 服务器的请求,例如:

127.0.0.1 ldap.server.com

这有一个额外的好处,即不需要您在代码中更改要尝试连接的服务器名称,如果您选择了不同的端口,则只需更改端口号。

【讨论】:

【参考方案4】:

尝试用 localhost 替换所有 auth.lo5 实例:

ssh -L 636:localhost:636 hfaua@phoenix.lo5.bielsko.plldap_connect('ldaps://localhost', 636);

如果这不起作用,请尝试关闭 SSL 以查看是否有效:

ssh -L 389:localhost:389 hfaua@phoenix.lo5.bielsko.plldap_connect('localhost', 389);

【讨论】:

两种解决方案都不起作用。我认为,它不应该是 ssh 命令中的 localhost,因为 phoenix 不是通过 'localhost' 而是通过 'auth.lo5' 可以访问 LDAP 服务器。 'localhost' 指向凤凰。也许我必须向我的客户端或服务器 ssh-configs 放一些东西?

以上是关于PHP 通过 SSH 隧道连接到其他网络中的 LDAP的主要内容,如果未能解决你的问题,请参考以下文章

通过 JSch 建立 SSH 隧道

无法通过 python 中的 ssh 隧道连接到远程数据库

通过 SSH 隧道连接到 .Net Core 中的 AWS DocumentDb

使用隧道 ssh 通过 nodeJS 中的 mongoose 通过 ssh 连接到远程服务器 mongoDB

eclipse RSE 可以连接到本地端口(ssh 隧道)吗?

通过 SSH 隧道连接到 Elasticsearch