一、背景
部署在生产环境的应用,供内部服务调用外,还需要暴露外网访问。
比如consul ui管理界面,我们需要给到开发和测试人员,观察服务的注册情况。
再比如前端页面和后端接口在一起的服务,后端接口供内部服务接口调用,调用安全通过颁发访问令牌来保证;而前端页面则是后台管理界面,需要暴露到外网,以便网站管理人员可以登录并操作设置。
再比如公司研发环境想要访问生产的接口,使得测试最接近真实数据及网络,当然我们不能任意暴露给所有外网访问。
既然提供了外网访问,如何适当地提高应用安全就摆在我们面前。
本文将介绍两种api网关工具来实现对客户端Ip的限制(设置白名单机制):
- kong
- nginx ingress
二、kong配置
Kong有自带的插件ip-restriction可以设置IP白名单
-
IP白名单
-
IP黑名单
添加至黑名单的ip客户端,则禁止访问外部域名。
可以说,kong网关因为有上面的操作界面,直观又方便,还是非常简单的。
下面介绍如何在nginx ingress中实现同样功能。
三、nginx ingress
通过注解(annotations)实现IP访问控制,您可以使用nginx.ingress.kubernetes.io/whitelist-source-range和nginx.ingress.kubernetes.io/block-source-range这两个注解类型。这些注解可以添加到Ingress资源中,以限制或允许特定的IP地址或IP地址范围访问您的服务。
- 使用白名单(whitelist):
通过nginx.ingress.kubernetes.io/whitelist-source-range注解,您可以指定一个或多个CIDR格式的IP地址范围,以允许这些范围内的IP地址访问您的服务。(注意:多个ip地址间逗号隔开)
完整的yaml文本示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: '122.xx.xx.66,39.xx.xx.220'
name: xxx
namespace: xx-service
spec:
ingressClassName: ack-nginx
rules:
- host: {你的外网域名}
http:
paths:
- backend:
service:
name: {你的service服务名称}
port:
number: {你的service服务端口号}
path: /
pathType: ImplementationSpecific
如果你的外网IP不在上面的白名单列表,则会报错403被禁止:
四、总结
这样,我们就能在公司研发环境下,访问部署在生产的服务,既方便了联调测试,又一定程度地提高了网络安全。