如何通过openresty 限制国外Ip访问

这篇具有很好参考价值的文章主要介绍了如何通过openresty 限制国外Ip访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考代码

https://gitee.com/xiaoyun461/blocking-external-networks

首先 需要的依赖:

libmaxminddb

https://github.com/maxmind/libmaxminddb

maxmind-geoip

https://github.com/Dreamacro/maxmind-geoip

libmaxminddb 需要gcc编译,可用 Dockerfile 里面编译生成so文件,然后复制到 openresty/openresty:centos-rpm 镜像中,然后把 Country.mmdb(Ip数据库) 也复制到镜像中

Dockerfile 如下:

############## 构建 libmaxminddb #####################
FROM gcc:9 AS libmaxminddb-build
ADD lib/libmaxminddb-1.8.0.tar.gz /
WORKDIR /libmaxminddb-1.8.0
RUN ./configure && make && make install && ldconfig -v && ls -f  /usr/local/lib/libmaxminddb*

############## 构建 openresty #####################
FROM openresty/openresty:centos-rpm
ENV TZ Asia/Shanghai
COPY --from=libmaxminddb-build   /usr/local/lib/libmaxminddb.so.0.0.7 /lib64
COPY  geoip/20231212/Country.mmdb /etc/nginx/mmdb/Country.mmdb

RUN  ln -snf /usr/share/zoneinfo/"$TZ" /etc/localtime && echo "$TZ" > /etc/timezone \
     && opm get anjia0532/lua-resty-maxminddb \
     && ln -s /lib64/libmaxminddb.so.0.0.7 /lib64/libmaxminddb.so \
     && ldconfig -v

然后配置lua脚本,OpenResty(也称为 ngx_openresty)是一个基于 Nginx 与 Lua 的高性能 Web 平台,

lua脚本如下:

local function get_client_ip()
    local headers = ngx.req.get_headers()
    local clientIP = headers["x-forwarded-for"]
    if clientIP == nil or string.len(clientIP) == 0 or clientIP == "unknown" then
        clientIP = headers["Proxy-Client-IP"]
    end
    if clientIP == nil or string.len(clientIP) == 0 or clientIP == "unknown" then
        clientIP = headers["WL-Proxy-Client-IP"]
    end
    if clientIP == nil or string.len(clientIP) == 0 or clientIP == "unknown" then
        clientIP = ngx.var.remote_addr
    end
    -- 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
    if clientIP ~= nil and string.len(clientIP) > 15 then
        local pos = string.find(clientIP, ",", 1)
        clientIP = string.sub(clientIP, 1, pos - 1)
    end
    return clientIP;
end

local function check_cn(ip)
    local geo = require 'resty.maxminddb'
    if not geo.initted() then
        geo.init("/etc/nginx/mmdb/Country.mmdb")
    end
    local res, err = geo.lookup(ip)
    if not res then
        ngx.log(ngx.ERR, ' failed to lookup by ip , reason :', err)
    else
        for k, v in pairs(res) do
            if (k == "country") then
                for key, item in pairs(v) do
                    if (key == "iso_code") then
                        if item == "CN" then
                            ngx.log(ngx.INFO, ' this counrty: ', item)
                            return 1;
                        else
                            ngx.log(ngx.ERR, ' this counrty: ', item)
                            return 0;
                        end
                    end
                end
            end
        end
    end
end



-- 获取nginx 本地缓存
local cache_ngx = ngx.shared.dis_cache;
-- 获取 请求IP
local clientIP = get_client_ip();


--根据IP 获取本地黑名单缓存数据
local banIpCache = cache_ngx:get('ban_ip_' .. clientIP);
if banIpCache == 1 then
    ngx.log(ngx.ERR, "cache_black_ip:", clientIP)
    ngx.exit(403)
else
    -- 判断是否是国外IP, 直接设为黑名单,并且返回403
    local flag = check_cn(clientIP);
    if flag == 0 then
        -- 本地缓存黑名单 时间1小时
        ngx.log(ngx.ERR, "set_local_black_ip:", clientIP)
        cache_ngx:set('ban_ip_' .. clientIP, 1, 60 * 60);
        ngx.exit(403)
    end
end




nginx.conf 配置文件 也要加入 lua脚本校验,以及 增加128M的本地缓存,方便过滤

nginx.conf如下:

pcre_jit on;



#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

error_log  logs/error.log  warn;

#pid        logs/nginx.pid;


worker_processes auto;

events {
    worker_connections  20480;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    # Enables or disables the use of underscores in client request header fields.
    # When the use of underscores is disabled, request header fields whose names contain underscores are marked as invalid and become subject to the ignore_invalid_headers directive.
    # underscores_in_headers off;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /dev/stdout  main;



#         Log in JSON Format
        log_format nginxlog_json escape=json '{ "timestamp": "$time_local", '
        '"remote_addr": "$remote_addr", '
        '"remote_user": "remote_user", '
         '"body_bytes_sent": $body_bytes_sent, '
         '"request_time": $request_time, '
         '"response_status": $status, '
         '"request": "$request", '
         '"request_method": "$request_method", '
         '"host": "$host",'
         '"upstream_addr": "$upstream_addr",'
         '"upstream_host": "$upstream_http_host",'
         '"upstream_resp_time": "$upstream_response_time",'
         '"http_x_forwarded_for": "$http_x_forwarded_for",'
         '"http_referrer": "$http_referer", '
         '"http_user_agent": "$http_user_agent", '
         '"http_version": "$server_protocol" ';

	map $time_iso8601 $logdate {
        '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
        default                       'date-not-found';
    }

    access_log logs/access_json-$logdate.log  nginxlog_json;

    # See Move default writable paths to a dedicated directory (#119)
    # https://github.com/openresty/docker-openresty/issues/119
    client_body_temp_path /var/run/openresty/nginx-client-body;
    proxy_temp_path       /var/run/openresty/nginx-proxy;
    fastcgi_temp_path     /var/run/openresty/nginx-fastcgi;
    uwsgi_temp_path       /var/run/openresty/nginx-uwsgi;
    scgi_temp_path        /var/run/openresty/nginx-scgi;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    client_max_body_size 150m;

#     lua cache
    lua_shared_dict dis_cache 128m;

    gzip on;
    gzip_static  on;
    gzip_min_length 1k;     # 设置允许压缩的页面最小字节数
    gzip_buffers 4 16k;     # 用来存储 gzip 的压缩结果
    gzip_http_version 1.1;  # 识别 HTTP 协议版本
    gzip_comp_level 2;      # 设置 gzip 的压缩比 1-9。1 压缩比最小但最快,而 9 相反
    gzip_types gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定压缩类型
    gzip_proxied any;       # 无论后端服务器的 headers 头返回什么信息,都无条件启用压缩

    # 限制国外ip
    access_by_lua_file /etc/nginx/lua/access_limit_open.lua;





    include /etc/nginx/conf.d/*.conf;

}


全部 样例代码 在

https://gitee.com/xiaoyun461/blocking-external-networks

可自行修改文章来源地址https://www.toymoban.com/news/detail-790077.html

到了这里,关于如何通过openresty 限制国外Ip访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows server防火墙如何设置阻止IP访问防火墙限制ip地址访问

    无论是服务器还是本机电脑,安全都是非常重要的,一些安全软件设置后会拦截到一些异常IP,我们可以通过防火墙将异常IP加入黑名单,禁止访问,今天 芳芳 就和你们分享Windows防火墙如何设置IP禁止访问,希望可以帮助到你~ 打开“控制面板”,在右上角的查看方式改为“

    2024年02月13日
    浏览(62)
  • 阿里云的白名单规则如何实现IP限制和访问控制?

    阿里云的白名单规则如何实现IP限制和访问控制? [本文由阿里云代理商 [聚搜云] 撰写] 随着企业在云计算领域的深入应用,网络安全问题日益凸显。阿里云提供了一种名为“白名单”的规则,帮助用户实现IP限制和访问控制。本文将详细阐述阿里云白名单规则的原理及操作方

    2024年02月10日
    浏览(47)
  • iptables结合ipset禁止国外IP进行访问

    0x01 ipset 可以使用 iptables 对访问地址进行一定的限制,但是当受限地址数量过多时,维护管理起来就不太方便,而且数量过多的 iptables 条目也会影响设备的性能。此时就可以使用 ipset 工具来解决此种问题。 ipset 理解起来比较容易,理解为地址组就好,具有相同作用的地址段

    2024年02月06日
    浏览(37)
  • 用 Nginx 禁止国外 IP 访问我的网站...

    先来说说为啥要写这篇文章,之前看了下 Nginx 的访问日志,发现每天有好多国外的 IP 地址来访问我的网站,并且访问的内容基本上都是恶意的。因此我决定禁止国外 IP 来访问我的网站。 想要实现这个功能有很多方法,下面我就来介绍基于 Nginx 的 ngx_http_geoip2 模块来禁止国外

    2024年02月13日
    浏览(47)
  • 基于Geoip2实现Nginx拦截国外IP访问网站

    最近公司上线了一个APP,过段时间发现告警群总有些莫名的异常,通过排查发现是被攻击了,并且攻击IP全是国外的,基于APP业务全在国内,最简单办法就是屏蔽这些IP。云上虽有产品但收费,自己动手才是王道。 目录 一、实现思路 二、配置方法    2.1 软件下载 2.1.1 Nginx下

    2024年01月16日
    浏览(38)
  • Internet通过TCP/IP协议可以实现多个网络的无缝连接

    Internet通过TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网协议)协议实现多个网络的无缝连接 。 TCP/IP是Internet的基础通信协议套件,它定义了数据如何在不同网络之间传输和路由,使得全球范围内的不同计算机和网络可以互相通信。TCP/IP协议套件包括多个

    2024年02月07日
    浏览(48)
  • 如何通过IP访问MySQL数据库

    1.1 改表法 如果不从远程登陆,可以用 localhost 。这个时候只要在 localhost 的那台电脑,登入 mysql 后,更改 \\\"mysql\\\" 数据库中 \\\"user\\\" 表里的 \\\"host\\\" 字段,把 \\\"localhost\\\" 改称 \\\"%\\\" ,即可。 1.2 授权法 例如,你想用户 myuser 使用密码 mypassword 通过 IP 地址连接到 MySQL 服务器,使用: 如果你

    2024年02月06日
    浏览(45)
  • 【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

    使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制,如被限制的IP地址一分钟可以访问10次,而不被限制的IP地址则可以无限访问?   最近ChatGPT爆火,所以也把这个问题让ChatGPT来解答,然后人工验证它的回答正确与否? 根据对APIM Policy的文档参考, choose 和 rat

    2023年04月24日
    浏览(41)
  • 如何通过 IP + 端口远程访问服务器上的jupyter notebook

            前情需要:最近实验室和老师要求能时刻访问服务器上的jupyter notebook通过IP + 端口来连接,但是我弄了很久就是不能连接,始终是无法连接网站 但是通过ssh -L  本地端口:localhost:服务器jupyter的端口 root@服务器IP 这样连接是可以在本地运行的,但是没有完成老师的要求

    2024年02月11日
    浏览(52)
  • 如何通过本地搭建wamp服务器并实现无公网IP远程访问

    软件技术的发展日新月异,各种能方便我们生活、工作和娱乐的新软件层出不穷,但也有一些经过时间和用户考验的老牌软件屹立不倒。就一我们熟悉的网站集成环境来说,全球就有很多种server软件。每个软件都有各自的特色(虽然同质化很严重),也拥有自己固定的适用群

    2024年02月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包