跳到主要内容

IP 限制

IP 限制是一种常用的访问控制技术。通过将资源限制为特定的 IP 地址,组织可以遵守最小权限原则,防止未经授权的访问,并保持符合安全要求。

APISIX 通过以下方式支持 IP 限制:

  • 通过 IP 限制对上游资源的访问
  • 通过 IP 限制对 Admin API 的访问

本指南将向你展示如何为这些实践配置 APISIX。

通过 IP 限制对上游资源的访问

在本节中,你将了解如何使用 ip-restriction 插件通过 IP 控制客户端对上游资源的访问。你还将了解当 APISIX 位于反向代理之后时,如何将真实客户端 IP 暴露给 APISIX,以便 ip-restriction 插件可以基于真实客户端 IP 评估访问。

按原始远程地址限制

创建一个带有 ip-restriction 插件的路由并配置 IP 白名单:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "ip-restriction-route",
"uri": "/anything",
"plugins": {
"ip-restriction": {
"whitelist": [
// Annotate 1
"192.168.0.1/24"
]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

❶ 配置允许访问上游资源的 IP 地址列表。该配置支持 IPv4 和 IPv6 格式。

向路由发送请求:

curl -i "http://127.0.0.1:9080/anything"

如果你的 IP 被允许,你应该收到 HTTP/1.1 200 OK 响应。如果没有,你应该收到 HTTP/1.1 403 Forbidden 响应和以下错误消息:

{"message":"Your IP address is not allowed"}

你还可以配置 ip-restriction 插件的 IP 地址列表以列入黑名单。但是,请注意,白名单和黑名单不能同时配置。有关更多信息,请参阅 插件文档

按修改后的远程地址限制

有时 APISIX 可能位于反向代理之后。结果,APISIX 识别的客户端 IP 是代理 IP,而不是真实的客户端 IP。为了将真实的客户端 IP 传递给 APISIX 以进行 IP 限制,你可以将 ip-restriction 插件与 real-ip 插件结合使用。

创建一个路由并配置这两个插件,如下所示:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "ip-restriction-route",
"uri": "/anything",
"plugins": {
"ip-restriction": {
"whitelist": [
// Annotate 1
"192.168.1.241"
]
},
"real-ip": {
// Annotate 2
"source": "arg_realip"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

❶ 配置要加入白名单的 IP 地址。

❷ 使用 内置变量 从 URL 参数 realip 获取客户端 IP 地址。

向路由发送请求:

curl -i "http://127.0.0.1:9080/anything?realip=192.168.1.241"

你应该收到 HTTP/1.1 200 OK 响应。

使用不同的 IP 地址发送另一个请求:

curl -i "http://127.0.0.1:9080/anything?realip=192.168.10.24"

你应该收到 HTTP/1.1 403 Forbidden 响应。

通过 IP 限制 Admin API 访问

通过限制授权人员对 Admin API 的访问,组织可以最大限度地减少攻击面,并确保只有具有必要专业知识和职责的个人才能进行关键更改。这有助于在整个基础设施中保持更高水平的控制和整体安全性。

要限制应具有对 APISIX Admin API 管理查看和写入访问权限 的 IP 地址,请使用以下内容更新配置文件 config.yaml

deployment:
admin:
admin_key_required: true
// Annotate 1
allow_admin:
- 127.0.0.0/24
# - "::/64"

❶ 配置允许访问 Admin API 的 IP 地址列表。该配置支持 IPv4 和 IPv6 格式。

请注意,如果 allow_admin 未配置任何 IP,则所有 IP 地址都将被允许访问 Admin API,在生产环境中不建议这样做。

重新加载 APISIX 以使配置文件更改生效。