使用 Istio 阻止从 ANY 到服务的传入连接

Using Istio to block incoming connections from ANY to a service

尝试找到使用 Istio 阻止从互联网到 k8s 服务的任何连接的最佳方法。

Istio 策略的最佳选择是什么?

Mixer - 拒绝或列表 Pilot - 路由规则 - 例如注入中止故障 (400) 或目的地策略 - 例如断路(最大连接数 0???)

尝试了以上所有方法,但没有任何效果,而且其中一些配置不是很直观(并且没有很好的记录)。

感谢是否附上工作示例

下面是Injecting HTTP fault policy的例子。

destination: "ratings.default.svc.cluster.local"
route:
- tags:
    version:
httpFault:
  abort:
    percent: 100
    httpStatus: 400
httpStatus: 400

首先,Ist​​io 要求一个“类型”:

Error: Istio doesn't have configuration type , the types are destination-policy, ingress-rule, route-rule

手动添加类型后:

type: route-rule
destination: "ratings.default.svc.cluster.local"
route:
- tags:
    version:
httpFault:
  abort:
    percent: 100
    httpStatus: 400

大喊方法:

I0914 17:44:32.417839 1003 request.go:991] Response Body: 405: Method Not Allowed Error: the server does not allow this method on the requested resource

谢谢

最简单的方法应该是只启用 istio 身份验证并且在您的配置中没有入口。

这样您就可以获得 2 层保护:

  1. 您的服务不可路由(无外部 IP)

  1. 即使互联网流量以某种方式成功命中您的服务,该流量也会被拒绝,因为它不提供 istio 服务 CERT/signed 被您的 istio CA

如果您只是想阻止外部流量进入您的服务,那么路由规则(故障注入)不是正确的方法。您应该通过不将其暴露在您的入口来阻止它。 https://istio.io/v-0.1/docs/tasks/ingress.html

也就是说,您在尝试设置路由规则时遇到错误的原因是您的 yaml 格式错误。 istioctl coammand 期望的是这样的事情:

type: route-rule
name: ratings-block
spec:
  destination: "ratings.default.svc.cluster.local"
  route:
  - tags:
      version: v1
  httpFault:
    abort:
      percent: 100
      httpStatus: 400

查看示例:https://istio.io/v-0.1/docs/tasks/request-routing.html

发现 Istio 的路由规则仅适用于两个连接的端点(客户端 pod 和服务器 pod)都配备了 Envoys。

这本身就应该进一步调查,因为它没有任何意义。

来自集群外部的流量确实需要通过入口进行控制。

Istio 有一个 inside/outside 网格的概念。网格内部的每个服务都有一个边车代理,它们的流量受路由规则的约束。来自网格外部的所有东西都需要通过 Ingress。 Ingress 本身是一个网格服务(代理)。