查询在PostgreSQL上使用IP获取子网

时间:2013-03-27 22:30:02

标签: postgresql networking

我有一个PostgreSQL表,其中包含一列(Text类型)' ip_port'。此列的值如下:

167.123.24.25:59874

这是IP:端口

我正在尝试编写一个查询来列出这些IP中的所有子网以及每个子网中的IP数量。在Postgres有一种优雅的方式吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您拥有的唯一信息是IP地址,则无法在PostgreSQL或任何其他工具中执行此操作。你还必须知道:

  • 网络的广播地址;
  • 网络子网掩码或掩码前缀长度;或
  • 正在使用基于CIDR类的地址分配

考虑到给定的IP实际上是多个不断增加的网络的成员。出于局域基于以太网的IP网络的目的,存在由子网掩码定义的广播域,但是也存在针对该地址的嵌套的越来越广泛的路由聚合域,其中一些是可见的在公共互联网上,其中一些是内部网络私有的。 “公共”和“私人”之间的界限可能模糊不清;例如,在我的ISP网络中,他们的大型网络块被拆分成较小的块,这些块从外部世界看不到,但ISP的客户可以看到。

例如,根据sipcalc工具的一些快速计算,167.123.24.25的非详尽网络列表可能是:

  • 167.123.24.25/32(主持人自己)
  • 167.123.24.25/28 :(常见的ISP分配):可用167.123.24.17 - 167.123.24.30,网络掩码255.255.255.240
  • 167.123.24.25/24 :(常见的LAN子网大小):可用167.123.24.1 - 167.123.24.254,网络掩码255.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:此地址块的顶级APNIC分配根据whois):可用167.123.0.1 - 167.123.255.254,网络掩码255.255.0.0

如果你traceroute那个地址,请考虑任何这些路由器可能(但也可能不是)地址成为更窄,更具体的子网的一部分。请参阅维基百科上的Classless inter-domain routing

在您考虑NAT(blech)和内部WAN路由之前的所有内容。 167.123.24.25可能是整个NAT主机隐藏网络的路由器。这些主机在外部是不可见的,没有非常复杂的被动映射,只有在路由路径上靠近它们的人才能这样做。

要了解有关地址网络的更多信息,您必须进行一些严肃的探索,以找出哪些地址可能被视为广播地址。当然,大多数路由器将从本地路由域外部过滤发往广播地址的数据包,因此您可能无法区分“主机不存在”,“是广播地址”和“主机存在但过滤器”之间的区别我用来探测的数据包“。这样的探测很慢,而且它也会让网络所有者对你感到脾气暴躁。由于这个网络由美国公共工程部拥有,我建议不要让它们变得脾气暴躁。