获取与 Oracle 11 建立连接的 IP 地址

Posted

技术标签:

【中文标题】获取与 Oracle 11 建立连接的 IP 地址【英文标题】:Get IP addresses of established connections to Oracle 11 【发布时间】:2013-02-25 14:21:43 【问题描述】:

在开发过程中,我发现数据库有大量的活动连接:

SELECT username, COUNT(*) FROM v$session GROUP BY username;

为了找到谁真正保持连接,我想获取一个 IP 地址列表。

在一般的网络搜索和阅读official docs我构建查询:

SELECT username, seconds_in_wait, machine, port, terminal, program, module, service_name
  FROM v$session
  WHERE type = 'USER';

其中machineselect 最重要的部分。但不幸的是,machine 字段显示客户端操作系统已知的主机名

互联网上充满了使用UTL_INADDR.GET_HOST_ADDRESS 的建议,这不适用于我的情况。首先是因为 ORA-24247: network access denied by access control list (ACL) 其次是因为 客户端操作系统主机名 通常定义在 /etc/hostname 对我们内网的 DNS 服务器不可用...

检索到 Oracle DB 的打开会话 IP 的任何其他方式(数据库实例在任何情况下都保存有关其套接字的信息...)。

更新

我在受信任的 Intranet 下,但网络层次结构未知。

我试图找出哪些应用程序使用了我的表(几个应用程序服务器,我不知道所有这些)。其中一些过度使用连接,需要修复。但首先应该确定它们......

【问题讨论】:

您可以查询sys_context('USERENV', 'IP_ADDRESS'),但只能在用户的会话中进行 - 所以我认为这对您尝试做的事情没有帮助,除非您能够添加记录会话的登录触发器包含该值的信息到您自己的审计表中? 嗯...我希望Oracle有一些易于查询的内置解决方案... 获取 ACL 的权限有什么问题? 目前我发现这篇关于审计到 Oracle DB 的博客文章:aprakash.wordpress.com/2009/11/06/auditing-ip 似乎我无权在 DB 上做这样的事情...... 这不是关于审计,而是关于一般的安全性(网络访问)。请您的 dbas 为您设置,或者可能已经存在具有此功能的用户。这里有一篇好文章:oracle-base.com/articles/11g/… 【参考方案1】:

请记住,Oracle 会话不需要知道,当然也不需要信任您来自的客户端名称/IP 地址;它位于网络传输层之上,并不关心您是通过 TCP/IP 还是其他方式连接。 (我什至不确定侦听器是否必须传递信息,或者它是否有效地传递现成的套接字)。如您所见,machine 正是客户端声明的内容,如programv$session 视图中的其他字段;它可能与 DNS 或您的服务器的 /etc/hosts 可以解析的任何内容没有任何相似之处,尤其是当客户端是 Windows 机器时。

您可以做的是,在 Unix/Linux 级别(因为您指的是 /etc/hosts,我假设您不在 Windows 上),查找 port 并查看显示的地址;例如v$session 将我的port 显示为50527,所以如果我这样做netstat -an | grep 50527 我明白了:

tcp  0  0  192.168.1.1:1521  192.168.1.23:50527  ESTABLISHED

所以我可以看到我是从 192.168.1.23 连接的。如果您在服务器上运行 SQL*Plus,您可以使用host 命令来完成此操作,但这仍然有点不方便。如果您需要定期执行此操作,并且无法选择添加登录触发器以将其捕获到审计表中,并且您确实必须从数据库中执行此操作,您可能可以编写一个 Java 存储过程来执行查找那个端口给你。但是编写一个 shell 脚本从 v$session 查询 port 数字并以这种方式进行查找可能更容易。

【讨论】:

我是否正确理解您建议在 Oracle 服务器上运行netstat?我只是无法访问它(当我向 DBA 请求这样的许可时,他会被嘲笑......)。感谢您对我的问题感兴趣! +1 @gavenkoa - 是的,在服务器上;我认为您也没有在服务器上运行 SQL*Plus。您可能能够获得在数据库中运行 Java 以获取该信息的权限,但也许不能。我不确定我是否了解您的最终目标是什么,为什么实时连接的数量很重要,或者您将如何处理这些 IP。也许 DBA 可以监控这一点(如果您提供脚本!?)并向您发送您需要的输出,尤其是在一次性调查的情况下? @AlexPloole 我试图找到导致连接泄漏的服务器。似乎是 DBA 的工作,不是我的。再次感谢您的解释!【参考方案2】:

感谢大家深入研究我的问题(这仍然是通用目的,不完全是我的!!)。

简短回答:您无法从 Oracle 系统表中获取真实 IP。

对于此任务,您可以使用通用实用程序,例如 netstatlsof -p <pid-of-oracle>,但只能在服务器端

一些帮助可以来自v$session.port values...

帮助者的一个好建议 - 使用来自 DB 客户的好名字。它们填充到v$session 表行:

machine, terminal, program, module, service_name

这样他们就可以帮助识别客户......

【讨论】:

【参考方案3】:

传入连接的 IP 地址通常可以在您的侦听器日志中找到。这就是我在需要时跟踪此类信息的方式。

【讨论】:

感谢您的信息!但我是普通开发人员,没有 ssh 访问服务器((,无论如何 +1!【参考方案4】:

我从 2001 年 AFAIK 不存在登录触发器时就找到了我的审核脚本。它解析 SYS.AUD$ 的 COMMENT$TEXT 列,其中 ACTION#=100 以获取客户端的 IP 地址。该列仍然包含 Authenticated by: DATABASE;客户端地址:(ADDRESS=(PROTOCOL=tcp)(HOST=a.a.a.a)(PORT=p)) 在我们的环境中。

【讨论】:

以上是关于获取与 Oracle 11 建立连接的 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

Delphi中如何用IP地址的方式来连接Oracle数据库?

oracle无法通过ip地址连接

查看与本机建立连接的IP地址?

获取与网络连接的 IP 地址的当前用户名

ExoPlayer 无法与摄像机 IP 地址建立连接

本地oracle可以通过localhost连接,无法通过ip地址连接解决方法,oracle远程连接配置