前言
家用一般都只在市里通勤🤡所以呀给npm个套子限制地区访问应该更安全
老套路了,一般都是禁止国外IP的访问
今天来设置下只允许本地市的访问,其他地区通通404
限制访问
以unraid应用市场中的NginxProxyManager为例( jlesage版) jc21版本存放目录不同
都是靠ngx_http_geoip2_module模块实现 jc21版请自行添加
下载GeoLite2-City.mmdb
感谢P3TERX大佬的项目,每3天自动发布新版本.先从大佬这扒GeoLite2-City.mmdb文件至npm所能访问的持久化目录,npm容器内输入以下命令
wget https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb -O /data/GeoLite2-City.mmdb
获取地区信息
通过命令从GeoLite2-City.mmdb获取要禁用或者允许访问的地区信息
--ip后的地址就是要记录的可用信息
bash-5.1# cd /data
bash-5.1# mmdblookup --file GeoLite2-City.mmdb --ip 47.111.166.161
{
"city":
{
"geoname_id":
1808926 <uint32>
"names":
{
"de":
"Hangzhou" <utf8_string>
"en":
"Hangzhou" <utf8_string>
"es":
"Hangzhou" <utf8_string>
"fr":
"Hangzhou" <utf8_string>
"ja":
"杭州市" <utf8_string>
"pt-BR":
"Hangzhou" <utf8_string>
"ru":
"Ханчжоу" <utf8_string>
"zh-CN":
"杭州" <utf8_string>
}
}
"continent":
{
"code":
"AS" <utf8_string>
"geoname_id":
6255147 <uint32>
"names":
{
"de":
"Asien" <utf8_string>
"en":
"Asia" <utf8_string>
"es":
"Asia" <utf8_string>
"fr":
"Asie" <utf8_string>
"ja":
"アジア" <utf8_string>
"pt-BR":
"Ásia" <utf8_string>
"ru":
"Азия" <utf8_string>
"zh-CN":
"亚洲" <utf8_string>
}
}
"country":
{
"geoname_id":
1814991 <uint32>
"iso_code":
"CN" <utf8_string>
"names":
{
"de":
"China" <utf8_string>
"en":
"China" <utf8_string>
"es":
"China" <utf8_string>
"fr":
"Chine" <utf8_string>
"ja":
"中国" <utf8_string>
"pt-BR":
"China" <utf8_string>
"ru":
"Китай" <utf8_string>
"zh-CN":
"中国" <utf8_string>
}
}
"location":
{
"accuracy_radius":
1000 <uint16>
"latitude":
30.299400 <double>
"longitude":
120.161200 <double>
"time_zone":
"Asia/Shanghai" <utf8_string>
}
"registered_country":
{
"geoname_id":
1814991 <uint32>
"iso_code":
"CN" <utf8_string>
"names":
{
"de":
"China" <utf8_string>
"en":
"China" <utf8_string>
"es":
"China" <utf8_string>
"fr":
"Chine" <utf8_string>
"ja":
"中国" <utf8_string>
"pt-BR":
"China" <utf8_string>
"ru":
"Китай" <utf8_string>
"zh-CN":
"中国" <utf8_string>
}
}
"subdivisions":
[
{
"geoname_id":
1784764 <uint32>
"iso_code":
"ZJ" <utf8_string>
"names":
{
"en":
"Zhejiang" <utf8_string>
"fr":
"Province de Zhejiang" <utf8_string>
"zh-CN":
"浙江省" <utf8_string>
}
}
]
}
内容很详细,都以en标签来举例:
要市就记Hangzhou要省就记zh-CN要州就记Asia要国家就记China
图方便,直接用来中文表达
添加判断规则
在npm的ngxin配置目录中新建custom目录
jlesage版config目录就是data目录
此文件夹为自定义nginx配置,默认全局加载
/data/nginx/custom/root.conf: 包含在 nginx.conf 的最后
/data/nginx/custom/http_top.conf: 包含在主 http 块的顶部
/data/nginx/custom/http.conf: 包含在主 http 块的末尾
/data/nginx/custom/stream.conf: 包含在主流块的末尾
/data/nginx/custom/server_proxy.conf: 包含在每个代理服务器块的末尾
/data/nginx/custom/server_redirect.conf: 包含在每个重定向服务器块的末尾
/data/nginx/custom/server_stream.conf: 包含在每个流服务器块的末尾
/data/nginx/custom/server_stream_tcp.conf: 包含在每个 TCP 流服务器块的末尾
/data/nginx/custom/server_stream_udp.conf: 包含在每个 UDP 流服务器块的末尾
我们只需要在此文件夹新建http_top.conf文件,粘贴以下内容保存
# 这使用zh-CN就可以在下方黑名单中直接填写中文地区信息,如果写en到时候就填拼音,以此类推
geoip2 /data/GeoLite2-City.mmdb {
$geoip2_data_country_code country iso_code;
$geoip2_data_country_name country names zh-CN;
$geoip2_data_city_name city names zh-CN;
$geoip2_data_province_name subdivisions 0 names zh-CN;
$geoip2_data_province_isocode subdivisions 0 iso_code;
$geoip2_continent_code continent code;
}
# 添加放行白名单文件
include /data/nginx/custom/whitelist.conf;
继续此文件夹新建whitelist.conf添加要放行的地址
我默认放行我的局域网IP
geo $allow_ip {
default 0;
192.168.1.0/24 1;
}
继续此文件夹新建server_proxy.conf添加要禁止的地址
我默认放行杭州地区的IP
根据第2步获取的信息按需选择填入要禁止市还是地区的访问
如4G 5G的IP不稳定跨市,就用mmdblookup查下IP填入解除限制
对于4G 5G的IP不要填ip138之类查询到的地址,以mmdblookup查询地址为准
# 关于$geoip2_xxx的定义参考http_top.conf中来写
# 阻止除IP归属地为中国、澳门、香港的IP
# if ($geoip2_country_code !~ (CN|MO|HK)) { set $geoblock 1; }
# 阻止除IP归属地为杭州跟宁波的IP
if ($geoip2_data_city_name !~ (杭州|宁波)) { set $geoblock 1; }
# 对白名单内的ip放行
if ($allow_ip = 1){ set $geoblock 0; }
# 限制动作并返回错误代码
if ($geoblock = 1){ return 770; }
重启下nginx
nginx -t && nginx -s reload
打完收工
PS
如果不想全局限制访问 就不要在custom文件夹新建server_proxy.conf文件
在指定代理主机的advanced的Custom Nginx Configuration内容框中贴入以下内容
include /data/nginx/blocker.conf;
为指定禁用访问的主机添加黑名单
黑名单内容与server_proxy.conf文件相同
include能访问到的地址就成
不过一般还是直接全局禁止访问,一ban全ban