我正在尝试使用 Istio 实施基于 IP 的访问限制,我希望 Istio 阻止除某些 IP 之外的所有请求。我已经到了阻止请求但不允许我在 YAML 清单中添加的 IP 的地步。我怀疑它看到的 IP 与原始客户端 IP 不同,因为我的 Istio 前面有几个负载均衡器。
我从一些文档中读到 X-Forwarder-For 是我们应该用来获取实际 IP 的东西,我已经在其他一些实现中使用过它,但不清楚如何让 Istio 选择实际的 X-Forwarder-Host。我们可以创建一些自定义标头并让 Istio 从那里读取吗?请帮助
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: ingress-policy
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-ingressgateway
action: ALLOW
rules:
- from:
- source:
remoteIpBlocks: ["98.XXX.XXX.66"]
我在我的 Envoy 中启用了调试日志,下面是正在记录的内容。
[2023-05-13T03:22:05.387Z] "GET /cluster/XXXX/XXXX/hari5 HTTP/1.1" 403 - rbac_access_denied_matched_policy[none] - "-" 0 19 0 - "98.XXX.XXX.66:52063,10.240.208.62" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" "37ccfaa6-7deb-414f-9f5c-72926c997994" "XXX-XX-XXX.XXX.com" "-" outbound|80||XXX.XXX-XXX.svc.cluster.local - 10.240.208.23:8080 10.240.208.62:40755 - -
我怀疑它看到的 IP 与原始 IP 不同 客户端 IP,因为我的 Istio 前面有几个负载均衡器。
假设您不使用
externalTrafficPolicy: Local
,因为如here所述,您已经使用了remoteIpBlocks
。因此,如果您遵守该规定,我看到的唯一问题如下。
负载均衡器是位于客户端和 Istio 之间的一个组件。因此,应该是负载均衡器读取客户端的 IP 并将此值添加到标头
X-Forwarded-For
。然后 Istio 将能够根据客户端的 IP 地址理解和过滤请求。
这就是我们必须用来限制我们的一个应用程序基于 IP 的 GET 访问。
x-forwarded-for 标头只是一个逗号分隔的字符串,其中第一个条目是客户端 IP 地址,其余 IP 地址来自网关、代理等
You may also add multiple IP-patterns under
values
.
我希望这会带给你更多。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: our-authorization-policy
namespace: our-namespace
spec:
selector:
matchLabels:
app: our-app-name
action: ALLOW
rules:
- to:
- operation:
methods: ["GET"]
when:
- key: request.headers[x-forwarded-for]
values:
- "xxx.xxx.xxx.xxx,*" # note the trailing '*'