【nginx】nginx通过配置文件阻止海外ip访问

本文首发于 ❄️慕雪的寒舍

nginx通过配置文件阻止海外ip访问

说明

因为最近发现有不少刷评论的脚本,在nginx请求日志里面看了眼,都是海外的ip,反正我的博客也是全中文。所以干脆把海外ip禁止artalk评论。

/etc/nginx/nginx.conf中可以看到默认的日志路径,在里面能找到每一个转发的请求和其源IP。其中artak新增评论的请求是/api/add路径

access_log  /var/log/nginx/access.log  main;

考虑到添加海外ip屏蔽可能会阻止一些真的在国外的朋友,如果你在阅读本站博客时,遇到相关问题无法直接评论与我交流,可以移步github随便找个我的仓库开个issue提问!

解决

APNIC介绍

后文出现的网站是来自APNIC (Asia Pacific Network Information Center),其是IP地址管理机构之一,负责亚洲、太平洋地区。

APNIC提供了每日更新的亚太地区IPv4,IPv6,AS号分配的信息表:
http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
该文件的格式与具体内容参见:
http://ftp.apnic.net/pub/apnic/stats/apnic/README.TXT

脚本获取ip

初步解决方法参考:https://www.cnblogs.com/guoyabin/p/14263732.html

原博主提供的脚本如下,可以下载所有海外ip列表并生成一个nginx配置,写入/etc/nginx/blackip.conf

sh 复制代码
#!/bin/bash
rm -f legacy-apnic-latest black_`date +%F`.conf && wget http://ftp.apnic.net/apnic/stats/apnic/legacy-apnic-latest

awk -F '|' '{if(NR>2)printf("%s %s/%d%s\n","deny",$4,24,";")}' legacy-apnic-latest > black_`date +%F`.conf && \
rm -f /etc/nginx/blackip.conf && \
ln -s $PWD/black_`date +%F`.conf /etc/nginx/blackip.conf

脚本执行后的效果如下

[root@bt-7274:/etc/nginx]# ll
total 88
lrwxrwxrwx 1 root root   34 Dec  9 16:03 blackip.conf -> /root/docker/black_2023-12-09.conf

文件内容如下

[root@bt-7274:/etc/nginx/conf.d]# cat ../blackip.conf
deny 128.134.0.0/24;
deny 128.184.0.0/24;
deny 128.250.0.0/24;
deny 129.60.0.0/24;
deny 129.78.0.0/24;
...后面的省略了

nginx屏蔽海外ip

参考原博主的做法,你可以将这个blackip.conf/etc/nginx/nginx.conf中的http模块里面include,这样会阻止当前服务器所有反代的海外的请求。

nginx 复制代码
include /etc/nginx/blackip.conf;

还可以在单个配置文件的location里面引用

nginx 复制代码
    location / {
        proxy_redirect off; # artalk的nginx配置中必须有这个
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header Upgrade-Insecure-Requests 1;
        proxy_set_header X-Forwarded-Proto https;

        include /etc/nginx/blackip.conf; # 引用配置

        proxy_pass http://127.0.0.1:14722;
  }

修改后重启nginx,没有报错就是ok了

bash 复制代码
systemctl restart nginx

用海外的服务器试试能不能请求artalk,用artk.musnow.top/sidebar/...这个管理员登录页面来进行测试。

国内服务器请求结果如下,和浏览器打开的结果基本是一样(管理员登录界面)

[root@bt-7274:/etc/nginx/conf.d]# curl https://artk.musnow.top/sidebar/#/login
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Artalk Sidebar</title>
    <script type="module" crossorigin src="./assets/index-5a0b3a93.js"></script>
    <link rel="stylesheet" href="./assets/index-84fdcf98.css">
  </head>
  <body>
    <div id="app"></div>

  </body>
</html>

海外服务器请求结果也是上面这样......然后发现是因为我的海外服务器ip压根不在那个black的deny列表里面

尝试把ip的网段给加进去,重启nginx再试试。完美处理!添加前能正常请求到,添加后就变成403了

[root@RainYun-8aNbbsmA:~]# curl https://artk.musnow.top/sidebar/#/login
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Artalk Sidebar</title>
    <script type="module" crossorigin src="./assets/index-5a0b3a93.js"></script>
    <link rel="stylesheet" href="./assets/index-84fdcf98.css">
  </head>
  <body>
    <div id="app"></div>

  </body>
</html>
[root@RainYun-8aNbbsmA:~]#
[root@RainYun-8aNbbsmA:~]# curl https://artk.musnow.top/sidebar/#/login
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@RainYun-8aNbbsmA:~]#

nginx屏蔽非国内ip

我前文提到了我的海外服务器的ip不在这个deny的ip列表里面,没有被屏蔽。

考虑到网上搜不到legacy-apnic-latest文件存放的是什么ip的信息,我决定换一个思路:allow国内的ip,拒绝所有非国内的ip

获取国内ip列表 https://www.cnblogs.com/sentangle/p/13201770.html

下面这个url里面的ip地址标明了地区,我们只需要将其提取出来即可

http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest

这个文件里面的内容结构如下

等级机构|获得该IP段的国家/组织|资源类型|起始IP|IP段长度|分配日期|分配状态

我们只需要提取CN的所有IP,然后允许他们,再deny all阻止其他ip就可以了

sh 复制代码
#!/bin/bash
rm -f delegated-apnic-latest blackcn_`date +%F`.conf && wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest

awk -F\| '/CN\|ipv4/ { printf("%s %s/%d%s\n","allow",$4, 32-log($5)/log(2), ";") }' delegated-apnic-latest > blackcn_`date +%F`.conf && \
rm -f /etc/nginx/blackcn.conf && \
ln -s $PWD/blackcn_`date +%F`.conf /etc/nginx/blackcn.conf

执行这个脚本后,会生成/etc/nginx/blackcn.conf文件

[root@bt-7274:/etc/nginx]# ll
total 88
lrwxrwxrwx 1 root root   42 Dec  9 16:54 blackcn.conf -> /root/docker/nginx/blackcn_2023-12-09.conf
lrwxrwxrwx 1 root root   40 Dec  9 16:56 blackip.conf -> /root/docker/nginx/black_2023-12-09.conf

内容如下

allow 223.248.0.0/14;
allow 223.252.128.0/17;
allow 223.254.0.0/16;
allow 223.255.0.0/17;
allow 223.255.236.0/22;
allow 223.255.252.0/23;
....

还是修改nginx单个站点配置文件的location中的内容

nginx 复制代码
    location / {
        proxy_redirect off;
    	proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header Upgrade-Insecure-Requests 1;
        proxy_set_header X-Forwarded-Proto https;
		# 允许所有国内ip
    	include /etc/nginx/blackcn.conf;
    	deny all; # 阻止其他ip

    	proxy_pass http://127.0.0.1:14722;
        }

先来试试不修改配置文件(不做任何deny和allow操作的情况下)海外ip请求结果

[root@RainYun-8aNbbsmA:~]# curl https://artk.musnow.top/sidebar/#/login
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Artalk Sidebar</title>
    <script type="module" crossorigin src="./assets/index-5a0b3a93.js"></script>
    <link rel="stylesheet" href="./assets/index-84fdcf98.css">
  </head>
  <body>
    <div id="app"></div>

  </body>
</html>

符合预期,正常请求出了登录页面的html文件。

添加如上修改后,重启nginx,再次进行测试。这一次已经403阻止了,完美!

[root@RainYun-8aNbbsmA:~]# curl https://artk.musnow.top/sidebar/#/login
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

The end

你可以写个crontab让其定时执行脚本并重启nginx,我个人还是选择人工处理了(什么时候想起来就去更新一下ip列表)

感谢本文中出现的博客的博主。没有他们的帮助,我无法编写出shell脚本。

相关推荐
勤奋的凯尔森同学1 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
技术小齐5 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
ITPUB-微风5 小时前
Service Mesh在爱奇艺的落地实践:架构、运维与扩展
运维·架构·service_mesh
落幕6 小时前
C语言-进程
linux·运维·服务器
chenbin5206 小时前
Jenkins 自动构建Job
运维·jenkins
java 凯6 小时前
Jenkins插件管理切换国内源地址
运维·jenkins
AI服务老曹6 小时前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频
sszdzq8 小时前
Docker
运维·docker·容器
book01218 小时前
MySql数据库运维学习笔记
运维·数据库·mysql
bugtraq20219 小时前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu