【问题标题】:In a k8s pod with istio injected, why envoy call localhost,the packets pass PREROUTING chain在注入了istio的k8s pod中,为什么envoy调用localhost,数据包通过PREROUTING链
【发布时间】:2021-03-06 19:50:25
【问题描述】:

据我所知,当一个进程发送数据包时,数据包应该只通过 iptables OUTPUT 和 POSTROUTING。

但是当我在注入 istio 的 pod 中进行测试时。我发现当特使调用 localhost:xxx 时,数据包确实通过了 PREROUTING 和 INPUT。为什么会这样?

【问题讨论】:

  • AFAIK istio-init init 容器用于设置 iptables 规则,以便入站/出站流量将通过 sidecar 代理,所以我不确定它为什么不使用预路由和输入? There 是 iptables 示意图,应该可以回答您的问题。另外检查这个link关于特使代理进/出流量方法。如果这能回答您的问题,请告诉我。

标签: kubernetes iptables istio


【解决方案1】:

正如 istio iptables script 中提到的那样。


INPUT 用于丢弃所有入站流量,除了已建立的连接。


PREROUTING 用于处理入站端口。流量将被重定向到 Envoy,Envoy 将处理并转发到本地服务。如果不设置,则 istio iptables 不会拦截任何入站端口。

根据github上的proxy-redirection

入站

入站重定向的 iptable 规则很简单,假设所有流量都需要重定向到代理。如果入站流量需要绕过代理,则需要额外的规则,例如ssh。

iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-port ${ISTIO_PROXY_PORT}


istio 有完整的iptables schematic,因此您实际上可以检查 PREROUTINGINPUT 究竟做了什么。


此外,medium 上还有一篇关于了解 Envoy Sidecar 如何在 Istio 服务网格中拦截和路由流量的博客。如果你想了解整个过程,值得一看。

【讨论】:

  • 我认为 OP 正在专门询问本地流量。通常,来自容器外部的入站流量会通过 PREROUTING,但本地生成的发往本地进程的流量不会。然而不知何故,它在这里。你碰巧知道怎么做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2019-03-23
相关资源
最近更新 更多