NginxProxyManager禁止或允许某地区访问

前言

家用一般都只在市里通勤🤡所以呀给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文件
在指定代理主机的advancedCustom Nginx Configuration内容框中贴入以下内容

include /data/nginx/blocker.conf;

为指定禁用访问的主机添加黑名单
黑名单内容与server_proxy.conf文件相同
include能访问到的地址就成
不过一般还是直接全局禁止访问,一ban全ban