好的,我会按照您的要求,原原本本地整理内容,使其合理通顺,不遗漏、省略或总结。整理后的内容如下:
Nginx结合Lua+Redis实现动态封禁IP。之前Nginx限制IP黑名单都是在配置文件中使用deny的方式,现在我们单位的平台需要一个Nginx黑名单功能,用deny就不方便了,我们决定采用lua加Redis的方式。当Nginx收到请求时,先检查Redis中是否该客户端IP被封禁,如果封禁则拒绝访问。
我这里使用的是OpenResty,它是基于Nginx封装,集成了Lua的非常强大的功能。当然你也可以基于原生的Nginx,去增加Lua这个模块来实现。在OpenResty目录下创建了一个lua目录,在这个lua目录里写了一个lua脚本。
打开这个lua脚本,第一行是导入Redis客户端库,第二行是创建Redis客户端实例,指定Redis IP和端口,用来连接它,并将连接成功和错误,分别赋予ok和err这两个变量。如果ok不为真,就说明连接失败,记录日志到Nginx的错误日志里面;否则就说明连接成功。
当连接成功后,先通过Nginx的内置变量remote_address来获取客户端IP,并赋予client_ip这个变量。接着调用Redis从中去get一个key,格式是ban:后面跟客户端IP,这个需要我们手动或通过程序向Redis设置。如果res为nil的话,就说明连接Redis失败了,有错误返回,然后就记录一条日志到Nginx错误日志里面。如果s_ban为真,就说明从Redis中获取到了这个key,然后将IP被封禁的提示记录到日志里面,并返回HTTP访问拒绝。
这么一个简单的脚本,就实现了从Redis中检查客户的IP是否被封禁,如果被封禁就拒绝访问。打开Nginx配置文件,在虚拟主机中增加一个access_by_lua_file来指定Lua脚本,就说明这个Lua脚本会在这个虚拟主机中生效,所有访问该虚拟主机的HTTP请求,都会被这个Lua脚本拦截并处理。
在Nginx配置文件中指定好Lua脚本的绝对路径后,进行测试,看是否达到预期。浏览器访问OpenResty的首页是可以正常访问的,说明Nginx服务器没问题。
接着操作Redis,将本机电脑的IP在Redis中设置key,表示将它封禁。再访问浏览器就会发现出现404拒绝访问,说明Lua脚本生效了。如果要解封,就delete掉Redis中对应的key,浏览器再访问就可以正常访问了。
我们主要是使用Redis来存储被封禁的IP,因为Redis可以被很多程序调用,所以在前端或后台平台,直接向Redis写入或删除key就可以实现动态封禁IP的目的。Nginx结合Lua可以实现很多实用的功能,如动态负载均衡、灰度发布等,如果公司重度使用Nginx,建议学习下Lua来增强Nginx的功能。
用到的ip地理位置数据库,是MaxMind公司开源的
以下是对原文内容的整理,使其更加通顺连贯:
一位粉丝问到如何使用Nginx禁止国外IP访问网站,因为发现有大量国外IP在进行cc攻击。由于该网站业务仅限于国内,因此想封锁这些国外IP。实现这一需求分为三步:
第一步,将现有的Linux添加GeoIP模块。找到Nginx之前的编译目录,重新进行编译,执行configure命令时添加–add-module并跟上GeoIP模块的路径。这个模块可以从GitHub上下载,作用是使用MaxMind公司的地理位置数据库,读取客户端IP的地理位置信息,并赋予Nginx的环境变量。在release页面可以下载该模块的包,解压到Linux系统中,指定模块路径,然后使用make和make install对Nginx重新编译。
第二步,下载使用的IP地理位置数据库。该数据库需要在Nginx配置中使用,即GeoIP数据库。MaxMind公司开源了一个免费IP地理位置数据库,可以在其官网下载,需要登录账号。下载后将包解压放到Linux服务器任意目录,只要Nginx能读取到即可。这是实现该需求的关键,因为必须能获取到客户端IP的地理位置是哪个国家,根据添加的规则决定该国家IP是否能访问Nginx。有两个参数需要配置:一是多长时间刷新数据库以保证最新;二是将数据库解析出的国家代码赋予country_code变量。使用map指令将country_code变量重新设置allowed变量,解析的国家代码会赋予该变量。在设置时要判断,如果解析出的国家代码不在定义的列表中,就将值设为no,否则设为yes。例如CN(中国)会被设为yes,意味着只允许中国区的IP访问。
第三步,在Nginx中添加配置,指定IP地理位置数据库和相应变量赋值。然后在虚拟主机中添加条件判断,根据allowed变量是no还是yes决定是否允许访问。如果是no,即非中国区IP,返回403禁止访问;如果是yes,则可以正常访问。
通过以上三步配置,实现了仅允许中国区IP访问Nginx的需求。当然,也可以在MaxMind的IP地理位置数据库基础上,根据解析出的城市信息,进一步限制允许访问的城市范围。前提是能获取IP的地理位置信息,配合使用MaxMind的免费数据库和Nginx的GeoIP模块即可实现。
以下是对原文内容的整理,使其更加通顺连贯:
视频推荐了一款非常好用的Nginx图形化管理系统 - Nginx Proxy Manager。即使不了解Nginx,也可以通过这个系统轻松配置高性能的反向代理服务器Nginx。
首先介绍了它的官网,有兴趣可以浏览了解。接着在一台Docker主机上,使用Docker创建并运行了Nginx Proxy Manager容器。该容器对外暴露了三个端口:80和443提供HTTP和HTTPS访问,81端口是代理服务器后台管理系统。
访问主机IP和81端口,进入登录页面,默认邮箱是admin@example.com,密码是changeme。登录后会提示设置新的邮箱地址,也可以不设置继续使用默认密码。
该系统提供了处理HTTP 7层代理重定向和Stream 4层代理转发的主机管理。我们主要使用的是HTTP反向代理。在管理界面可以添加相关配置,设置域名,输入后端Web服务器的IP地址,确保在该Docker容器内能够访问该IP。当域名解析到Docker主机的80或443端口时,就能通过代理访问后端服务器。
在添加HTTP代理时,还可以进行更多配置,如自定义location、SSL配置、自定义Nginx配置等,功能非常全面。可以上传SSL证书并在配置时选择。还支持设置IP白名单、查看审计日志等。
Nginx Proxy Manager项目本身比较简单,主要提供一个图形化页面,让用户能够在上面配置反向代理相关功能,将常见功能以按钮形式呈现,方便选择。如果默认功能不满足需求,也可以自定义配置。完成配置后,它会将配置生成Nginx配置文件,并加载到容器内运行的Nginx服务上。用户访问时实际访问的是该Nginx服务,监听在容器的80和443端口上,而管理后台主要用于让用户配置和重载Nginx。
该项目虽然开发简单,但作者称如果有前端开发基础,自己也可以参考写一个类似的系统。
https://www.bilibili.com/video/BV11x4y187AN/
第三个 好几种方法,
首先用 ssh 端口转发,这里还有三种,分别是本地转发,远程转发,动态转发,这里只写一下本地转发需要的指令
ssh -NL 18922:192.168.3.10:22 user@192.168.2.2
在 192.168.1.1 上执行上面的指令,然后用户 a 只需访问 192.168.1.1 的18922端口,注意需要用用户b的用户名
第二种,配置 ufw 的转发规则(iptables 不会写[呲牙])
第三种,frp内网穿透
第四种,zerotier 异地组网
第五种,常用的远程桌面应用(需要访问外网)
第六种,配置路由表把 192.168.3.x 网段的访问都通过192.168.2.2转过去[呲牙]
只要大家都插着网线,总有解决办法的[呲牙]
我已经帮您整理了内容,使其更加合理通顺。以下是整理后的版本,保留了所有原始内容:
统计公司网站(Nginx)用户城市分布
突然有一天,领导让统计一下公司网站都是由哪些城市来访问的,以便进行进一步的营销定位和网络优化。让我们来看看如何实现这个需求。
这次我们将使用MaxMind公司的客户端库和IP地理位置数据库。
首先,你需要在当前系统安装MaxMind公司的客户端库。GitHub地址在这里,你可以下载源码进行编译安装。这个客户端库用于读取MaxMind数据库文件,将IP解析出对应的地理位置。通过这个地理位置,就可以获取到国家、城市等信息。
然后,你还需要下载MaxMind的数据库。在他们的官网上有下载链接,进入”Download Files”页面下载。注意,下载需要先登录。如果你有需要,可以在评论区留言或者私信我。
下载好之后解压,就能得到数据库文件。客户端库我在这台机器上已经安装了,通过编译进行安装就可以了,很简单,就不再重复说明了。
access.log是Nginx的访问日志。我们可以打开看一下,这是一个标准的Nginx访问日志,没有做任何修改。在这个日志的第一列就记录了所有访问Nginx(也就是网站)用户的IP地址。通过这个IP,让MaxMind的客户端库通过数据库解析出它的地理位置,然后再提取出来,就可以获得所有访问网站的城市分布情况。
为此,我写了一个shell脚本。这个shell脚本比较简单:
- 指定Nginx的访问日志路径
- 指定IP地址位置数据库文件
- 将结果临时保存到指定路径
- 使用while循环遍历access.log中的每一行
- 对每一行将客户的IP提取出来,保存到IP这个变量中
- 使用mmdb-lookup命令(安装客户端库后系统中就有这个命令)
- 通过-f参数指定IP地理位置数据库的路径
- 将读取的每一行的客户端IP传递给它
- 只获取城市这个字段
- 使用awk取出结果中的第8列,也就是城市名
- 将所有城市都保存到临时文件中
- 最后使用grep过滤出非空行
- 通过sort进行排序
- 再通过uniq -c去重并统计次数
- 最后通过sort -k1对次数做一个排序
让我们执行一下这个脚本。现在正在分析中,等待片刻,大概需要几秒钟时间。
这里就打印出客户IP对应的城市访问次数。通过这个结果,你可以一目了然地了解访问该网站用户的地理位置分布情况,从而帮助你更好地进行营销和网络优化。
在临时文件里面,我们可以看到保存的就是客户端IP解析出来的地理位置。所以我们脚本里面的最后一条命令就是要对这个文件的内容进行处理。因为已经成功地解析出IP的地理位置了,所以再处理通过sort和uniq就很简单了。
原文链接: https://dashen.tech/2018/05/08/Nginx结合Lua-Redis实现动态封禁IP/
版权声明: 转载请注明出处.