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 才能进行查询
【讨论】:
当然phoenix
和auth
是不同的机器,我们使用我们的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.pl
和
ldap_connect('ldaps://localhost', 636);
如果这不起作用,请尝试关闭 SSL 以查看是否有效:
ssh -L 389:localhost:389 hfaua@phoenix.lo5.bielsko.pl
和
ldap_connect('localhost', 389);
【讨论】:
两种解决方案都不起作用。我认为,它不应该是 ssh 命令中的 localhost,因为 phoenix 不是通过 'localhost' 而是通过 'auth.lo5' 可以访问 LDAP 服务器。 'localhost' 指向凤凰。也许我必须向我的客户端或服务器 ssh-configs 放一些东西?以上是关于PHP 通过 SSH 隧道连接到其他网络中的 LDAP的主要内容,如果未能解决你的问题,请参考以下文章
通过 SSH 隧道连接到 .Net Core 中的 AWS DocumentDb
使用隧道 ssh 通过 nodeJS 中的 mongoose 通过 ssh 连接到远程服务器 mongoDB