You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kong网关能否拦截直接路由访问?如何屏蔽指定API子路由?

关于Kong网关的两个访问控制问题解答

嘿,这两个需求在Kong里都完全能搞定,我给你拆解一下具体怎么做:

一、阻止直接路由的访问(绕过Kong访问后端)

如果你的需求是防止用户绕过Kong直接访问后端API服务,可以从两个层面实现:

  • 网络隔离(最推荐):把后端服务的端口仅对Kong所在的IP地址开放,通过防火墙或安全组限制外部直接访问后端的IP+端口。这样所有请求必须经过Kong转发才能到达后端,从根源上阻止直接访问。
  • Kong插件加固:给后端服务绑定key-auth插件,强制所有请求必须携带有效的API密钥才能访问。直接访问后端的请求因为没有携带密钥,会被Kong拦截返回401;或者用request-id插件,要求请求必须带有Kong生成的X-Request-ID头,后端服务只处理带有该头的请求,进一步确保请求经过Kong。

二、在/myapi路径下拦截特定路由(比如/myapi/somecontroller/somemethod)

这个需求用Kong的路由优先级+插件就能轻松实现,推荐两种常用方法:

方法1:优先级路由 + Request-Termination插件(最简单直接)

Kong的路由匹配是按优先级从高到低来的,我们可以创建一个优先级更高的路由专门匹配要拦截的路径,然后绑定终止请求的插件:

  1. 创建主路由:先配置覆盖所有/myapi路径的主路由,正常转发请求到后端(假设你的服务ID是your-service-id):
curl -X POST http://kong-admin:8001/services/your-service-id/routes \
  --data "paths[]=/myapi" \
  --data "methods[]=POST" \
  --data "priority=10"  # 设低优先级,让拦截路由先匹配
  1. 创建拦截路由:专门匹配/myapi/somecontroller/somemethod,设置更高优先级:
curl -X POST http://kong-admin:8001/services/your-service-id/routes \
  --data "paths[]=/myapi/somecontroller/somemethod" \
  --data "methods[]=POST" \
  --data "priority=100"  # 高优先级优先匹配
  1. 绑定终止插件:给这个拦截路由绑定request-termination插件,直接返回禁止访问的响应:
curl -X POST http://kong-admin:8001/routes/{拦截路由ID}/plugins \
  --data "name=request-termination" \
  --data "config.status_code=403" \
  --data "config.message=Access to this endpoint is forbidden"

这样当请求命中/myapi/somecontroller/somemethod时,会先匹配到高优先级的拦截路由,直接返回403,不会转发到后端。

方法2:ACL插件(适合需要区分消费者的场景)

如果需要更灵活的控制(比如只允许特定用户访问该路径,其他人拦截),可以用ACL插件:

  • 先创建一个blocked-endpoint的消费者组,给主路由绑定ACL插件,设置allow规则为所有需要访问的组,deny规则为blocked-endpoint
  • 然后创建针对/myapi/somecontroller/somemethod的路由,绑定ACL插件,设置deny规则为所有组,或者直接绑定request-termination插件,效果和方法1一致。

内容的提问来源于stack exchange,提问作者kkost

火山引擎 最新活动