一、背景
网站的客户和受众人群都是国内的,不想让国外访问;或者站长监测到国外肉鸡一直有扫描或攻击。这时就需要对境外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访问网站就结束了。