屏蔽国外IP访问的几种常用方法

一、背景

网站的客户和受众人群都是国内的,不想让国外访问;或者站长监测到国外肉鸡一直有扫描或攻击。这时就需要对境外IP进行进行过滤和屏蔽;对IP进行过滤屏蔽一般有两种方法:加白和加黑。

加白就是把允许访问的添加入白名单中,没在白名单中的都进行屏蔽过滤,不允许访问;加黑就是把不允许访问的加入到黑名单中,没在黑名单中的完全放开,都可以进行访问。接下来介绍下屏蔽国外IP访问的几种常见方法。

黑名单:

要屏蔽的目标数量远远小于允许访问的数量时,就选择黑名单。只需要把需要屏蔽的加入黑名单中,其他完全放开就可以了。

白名单:

允许访问的目标数量远远小于要屏蔽的数量时就选择白名单。

二、使用Web应用防火墙或云防火墙

代码语言:javascript
复制
说明:此方法需要单独购买Web应用防火墙或云防火墙产品。

2.1 Web应用防火墙

2.1.1 方法一:全球地域封禁功能

登录 登录 - 腾讯云,在左侧导航栏,选择配置中心-基础安全-访问控制,进入基础安全页面,设置并开启“地域封禁”功能。

此时您选择封禁的地区,将无法访问您的网站。本文将国外全部地区列入封禁地域后,以境外 IP 地址访问防护网站,Web 应用防火墙会提示您已被腾讯云 Web 应用防火墙拦截。

2.1.2 方法二:配置黑白名单

腾讯云 Web 应用防火墙的黑白名单功能,指的是对经过 Web 应用防火墙防护域名的访问源 IP 进行黑白名单设置,以及对多个 HTTP 特征进行精准白名单设置,主要功能包括: IP 黑白名单设置、精准白名单和规则白名单设置

详见:Web 应用防火墙 功能简介-操作指南-文档中心-腾讯云

2.2 云防火墙

2.2.1 配置访问控制规则

此处以“访问控制”下「互联网边界规则」为例说明,更多访问控制规则参见官网:云防火墙 互联网边界规则-操作指南-文档中心-腾讯云

登录 登录 - 腾讯云,在左侧导航栏中,选择访问控制 -互联网边界规则-入站规则

在“添加入站规则”的弹窗中,可进行规则的配置。访问源类型可选 IP 地址、地理位置、云厂商和 云防火墙 地址模板-操作指南-文档中心-腾讯云

说明:仅企业版和旗舰版云防火墙支持“地理位置”功能,如需使用该功能,可以升级为「企业版」或「旗舰版」云防火墙。

三、宝塔Nginx防火墙 禁止海外访问

代码语言:javascript
复制
说明:
1.安装配置简单,易操作
2.宝塔在实际商务中应用的安全性,缺乏官方权威验证,可自测使用

3.1 安装宝塔面板

1、需要在linux系统中安装好宝塔面板,可参考以下文档进行安装宝塔:https://cloud.tencent.com/developer/article/1884579

2、在宝塔中安装好LNMP,安装好Nginx(注:网站搭建的底层架构是Nginx)

为方便介绍,本例以腾讯云轻量应用服务器(LH)为例,一般新购LH后,默认是安装了宝塔面板,即可配置使用。

3.2 登录宝塔面板

1. 确认宝塔应用已安装

2. 防火墙放行面板端口并初始化登录账号密码

3.登录宝塔面板网址

3.3 宝塔中安装Nginx免费防火墙

3.4 配置防火墙(禁止海外访问)

打开防火墙的设置-全局设置-禁止海外访问,禁止中国大陆以外的地区访问站点;开启这个功能就可以了,这是通过IP段来屏蔽或者是放行的,所以也有可能存在IP段更新同步不及时以及误判等情况,请知晓。

说明:可通过「同步」操作更新国内IP段,同时也可以在「设置」里添加遗漏的国内IP段。

四、 域名解析方式

代码语言:javascript
复制
优点:非常简单
缺点:只能禁止通过域名方法的方式,不能禁止通过IP访问的方式

方法:设置域名拒绝IP直接访问。域名解析记录值的境外设置可以填写127.0.0.1或一个内网IP地址,国内可以填写正常的IP的地址来解析,而国外IP访问域名的时候,由于解析的是一个内网地址,是无法正常访问的。

举例:以腾讯云DNS解析为例:

设置A记录类型

解析线路:境外

记录值:127.0.0.1

验证:设置后等30分钟后我们再用ping拨测下境外解析,就会发现所有的海外线路都会解析至127.0.0.1这个IP上。

五、 云安全组或系统软防火墙规则

5.1 云安全组

代码语言:javascript
复制
说明:云安全组可用来允许或拒绝某些流量,但无法从地理位置维度屏蔽国外IP。

一个安全组规则上限是200条(入规则100条,出规则100条),国内IP段有8674+,通过屏蔽国内所有IP段方式不太适合(甚至一个云资源关联多个安全组也不适合);因此建议在安全组中设置允许已知的IP地址登录:在安全组规则中,只添加允许已知的国内IP地址,其他IP地址拒绝访问。

5.2 系统软防火墙

黑名单屏蔽:首先需要得到国家IP段,下载地址(这里以china为例):http://www.ipdeny.com/ipblocks/data/countries/cn.zone

其他国家参见:IPdeny IP country CIDR blocks

这里以iptables中的ipset为例,其他类型的软防火墙一个处理逻辑。ipset是iptables的扩展,它允许你创建匹配整个IP地址集合的规则,可以快速的让我们屏蔽某个IP段。

5.2.1 安装ipset

#CentOS系统

yum -y install ipset

#Debian/Ubuntu系统

apt-get -y install ipset

5.2.2 创建规则

#CentOS系统

#创建一个名为cnip的规则

ipset -N cnip hash:net

#下载国家IP段

wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

#将IP段添加到cnip规则中

for i in $(cat /root/cn.zone ); do ipset -A cnip $i; done

#查看ipset list

ipset -L

#清空ipset list

ipset destroy cnip

5.2.3 设定屏蔽或解除屏蔽

#设定仅允许国内IP访问

iptables -I INPUT -m set --match-set cnip src -j ACCEPT

说明:如果仅禁止tcp协议,则添加参数-p tcp

#把 INPUT 规则链的默认策略设置为拒绝

(提醒:务必提前确认允许IP在cnip的IP段中,否则执行以下命令将会导致被禁用,请谨慎操作。出现异常可通过VNC登录调整规则)

iptables -P INPUT DROP

#-D为删除规则

iptables -D INPUT -m set --match-set cnip src -j ACCEPT

#查看封禁列表

iptables -L | grep match-set

六、Nginx安装geoip2模块

代码语言:javascript
复制
说明:此方法来自网络,geoip2模块受ip地址数据库影响,也有可能存在信息同步不及时以及误判等情况,仅参考使用

6.1 下载nginx

安装 ngx_http_geoip2 模块至少需要nginx 1.18 版本及以上:

#wget http://nginx.org/download/nginx-1.18.0.tar.gz

6.2 下载ngx_http_geoip2_module模块

#git clone https://github.com/leev/ngx_http_geoip2_module.git

#mv ngx_http_geoip2_module /usr/local

6.3 编译安装

[root@ddkk tmp]# tar -xf nginx-1.18.0.tar.gz

[root@ddkk tmp]# cd nginx-1.18.0/

[root@ddkk nginx-1.18.0]# ./configure --with-http_stub_status_module \

--prefix=/usr/local/nginx \

--user=nginx --group=nginx --with-http_ssl_module --with-stream \

--add-module=/usr/local/ngx_http_geoip2_module #具体编译模块按实际情况

[root@ddkk nginx-1.18.0]# make

[root@ddkk nginx-1.18.0]# pkill nginx #杀死nginx

[root@ddkk nginx-1.18.0]# /usr/local/nginx/sbin/nginx #再次启动Nginx

6.4 查看nginx版本

# /usr/local/nginx/sbin/nginx -V

6.5 下载最新的IP地址数据库文件

6.5.1 模块安装成功后,还要在 Nginx 里指定数据库,在安装运行库时默认安装了两个,位于 /usr/share/GeoIP/ 目录下,一个只有 IPv4,一个包含 IPv4 和 IPv6:

登录www.maxmind.com 网址,创建账户 下载最新的库文件(账户创建就不演示了)

选择GeoLite2 Country ,点击 Download GZIP 下载即可

上传到 /usr/share/GeoIP/ 下并解压

6.5.2 配置nginx 配置文件,修改前先备份配置文件

代码语言:javascript
复制
# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf-bak
 # vim /usr/local/nginx/conf/nginx.conf
在http 中添加几行代码,定义数据库文件位置
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
auto_reload 5m;
$geoip2_data_country_code country iso_code;
}
  map $geoip2_data_country_code $allowed_country {
                default yes;
                CN no;
}

6.5.3 在server 中的 location 下添加条件,如果满足IP是国外IP就执行下面的return 动作,这里定义了3种, 注释了其中两个。

如:当访问IP 是国外IP ,直接返回404

代码语言:javascript
复制
if ($allowed_country = yes) {
       # return https://www.baidu.com;
       # return /home/japan;
        return 404;
          }

6.5.4 修改完毕后, 检测下配置文件,重新加载下 nginx

代码语言:javascript
复制
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload

6.6 测试验证

使用海外节点的服务器去访问网站,验证访问网站是否是配置的404 Not Found报错 。到此我们通过Nginx来实现禁止国外IP访问网站就结束了。