我有一个 PostgreSQL 表,其中有一列(文本类型)'ip_port'。此列的值如下:
167.123.24.25:59874
这是IP:端口
我正在尝试编写一个查询来列出这些 IP 中的所有子网以及每个子网中的 IP 计数。在 Postgres 中有一种优雅的方法吗?
提前致谢!
我有一个 PostgreSQL 表,其中有一列(文本类型)'ip_port'。此列的值如下:
167.123.24.25:59874
这是IP:端口
我正在尝试编写一个查询来列出这些 IP 中的所有子网以及每个子网中的 IP 计数。在 Postgres 中有一种优雅的方法吗?
提前致谢!
如果您拥有的唯一信息是 IP 地址,则您无法在 PostgreSQL 或任何其他工具中执行此操作。您还必须知道:
考虑一个给定的 IP 实际上是多个不断增加的网络的成员。对于本地基于以太网的 IP 网络,有一个由子网掩码定义的广播域,但也有一组嵌套的越来越广泛的路由聚合域,其中一些在公共 Internet 上可见,而另一些在公共 Internet 上可见。它们是内部网络专用的。“公共”和“私人”之间的界限可能很模糊;例如,在我的 ISP 网络中,他们的大型网络块被分成更小的块,这些块从外部世界看不到,但对 ISP 的客户可见。
例如,根据使用该sipcalc
工具的一些快速计算,167.123.24.25 的网络的非详尽列表可能是:
167.123.24.25/32
(主机本身)167.123.24.25/28
: (一个常见的 ISP 分配): usable 167.123.24.17 - 167.123.24.30
, netmask255.255.255.240
167.123.24.25/24
: (一个常见的 LAN 子网大小): usable 167.123.24.1 - 167.123.24.254
, netmask255.255.255.0
167.123.24.25/20
:(中级路由聚合):可用167.123.16.1 - 167.123.31.254
,网络掩码255.255.240.0
167.123.24.25/16
: 根据 whois 对该地址块的顶层 APNIC 分配): usable 167.123.0.1 - 167.123.255.254
, netmask255.255.0.0
如果您traceroute
使用该地址,请考虑这些路由器中的任何一个可能(但也可能不是)成为该地址成为更窄、更具体子网的一部分的点。请参阅Wikipedia 上的无类域间路由。
这一切都在您考虑 NAT(blech)和内部 WAN 路由之前。167.123.24.25 可能是用于 NAT 主机的整个隐藏网络的路由器。这些主机从外部对您来说是不可见的,没有极其复杂的被动映射,只有沿着路由路径靠近它们的人才能做到这一点。
要了解有关地址网络的更多信息,您必须进行一些认真的探索,以找出哪些地址可能被视为广播地址。当然,大多数路由器都会过滤来自本地路由域之外的发往广播地址的数据包,因此您可能无法区分“主机不存在”、“是广播地址”和“主机存在但过滤器”之间的区别我用来探测的数据包”。这样的探测速度很慢,而且还会让网络所有者对你发脾气。由于这个网络归美国公共工程部所有,我建议不要让他们脾气暴躁。