【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脚本。

相关推荐
Flying_Fish_roe2 分钟前
linux-软件包管理-包管理工具(Debian 系)
linux·运维·debian
BLEACH-heiqiyihu27 分钟前
红帽9中nginx-源码编译php
运维·nginx·php
666786661 小时前
Mysql高级篇(中)—— SQL优化
linux·运维·服务器·数据库·sql·mysql
企业管理8MSaaS1 小时前
了解CRM销售自动化:类型、优势、策略和工具
运维·自动化
创小董2 小时前
智能机巢+无人机:自动化巡检技术详解
运维·自动化·无人机
henanxiaoman2 小时前
SaltStack自动化运维部署
运维·自动化·saltstack
这个需求建议不做2 小时前
vue3打包配置 vite、router、nginx配置
前端·nginx·vue
Run_Snails2 小时前
hcia-openEuler V1.0师资题库-试卷3
运维·服务器·网络
翔云API2 小时前
身份证识别接口的应用场景和作用
运维·服务器·开发语言·自动化·ocr
zhaowangji2 小时前
ubuntu虚拟机装载共享文件夹导致的诡异错误
linux·运维·ubuntu