Nginx通過(guò)配置文件阻止海外ip訪問(wèn)的方法步驟
說(shuō)明
因?yàn)樽罱l(fā)現(xiàn)有不少刷 評(píng)論的腳本,在nginx請(qǐng)求日志里面看了眼,都是海外的ip,反正我的博客也是全中文。所以干脆把海外ip禁止artalk評(píng)論。
在/etc/nginx/nginx.conf中可以看到默認(rèn)的日志路徑,在里面能找到每一個(gè)轉(zhuǎn)發(fā)的請(qǐng)求和其源IP。其中artak新增評(píng)論的請(qǐng)求是/api/add路徑
access_log /var/log/nginx/access.log main;
解決
APNIC介紹
后文出現(xiàn)的網(wǎng)站是來(lái)自APNIC (Asia Pacific Network Information Center),其是IP地址管理機(jī)構(gòu)之一,負(fù)責(zé)亞洲、太平洋地區(qū)。
APNIC提供了每日更新的亞太地區(qū)IPv4,IPv6,AS號(hào)分配的信息表: http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest 該文件的格式與具體內(nèi)容參見(jiàn): http://ftp.apnic.net/pub/apnic/stats/apnic/README.TXT
腳本獲取ip
可以下載所有海外ip列表并生成一個(gè)nginx配置,寫(xiě)入/etc/nginx/blackip.conf中
#!/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
腳本執(zhí)行后的效果如下
[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
文件內(nèi)容如下
[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
你可以將這個(gè)blackip.conf在/etc/nginx/nginx.conf中的http模塊里面include,這樣會(huì)阻止當(dāng)前服務(wù)器所有反代的海外的請(qǐng)求。
include /etc/nginx/blackip.conf;
還可以在單個(gè)配置文件的location里面引用
location / {
proxy_redirect off; # artalk的nginx配置中必須有這個(gè)
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,沒(méi)有報(bào)錯(cuò)就是ok了
systemctl restart nginx
用海外的服務(wù)器試試能不能請(qǐng)求artalk,用Artalk這個(gè)管理員登錄頁(yè)面來(lái)進(jìn)行測(cè)試。
國(guó)內(nèi)服務(wù)器請(qǐng)求結(jié)果如下,和瀏覽器打開(kāi)的結(jié)果基本是一樣(管理員登錄界面)
[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" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
</head>
<body>
<div id="app"></div>
</body>
</html>
海外服務(wù)器請(qǐng)求結(jié)果也是上面這樣……然后發(fā)現(xiàn)是因?yàn)槲业暮M夥?wù)器ip壓根不在那個(gè)black的deny列表里面
嘗試把ip的網(wǎng)段給加進(jìn)去,重啟nginx再試試。完美處理!添加前能正常請(qǐng)求到,添加后就變成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" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
</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屏蔽非國(guó)內(nèi)ip
我前文提到了我的海外服務(wù)器的ip不在這個(gè)deny的ip列表里面,沒(méi)有被屏蔽。
考慮到網(wǎng)上搜不到legacy-apnic-latest文件存放的是什么ip的信息,我決定換一個(gè)思路:allow國(guó)內(nèi)的ip,拒絕所有非國(guó)內(nèi)的ip
下面這個(gè)url里面的ip地址標(biāo)明了地區(qū),我們只需要將其提取出來(lái)即可
http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
這個(gè)文件里面的內(nèi)容結(jié)構(gòu)如下
等級(jí)機(jī)構(gòu)|獲得該IP段的國(guó)家/組織|資源類型|起始IP|IP段長(zhǎng)度|分配日期|分配狀態(tài)
我們只需要提取CN的所有IP,然后允許他們,再deny all阻止其他ip就可以了
#!/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
執(zhí)行這個(gè)腳本后,會(huì)生成/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
內(nèi)容如下
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單個(gè)站點(diǎn)配置文件的location中的內(nèi)容
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;
# 允許所有國(guó)內(nèi)ip
include /etc/nginx/blackcn.conf;
deny all; # 阻止其他ip
proxy_pass http://127.0.0.1:14722;
}
先來(lái)試試不修改配置文件(不做任何deny和allow操作的情況下)海外ip請(qǐng)求結(jié)果
[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" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
</head>
<body>
<div id="app"></div>
</body>
</html>
符合預(yù)期,正常請(qǐng)求出了登錄頁(yè)面的html文件。
添加如上修改后,重啟nginx,再次進(jìn)行測(cè)試。這一次已經(jīng)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
你可以寫(xiě)個(gè)crontab讓其定時(shí)執(zhí)行腳本并重啟nginx,我個(gè)人還是選擇人工處理了(什么時(shí)候想起來(lái)就去更新一下ip列表)
以上就是Nginx通過(guò)配置文件阻止海外ip訪問(wèn)的方法步驟的詳細(xì)內(nèi)容,更多關(guān)于Nginx阻止海外ip訪問(wèn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nginx通過(guò)https部署vue項(xiàng)目的完整步驟
在實(shí)際開(kāi)發(fā)中,我們會(huì)以https形式進(jìn)行頁(yè)面訪問(wèn),下面這篇文章主要給大家介紹了關(guān)于nginx通過(guò)https部署vue項(xiàng)目的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Nginx(PHP/fastcgi)的PATH_INFO問(wèn)題
PATH_INFO是一個(gè)CGI 1.1的標(biāo)準(zhǔn),經(jīng)常用來(lái)做為傳參載體. 比如, 我們可以使用PATH_INFO來(lái)代替Rewrite來(lái)實(shí)現(xiàn)偽靜態(tài)頁(yè)面, 另外不少PHP框架也使用PATH_INFO來(lái)作為路由載體.2011-08-08
Nginx部署前端靜態(tài)文件指南分享(基于虛擬機(jī)環(huán)境)
本筆記詳細(xì)介紹了如何使用Nginx部署前端靜態(tài)文件,包括環(huán)境準(zhǔn)備、文件傳輸、配置文件編寫(xiě)、自定義配置加載、驗(yàn)證配置和日志查看等步驟,通過(guò)實(shí)踐操作,用戶可以掌握用Nginx快速部署任意前端靜態(tài)文件的核心技能2026-02-02
記一次nginx配置不當(dāng)引發(fā)的499與failover 機(jī)制失效問(wèn)題
近期在非高峰期也存在499超過(guò)告警閾值的偶發(fā)情況,多的時(shí)候一天幾次,少的時(shí)候則幾天一次,持續(xù)一般也就數(shù)分鐘,經(jīng)過(guò)和小伙伴的共同探究,最后發(fā)現(xiàn)之前對(duì)于499是客戶端主動(dòng)斷開(kāi)因而和服務(wù)端關(guān)系不大的想當(dāng)然認(rèn)知是錯(cuò)誤的,這里記錄一下2023-05-05
Nginx同一個(gè)域名配置多個(gè)項(xiàng)目的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx同一個(gè)域名配置多個(gè)項(xiàng)目的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

