我有一个PostgreSQL表,其中有一列(文本类型)“ip_port”。此列的值如下:
167.123.24.25:59874
这是IP:端口
我试着写一个查询,列出这些IP中的所有子网,以及每个子网中的IP数。在博士后有没有一种优雅的方式?
提前谢谢!
最佳答案
如果你只有IP地址的话,你不能在PostgreSQL或其他工具中这样做你还必须知道:
网络的广播地址;
网络子网掩码或掩码前缀长度;或
正在使用基于预CIDR类的地址分配
假设一个给定的IP实际上是多个规模不断扩大的网络的成员。对于基于局域网以太网的IP网络来说,有一个由子网掩码定义的广播域,但是也有一组越来越宽的用于该地址的路由聚合域,其中一些在公共Internet上可见,一些在内部网络中是私有的。“公共”和“私有”之间的界限可能很模糊;例如,在我的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
:根据whois对此地址块的顶层APNIC分配:可用的167.123.0.1 - 167.123.255.254
,网络掩码255.255.0.0
如果您traceroute
该地址,请考虑这些路由器中的任何一个可能(但也可能不是)是地址成为更窄、更特定子网的一部分的点。参见维基百科上的Classless inter-domain routing。
所有这些都是在考虑NAT(blech)和内部WAN路由之前。167.123.24.25可能是整个隐藏的NAD主机网络的路由器。这些主机从外部看不到,没有非常复杂的被动映射,只有在它们的路由路径上靠近它们的人才能做到这一点。
要了解有关地址网络的更多信息,您必须进行一些认真的调查,以找出哪些地址可能被视为广播地址。当然,大多数路由器都会从本地路由域之外对广播地址进行过滤,因此可能无法区分“主机不存在”、“广播地址”和“主机存在,但过滤我正在使用的探测包”。这样的调查很慢,而且也会让网络所有者对你发脾气。既然这个网络是美国公共工程部的,我建议他们不要发脾气。
关于postgresql - 在PostgreSQL上使用IP查询以获取子网,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15670772/