Kong系列(三)——Kong插件「IP Restriction」使用
nanshan 2024-10-22 12:57 14 浏览 0 评论
Kong plugin 说明
Kong的官网中可以看到目前针对不同的需求提供了很多的插件,大部分都是开源版本,只有少部分是企业版
Kong的插件本身就是基于NGINX的一些属性,来做一些扩展,比如通过IP进行限流,通过IP来限制黑白名单等等,在实际业务中可能需要用到的扩展
Plugin IP Restriction 简单说明
-- E:\work\projects\kong\kong\plugins\ip-restriction\handler.lua function IpRestrictionHandler:access(conf) IpRestrictionHandler.super.access(self) local block = false local binary_remote_addr = ngx.var.binary_remote_addr if not binary_remote_addr then return responses.send_HTTP_FORBIDDEN("Cannot identify the client IP address, unix domain sockets are not supported.") end if conf.blacklist and #conf.blacklist > 0 then block = iputils.binip_in_cidrs(binary_remote_addr, cidr_cache(conf.blacklist)) end if conf.whitelist and #conf.whitelist > 0 then block = not iputils.binip_in_cidrs(binary_remote_addr, cidr_cache(conf.whitelist)) end if block then return responses.send_HTTP_FORBIDDEN("Your IP address is not allowed") end end
配置
配置插件的方式比较简单,插件可以设置到service上,可以设置到route上,0.13之前的也可以设置到api上,还有一些其他的组件也可以设置
我是设置到route上的,如果大家有其他需求可以到官网上查看文档
- 添加
curl -X POST http://localhost:8001/routes/b01067c3-2537-45c8-be41-a80082c8bff3/plugins \ --data "name=ip-restriction" \ --data "config.whitelist=172.17.83.176, 172.17.83.177"
给ID为b01067c3-2537-45c8-be41-a80082c8bff3增加ip-restriction插件
- 修改
curl -X PATCH http://localhost:8001/routes/b01067c3-2537-45c8-be41-a80082c8bff3/plugins \ --data "name=ip-restriction" \ --data "config.whitelist=172.17.83.177"
- 查看
curl -i --url http://localhost:8001/plugins # 结果 { "total": 1, "data": [{ "created_at": 1531446541000, "config": { "whitelist": ["172.17.83.177"] }, "id": "ed6d0fb3-1dd6-4bc8-8712-75d338c2bda9", "name": "ip-restriction", "enabled": true, "route_id": "b01067c3-2537-45c8-be41-a80082c8bff3" }] }
- 删除
curl -X DELETE --url http://localhost:8001/plugins/bf95c7e8-bcd2-460a-a18b-bd1a309d7578/
想象中是配置完成之后,应该立马就可以使用了。
然后我分别从两个服务器上进行了测试,期望的结果应该是除了172.17.83.177这台服务器之外,应该都不可以用。
但是发起结果其实并不是这个样子,而是所有的都可以继续访问。
排查发现,我的Kong节点是部署在NGINX之后,通过NGINX反向代理到Kong节点的,我的NGINX反向代理节点部署在172.17.83.177。
所以说最终无论从哪儿访问,而Kong看到的节点就是177,所以最终发现无论从哪台服务器访问都是可以的,这显然是不符合我们的预期,经过查找资料找到解决方案,我们下节就重点描述此部分。
复杂配置
解决方案
首先说一下上节中提到的问题,读IP Restriction源码可以发现,他是用ngx.var.binary_remote_addr来识别出客户端IP地址的,我们从NGINX可以了解到,这个地址通过代理之后,就已经发生了变化,这就是导致我们获得的地址都是我们代理的地址,所以就失去了原本的意义。
所以我们显然要做的就是将ngx.var.binary_remote_addr变为客户端的地址就能解决问题。
通过查找资料发现kong的版本中的变化,已经如何获得客户端真实的IP地址。
在0.11版本之后,Kong会设置X-Forwarded-For头,所以在这里会记录下所有的请求信息,所以我们也要在代理中也进行设置X-Forwarded-For头,这样才能保证Kong中可以得到最原始的信息,所以解决这个问题的方法就是依靠NGINX 的ngx_http_realip_module,该模块已经在Kong的官方发行包中。此模块X-Forwarded-For根据我们配置的规则正确解析请求头。
Kong公开的配置文件,我们可以看到(trusted_ips,real_ip_header 和real_ip_recursive)属性,它们抽象出NGINX模块的同名指令,通过设置这些属性,我们就可以得到客户端的真实地址
ngx_http_realip_module会更新NGINX的$remote_addr变量来包含客户端IP。
IP限制插件使用ngx.var.binary_remote_addr,该变量也由realip模块更新。
在0.11之前,X-Forwarded-For来自任何来源的Kong请求头(默认情况下)。
从0.11开始,Kong默认不会信任来自任何来源的请求头,所以需要通过我们的设置来完成信任。
在我们使用反向代理或者负载均衡时,需要设置Kong提供的属性(trusted_ips,real_ip_header 和real_ip_recursive),以及我们自己的NGINX反向代理或者负载均衡时要设置的请求头[X-Forwarded-For],下面就分成两部分设置来解决此问题。
NGINX 反向代理配置
这一步比较简单,就是要将客户端的IP地址收集到请求头X-Forwarded-For中,不管有多少层代理,这个请求头中会记录整个请求的声明周期,就是讲每次的IP地址都放在X-Forwarded-For中,然后使用逗号进行分隔,所以最终Kong只需要在取第一项即可,重点的配置如下:
location ~ /(\w+) { proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.17.83.176:8000; expires -1; }
重点就是 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
通过docker启动kong命令设置nginx-kong.conf
- 启动命令
docker run -d --name kong \ -e "KONG_TRUSTED_IPS=0.0.0.0/0,::/0" \ -e "KONG_REAL_IP_HEADER=X-Forwarded-For" \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=192.168.1.94" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ -e "KONG_PROXY_ACCESS_LOG=logs/proxy_access.log" \ -e "KONG_ADMIN_ACCESS_LOG=logs/admin_access.log" \ -e "KONG_PROXY_ERROR_LOG=logs/proxy_error.log" \ -e "KONG_ADMIN_ERROR_LOG=logs/admin_error.log" \ -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \ -p 8000:8000 \ -p 8443:8443 \ -p 8001:8001 \ -p 8444:8444 \ kong:latest
划重点
-e “KONG_TRUSTED_IPS=0.0.0.0/0,::/0” -e “KONG_REAL_IP_HEADER=X-Forwarded-For”
trusted_ips和real_ip_header是kong需要的一些参数,这里有些参数最终会映射到nginx-kong.conf文件中,可以从kong的配置文件中可以看到其类型
trusted_ips表示信任的地址,如果是所有的地址都信任,可以配置为0.0.0.0/0,::/0
real_ip_header表示的是
-- E:\work\projects\kong\kong\templates\kong_defaults.lua return [[ prefix = /usr/local/kong/ log_level = notice proxy_access_log = logs/access.log proxy_error_log = logs/error.log admin_access_log = logs/admin_access.log admin_error_log = logs/error.log plugins = bundled custom_plugins = NONE anonymous_reports = on proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443 ssl admin_listen = 127.0.0.1:8001, 127.0.0.1:8444 ssl nginx_user = nobody nobody nginx_worker_processes = auto nginx_optimizations = on nginx_daemon = on mem_cache_size = 128m ssl_cert = NONE ssl_cert_key = NONE client_ssl = off client_ssl_cert = NONE client_ssl_cert_key = NONE ssl_cipher_suite = modern ssl_ciphers = ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 admin_ssl_cert = NONE admin_ssl_cert_key = NONE upstream_keepalive = 60 headers = server_tokens, latency_tokens trusted_ips = NONE real_ip_header = X-Real-IP real_ip_recursive = off client_max_body_size = 0 client_body_buffer_size = 8k error_default_type = text/plain database = postgres pg_host = 127.0.0.1 pg_port = 5432 pg_database = kong pg_user = kong pg_password = NONE pg_ssl = off pg_ssl_verify = off cassandra_contact_points = 127.0.0.1 cassandra_port = 9042 cassandra_keyspace = kong cassandra_timeout = 5000 cassandra_ssl = off cassandra_ssl_verify = off cassandra_username = kong cassandra_password = NONE cassandra_consistency = ONE cassandra_lb_policy = RoundRobin cassandra_local_datacenter = NONE cassandra_repl_strategy = SimpleStrategy cassandra_repl_factor = 1 cassandra_data_centers = dc1:2,dc2:3 cassandra_schema_consensus_timeout = 10000 db_update_frequency = 5 db_update_propagation = 0 db_cache_ttl = 0 db_resurrect_ttl = 30 dns_resolver = NONE dns_hostsfile = /etc/hosts dns_order = LAST,SRV,A,CNAME dns_stale_ttl = 4 dns_not_found_ttl = 30 dns_error_ttl = 1 dns_no_sync = off lua_socket_pool_size = 30 lua_ssl_trusted_certificate = NONE lua_ssl_verify_depth = 1 lua_package_path = ./?.lua;./?/init.lua; lua_package_cpath = NONE ]]
注意:
这里面的参数,都可以在使用docker启动时,通过-e的方式传递进去,前提是要在这个参数的名字之前加上前缀KONG_*,并且全部是大写
- nginx-kong.conf
我们使用docker启动后,nginx-kong.conf的内容已经设置为我们命令中指定的参数
charset UTF-8; error_log syslog:server=kong-hf.mashape.com:61828 error; error_log logs/proxy_error.log notice; client_max_body_size 0; proxy_ssl_server_name on; underscores_in_headers on; lua_package_path './?.lua;./?/init.lua;;;'; lua_package_cpath ';;'; lua_socket_pool_size 30; lua_max_running_timers 4096; lua_max_pending_timers 16384; lua_shared_dict kong 5m; lua_shared_dict kong_cache 128m; lua_shared_dict kong_db_cache_miss 12m; lua_shared_dict kong_process_events 5m; lua_shared_dict kong_cluster_events 5m; lua_shared_dict kong_healthchecks 5m; lua_shared_dict kong_rate_limiting_counters 12m; lua_socket_log_errors off; init_by_lua_block { kong = require 'kong' kong.init() } init_worker_by_lua_block { kong.init_worker() } upstream kong_upstream { server 0.0.0.1; balancer_by_lua_block { kong.balancer() } keepalive 60; } server { server_name kong; listen 0.0.0.0:8000; listen 0.0.0.0:8443 ssl; error_page 400 404 408 411 412 413 414 417 494 /kong_error_handler; error_page 500 502 503 504 /kong_error_handler; access_log logs/proxy_access.log; error_log logs/proxy_error.log notice; client_body_buffer_size 8k; ssl_certificate /usr/local/kong/ssl/kong-default.crt; ssl_certificate_key /usr/local/kong/ssl/kong-default.key; ssl_protocols TLSv1.1 TLSv1.2; ssl_certificate_by_lua_block { kong.ssl_certificate() } ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA3 real_ip_header X-Forwarded-For; real_ip_recursive on; set_real_ip_from 0.0.0.0/0; set_real_ip_from ::/0; location / { set $upstream_host ''; set $upstream_upgrade ''; set $upstream_connection ''; set $upstream_scheme ''; set $upstream_uri ''; set $upstream_x_forwarded_for ''; set $upstream_x_forwarded_proto ''; set $upstream_x_forwarded_host ''; set $upstream_x_forwarded_port ''; rewrite_by_lua_block { kong.rewrite() } access_by_lua_block { kong.access() } proxy_http_version 1.1; proxy_set_header Host $upstream_host; proxy_set_header Upgrade $upstream_upgrade; proxy_set_header Connection $upstream_connection; proxy_set_header X-Forwarded-For $upstream_x_forwarded_for; proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto; proxy_set_header X-Forwarded-Host $upstream_x_forwarded_host; proxy_set_header X-Forwarded-Port $upstream_x_forwarded_port; proxy_set_header X-Real-IP $remote_addr; proxy_pass_header Server; proxy_pass_header Date; proxy_ssl_name $upstream_host; proxy_pass $upstream_scheme://kong_upstream$upstream_uri; header_filter_by_lua_block { kong.header_filter() } body_filter_by_lua_block { kong.body_filter() } log_by_lua_block { kong.log() } } location = /kong_error_handler { internal; content_by_lua_block { kong.handle_error() } } } server { server_name kong_admin; listen 0.0.0.0:8001; listen 0.0.0.0:8444 ssl; access_log logs/admin_access.log; error_log logs/admin_error.log notice; client_max_body_size 10m; client_body_buffer_size 10m; ssl_certificate /usr/local/kong/ssl/admin-kong-default.crt; ssl_certificate_key /usr/local/kong/ssl/admin-kong-default.key; ssl_protocols TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA3 location / { default_type application/json; content_by_lua_block { kong.serve_admin_api() } } location /nginx_status { internal; access_log off; stub_status; } location /robots.txt { return 200 'User-agent: *\nDisallow: /'; } }
相关推荐
- 三种自建KMS激活系统自动激活windows方法
-
第一种:在windows服务器上搭建主要针对vol版本(win7、win10、win20xx、win2012等等)平台:我自己搭建的windows虚拟机,windows2016的操作系统软件:...
- 重装系统被收98元?避开Windows付费陷阱的实用指南
-
重装系统被收98元?避开Windows付费陷阱的实用指南有网友反映,在重装Windows系统后,屏幕突然弹出“激活系统需支付98元服务费”的提示,疑惑自己是不是遭遇了付费陷阱。事实上,微软官方的Wi...
- Windows Server2012远程桌面服务配置和授权激活
-
安装:注意:安装完毕之后需手动重启一下计算机配置终端服务管理工具---远程桌面服务---RD授权诊断程序,查看当前服务器有没有授权授权:运行—>gpedit.msc->计算机配置---管理...
- 新书速览|Windows Server 2022 系统与网站配置实战
-
讲述桌面体验、ServerCore/NanoServer,容器与云系统的配置1本书内容《WindowsServer2022系统与网站配置实战》秉持作者一贯理论兼具实践的写作风格,以新版的Wi...
- Windows激活全攻略:KMS神钥与专业工具的完美结合!
-
对于许多Windows用户来说,系统的激活是一个必经的过程。虽然Windows操作系统在未经激活的状态下也可以使用一段时间,但长期来看,未激活的系统会限制某些功能并频繁提示用户激活。以下是两种流行的激...
- 微软Win9全新激活技术曝光(微软系统激活有什么用)
-
2014-07-0905:46:00作者:徐日俄罗斯Wzor日前披露了更多关于Windows9的最新消息,据悉,Windows9将会在今年秋季亮相,其宣传口号是“想要开始按钮和开始菜单?如你所...
- 快速激活Windows 10/11:CMD命令详细教程
-
#记录我的2024#激活Windows操作系统是确保系统功能和安全更新正常运行的重要步骤。本文将为您分享如何使用命令提示符(CMD)在Windows10和Windows11上进行激活的详细步骤。...
- Wndows 2019 RDS应用发布部署(rds的安装和应用程序的发布)
-
安装前的准备1、需要提供服务器作为应用中心,应用中心的推荐配置如下表所示。规格建议1-10人11-20人21-50人51-100人100+人CPU4核8核16核内存8GB16GB32GB64GB系统盘...
- 解决 Windows 系统激活难题(如何解决windows激活问题)
-
今天,一位朋友给我说,他手头有三台电脑,均同时弹出系统未激活的提示。他对此毫无头绪,便急忙将电脑上出现的激活提示信息一股脑发给了我。我看到其中一台显示的是“Windows10企业版LTSC尚...
- 自建KMS激活服务器(自建kms激活服务器的风险)
-
自建KMS激活服务器Win10和office安装后,都需要激活才可以使用,一般可以输入购买的MAK激活码进行在线激活,也可以通过KMS激活,网上也有很多激活工具,但这些工具一般都含有病毒或木马程序,容...
- 30秒免费激活windows和office亲测有效!
-
“第三方工具有病毒?”“KMS服务器激活总失效?”今天给大家分享一个开源激活工具——MicrosoftActivationScripts(MAS),无需密钥、不装软件,30秒永久激活Window...
- 「操作系统」Windows 10 LTSC 2019 企业版C大集成更新版
-
Windows10LTSC企业版CHIANNET集成更新优化整合多镜像版,CHIANNET,是USBOS超级PE维护盘工具箱作者,长久以来一直默默的更新着,USBOSPE软件,电脑城装机及...
- 一文看懂Windows激活:自查方法+授权类型科普(Win7/Win10通用)
-
一、如何判断Windows是否永久激活?无论是Win7还是Win10,均可通过以下方法快速验证:命令提示符法(通用):按下Win+R,输入slmgr.vbs/xpr并按回车键运行即可查看是否...
- 部分Windows Server 2019/2022用户反馈无法运行微软Teams应用
-
IT之家7月2日消息,科技媒体borncity今天(7月2日)发布博文,报道称在多个WindowsServer版本上,MicrosoftTeams应用近期出现了运行故障。用...
- 这种Windows激活方式已有20年...(windows现在激活)
-
2006年微软正式发布WindowsVista,随之而来引入了一项新的激活机制「OEM激活」,这项机制在Vista和Win7上最为流行。其实WindowsServer自2008开始至2025版本一...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
手机如何设置与显示准确时间的详细指南
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
-
- 三种自建KMS激活系统自动激活windows方法
- 重装系统被收98元?避开Windows付费陷阱的实用指南
- Windows Server2012远程桌面服务配置和授权激活
- 新书速览|Windows Server 2022 系统与网站配置实战
- Windows激活全攻略:KMS神钥与专业工具的完美结合!
- 微软Win9全新激活技术曝光(微软系统激活有什么用)
- 快速激活Windows 10/11:CMD命令详细教程
- Wndows 2019 RDS应用发布部署(rds的安装和应用程序的发布)
- 解决 Windows 系统激活难题(如何解决windows激活问题)
- 自建KMS激活服务器(自建kms激活服务器的风险)
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)