很多国内网站实际上并没有国外用户,如果用户群体主要是国内用户,如何在防火墙上设置IP策略阻止国外用户访问网站?
这里的难点是如何定义一个IP是属于国内还是国外。我们不可能对每个IP去查询它的归属地。实际上所有IP都是由五大管理机构进行分配的,我们可以从他们发布的分配信息中去查询一个IP段是属于哪个国家的。IP地址段的分配详情可以在以下文件中查看:
http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
将其下载下来后可以对文件内容进行处理,内容摘要如下:
apnic|AU|ipv4|1.0.0.0|256|20110811|assignedapnic|CN|ipv4|1.0.1.0|256|20110414|allocatedapnic|CN|ipv4|1.0.2.0|512|20110414|allocatedapnic|AU|ipv4|1.0.4.0|1024|20110412|allocatedapnic|CN|ipv4|1.0.8.0|2048|20110412|allocated
其中第2列是国家代码,第4列是IP地址的网段,第6列是这个段的IP地址数量。我们可以对内容进行处理,保留或去掉国内地址,从而得到国外地址。处理代码如下:
#!python3import reimport mathpattern_ip = re.compile(r'.*ipv4.*((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)).*')f = open('delegated-apnic-latest')# apnic|CN|ipv4|1.0.8.0|2048|20110412|allocatedline = f.readline()while line:ip = lineline = f.readline()match = pattern_ip.search(ip)if not match:continues = ip.split('|')mask = 32 - int(math.log(int(s[4]),2))if s[1] == 'CN':continue# print("%s %s/%d" % (s[1],s[3],mask))print("%s/%d" % (s[3],mask))f.close()
处理后的IP信息如下:
$ python3 ipproc.py1.0.0.0/241.0.4.0/221.0.16.0/201.0.64.0/181.0.128.0/171.1.1.0/241.1.64.0/181.1.128.0/17
这里的格式是网段加掩码的格式,如果想得到IP地址段范围的格式可以使用工具cidr-merger进行IP地址的合并或扩展,cidr-merger工具下载地址如下,有linux或windows版:
https://github.com/zhanhb/cidr-merger/releases/tag/v1.1.3
工具使用方法为:
$ head -5 iplist.log1.0.0.0/241.0.4.0/221.0.16.0/201.0.64.0/181.0.128.0/17$ ./cidr-merger -r iplist.log1.0.0.0-1.0.0.2551.0.4.0-1.0.7.2551.0.16.0-1.0.31.2551.0.64.0-1.0.255.2551.1.1.0-1.1.1.255
将处理过的IP段写入防火墙规则即可阻止国外IP访问。
文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




