问题说明

前几天,我给我的artalk上了IP屏蔽,只放行国内IP,不允许任何国外的IP地址评论。

【Nginx】nginx通过配置文件阻止海外ip访问 | 慕雪的寒舍

然后就发现了一个问题,我使用的uptimerobot这个在线状态监控程序是国外的,它的请求自然也是通过海外IP发起的,此时就会被我服务器的nginx拦截,导致403,uptimerobot认为403也是无法访问,service down了。

image.png

解决

之前通过折腾,已经知道了如何使用nginx的配置文件来allow或者deny一系列ip地址,那么uptimerobot的这个问题也很好解决:只要我们知道uptimerobbot的请求来源ip,那么将其写入一个如下类似的nginx配置文件,再在具体的location中include,放行对应ip地址即可。

1
2
allow uptime-robot-ip1;
allow uptime-robot-ip2;

我在uptimerobot的官网找到了它们的ip地址列表:Locations and IPs | UptimeRobot

txt文件也有的:

用如下脚本来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
rm -f IPv4.txt black_uptime_`date +%F`.conf
wget https://uptimerobot.com/inc/files/ips/IPv4.txt
# 删除原有文件每一行的回车符号
sed -i 's/\r//g' IPv4.txt

while IFS= read -r line
do
echo "allow $line;" >> black_uptime_`date +%F`.conf
done < IPv4.txt

rm -f /etc/nginx/black_uptime.conf && \
ln -s $PWD/black_uptime_`date +%F`.conf /etc/nginx/black_uptime.conf

将其写入一个uptimerobot.sh文件,使用如下命令执行它

1
sh uptimerobot.sh

这个脚本会在当前目录里面下载uptimerobot的这个IPv4.txt,并以nginx的形式写为allow,最后在/etc/nginx里面创建一个软连接 /etc/nginx/black_uptime.conf 文件,文件内容如下

1
2
3
allow 18.116.158.121;
allow 18.223.50.16;
allow 54.241.175.147;

随后我们进入nginx的配置文件,在对应站点配置文件的location里面,include这个配置文件就可以了

1
2
3
4
5
location / {
# 允许uptimerobot的请求
include /etc/nginx/black_uptime.conf;
deny all; # 拒绝其他所有请求
}

添加之后,重启nginx,配置就生效啦

1
systemctl restart nginx

如下图,uptimerobot已经可以正常请求和监看我的artalk评论页面了

image.png

使用类似的思路,你可以通过nginx实现让你的站点只允许CDN服务商的IP回源,禁止直接访问。