免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7606 | 回复: 11
打印 上一主题 下一主题

请教大神,如何判断客户端IP是否属于内网IP范围 [复制链接]

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-07 09:20 |只看该作者 |倒序浏览
30可用积分
请教各位大神,如何用PERL 判断访问的客户端IP是否属于某个范围?比如说有个内网IP范围如下:

netip.txt

219.111.192.0/18
68.132.0.0/17
61.135.0.0/16
192.162.0.0/16
152.172.0.0/16
34.132.0.0/14
97.208.0.0/13

我以前是用字符串比较来做的,个把段还可以,一多就费心费力,还没有效率。。。。。。

求给点代码,谢谢啊,好人有好报。。。。。

最佳答案

查看完整内容

回复 1# flutter 你这个不是标准私有网段,10.X.X.X, 192.168.X.X, 172.16.X.X. 用这个模块不好解决考虑下将IP转成二进制,再进行比较。随便可以了解下IP与掩码的关系更容易理解。

论坛徽章:
2
技术图书徽章
日期:2013-10-30 14:37:252015年亚洲杯之伊朗
日期:2015-04-30 13:37:02
2 [报告]
发表于 2012-12-07 09:20 |只看该作者
本帖最后由 ajdan4q 于 2012-12-08 22:56 编辑

回复 1# flutter


    你这个不是标准私有网段,10.X.X.X, 192.168.X.X, 172.16.X.X. 用这个模块不好解决
  1. iptype 会返回 ’Public','Private', 'Reserved'等类型
复制代码
考虑下将IP转成二进制,再进行比较。随便可以了解下IP与掩码的关系更容易理解。
  1. 219.111.192.0/18 将IP前18位,跟这个网络的前18位比较,相等则为在这个网段
  2. 68.132.0.0/17 前17位比较
  3. 61.135.0.0/16 前16位比较
  4. 192.162.0.0/16 前16位比较
  5. 152.172.0.0/16 前16位比较
  6. 34.132.0.0/14 前14位比较
  7. 97.208.0.0/13 前13位比较
复制代码

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
3 [报告]
发表于 2012-12-07 09:24 |只看该作者
在网上查了不少资料,还是错误不断,无法解决。。。。

如何编程判断一个IP地址是否属于某个网段?
http://bbs.chinaunix.net/thread-376518-1-1.html

这个帖子和我同意,只是apile的代码有些看不懂。。。。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
4 [报告]
发表于 2012-12-07 09:30 |只看该作者
论坛 › 程序设计 › Shell › 如何判断一个IP地址是否属于某个网段

http://bbs.chinaunix.net/thread-1627253-1-1.html

这个帖子也是同意,不过他们是用SHELL的AWK解决。。。。。。不知道用perl如何解决。。

论坛徽章:
0
5 [报告]
发表于 2012-12-07 09:41 |只看该作者
Net::IP 可以帮你搞定

  1. use Net::IP;
  2.   
  3.   my $ip = new Net::IP ('193.0.1/24') or die (Net::IP::Error());
  4.   print ("IP  : ".$ip->ip()."\n");
  5.   print ("Type: ".$ip->iptype()."\n");
复制代码
iptype 会返回 ’Public','Private', 'Reserved'等类型

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
6 [报告]
发表于 2012-12-07 09:57 |只看该作者
谢谢 climby 的解答,我也查到这个net::ip 模块了。

只是,我用的是SOLARIS 10 的系统,貌似PERL5.8.4的Net目录下:

Cmd.pm         Config.pm      FTP            Hostname.eg    Netrc.pm       Ping.pm        Time.pm        hostent.pm     netent.pm      servent.pm
Config.eg      Domain.pm      FTP.pm         NNTP.pm        POP3.pm        SMTP.pm        demos          libnetFAQ.pod  protoent.pm

没有这个IP模块啊,奇怪。。。。。。

论坛徽章:
0
7 [报告]
发表于 2012-12-07 10:42 |只看该作者
回复 5# flutter

呵呵,模块都是自己可以手动安装的
你可以使用
  1. cpan  Net::IP
复制代码
命令进行安装

   

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
8 [报告]
发表于 2012-12-07 14:44 |只看该作者
再次谢谢 climby  的热情解答,在你的提示下,我已经安装了net;;ip模块,也能正常运行这个代码了。

最后问一下,那个iptype 会返回 ’Public','Private', 'Reserved'等类型,是拿什么地址?本机地址和范围'193.0.1/24'做比较吗?

论坛徽章:
0
9 [报告]
发表于 2012-12-08 16:53 |只看该作者
回复 7# flutter


    不需要比较,它能够判断给定ip的类型。例如你机器的ip 是m.m.m.m

  1.    my $ip = new Net::IP ('m.m.m.m') or die (Net::IP::Error());
  2.   print ("IP  : ".$ip->ip()."\n");
  3.   print ("Type: ".$ip->iptype()."\n");
复制代码
这样就输出你机器的ip 类型了。 上面代码中的'193.0.1/24'只是一个ip例子而已
给定一个IP, 就输出该ip的类型,为什么要比较后判断?

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
10 [报告]
发表于 2012-12-11 16:07 |只看该作者
非常感谢 ajdan4q  的解答,在你的提示下,貌似顺利解决,运行正常

送上一点点小分,以表谢意。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP