我尝试使用
从HttpServletRequest对象获取公共IP地址httpServletRequest.getRemoteAddress();
返回简单的公共IP地址,例如 123.21.21.12 但我需要的是 132.21.21.12/8 。
我已经检查了这个How to get client's IP address using javascript only?,但所有这些都提供了简单的IP地址而不是CIDR位。
谢谢。
答案 0 :(得分:0)
正如其他人在您的问题的评论中所述,没有办法仅从IP地址中提取子网掩码信息,并且没有可靠的方法从服务器获取此信息。首先,您正在使用单个IP地址而不是整个子网进行通信,因此正如其他人所说,正确的CIDR是/ 32。其次,网络掩码是网络层信息,IP路由的工作方式不需要提供除目的IP地址之外的任何其他信息。
重要的是要知道究竟要完成什么并且正在使用这些信息。您是否只需要满足某些格式要求或者您真的需要子网掩码。无论如何,如果我们谈论普通的Web客户端/服务器,我可以看到两种不同的场景:
即使您能够以编程方式获取此类数据,我也不确定它会有多大用处。由于IPv4地址不足以及ISP向客户分配地址的方式,大多数客户端都在其家庭路由器后面,后者执行NAT或在某些情况下支持运营商级NAT。拥有相同的192.168.1.2/24地址的客户群将是毫无意义的。
这意味着获取公共IP地址(使用httpServletRequest.getRemoteAddress();
获得的IP地址)。无法以100%的准确度获取确切的子网,但您可以从委派IP所属范围的RIR(地区Internet注册表)数据库中获取路由对象。 LIR(获得地址块的组织)有义务使用各种信息更新此数据库,其中一个是创建这些路径对象。为此,您可以使用Whois protocol,这非常简单且易于实现。基本上你只需要打开到端口43的TCP连接,发送一个包含你需要信息的IP地址的命令并解析输出。
对于您的示例(123.21.21.12),路径对象如下所示:
~ # whois -T route 123.21.21.12
% [whois.apnic.net]
% Whois data copyright terms http://www.apnic.net/db/dbcopyright.html
% Information related to '123.21.16.0/20AS45899'
route: 123.21.16.0/20
descr: VietNam Post and Telecom Corporation (VNPT)
descr: VNPT-AS-AP
country: VN
origin: AS45899
remarks: mailto: noc@vnn.vn
notify: hm-changed@vnnic.net.vn
mnt-by: MAINT-VN-VNPT
changed: hm-changed@vnnic.net.vn 20100810
source: APNIC
% This query was served by the APNIC Whois Service version 1.69.1-APNICv1r0 (UNDEFINED)
我们可以看到该IP地址属于AS45899(VNPT),路由对象是123.21.16.0/20,它为您提供了所需的CIDR。
如果我们从具有完整BGP表的路由器查询该IP地址:
# show bgp ipv4 unicast 123.21.21.12
BGP routing table entry for 123.21.16.0/20, version 71369881
Paths: (3 available, best #1, table default)
我们确实看到Whois数据库确实已更新且IP属于123.21.16.0/20路由。
请记住,这/ 20可能是聚合路线,但这是你能得到的最好的。这是全球可用的路由信息,并被世界各地的路由器用于路由流量。如何在ISP网络中使用/ 20前缀取决于其内部组织和策略,您无法检查。您也不应该以这种方式获得小于/ 24的路线。