kube-ovn icon indicating copy to clipboard operation
kube-ovn copied to clipboard

pod内部获取到的web请求的源ip不是外部请求的真实ip

Open geniusxiong opened this issue 2 years ago • 1 comments

Expected Behavior

pod内部获取到的web请求的源ip是外部请求发起的IP地址。

Actual Behavior

pod内部获取到的web请求的源ip是node节点在join子网的IP地址。

Steps to Reproduce the Problem

  1. 集群外node访问nodeport 的ip
  2. pod内部打印remoteAddr

Additional Info

  • Kubernetes version:

    Output of kubectl version:

    [root@master ~]# kubectl version
    

Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:58:59Z", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", Compiler:"gc", Platform:"linux/amd64"}


- kube-ovn version:

kube-ovn version v1.8.1 or v1.9.3


- operation-system/kernel version:

**Output of `awk -F '=' '/PRETTY_NAME/ { print $2 }' /etc/os-release`:**
**Output of `uname -r`:**

[root@master ~]# cat /etc/os-release NAME="NFS Server" VERSION="4.0 (RTM2.9)" ID="NFS" ID_LIKE="NFS" VERSION_ID="4.0" SYSTEM_VERSION="4.0.200824" PRETTY_NAME="NFS Server 4.0 (RTM2.9)" ANSI_COLOR="0;31" HOME_URL="http://www.nfschina.com" [root@master ~]# uname -r 4.19.113-1.nfs.25.4.x86_64

外部节点为172.18.171.10,访问nodeport image

pod内部打印的remoteAddr为: image

抓包: image image

pod内获取remote ip的程序段: image

我们希望应用内部获取到的source ip 不是100.64.0.5 而是 172.18.171.10

geniusxiong avatar Jun 02 '22 08:06 geniusxiong

请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。

那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。

目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。

xujunjie-cover avatar Jun 23 '22 17:06 xujunjie-cover

请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。

那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。

目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。

请问,“访问时流量都会 snat 成你访问 node 的 ip”,这里的源IP与snat之后的nodeIP是否存在一对一的关系?是否可以抓到呢?

CraneRZz avatar Oct 18 '22 02:10 CraneRZz

请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。 那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。 目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。

请问,“访问时流量都会 snat 成你访问 node 的 ip”,这里的源IP与snat之后的nodeIP是否存在一对一的关系?是否可以抓到呢?

多对一的关系,都会 snat 成访问 Node 的 ip。snat 成匹配路由网卡的那个 IP,如 ovn0 的 IP

xujunjie-cover avatar Oct 18 '22 02:10 xujunjie-cover

请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。 那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。 目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。

请问,“访问时流量都会 snat 成你访问 node 的 ip”,这里的源IP与snat之后的nodeIP是否存在一对一的关系?是否可以抓到呢?

多对一的关系,都会 snat 成访问 Node 的 ip。snat 成匹配路由网卡的那个 IP,如 ovn0 的 IP

明白了,谢谢

CraneRZz avatar Oct 18 '22 02:10 CraneRZz

请问是用的 iptables 吗?外部访问 nodeport 都会通过 iptables 的。 那无论哪种 cni,访问时流量都会 snat 成你访问 node 的 ip ,然后转到对应 node 上再访问到 pod;所以在 kube-ovn cni 情况下,pod 内部收到的源地址都是你所访问 node ovn0 的 ip。 目前如果你期望 pod 内部获取到的请求的源 ip 是外部的真是 ip,那需要将 svc 的 externalTrafficPolicy 改为 Local;不过对应的会有一些限制。比如你只能访问 pod 所在 node 的 ip + nodeport。

请问,“访问时流量都会 snat 成你访问 node 的 ip”,这里的源IP与snat之后的nodeIP是否存在一对一的关系?是否可以抓到呢?

多对一的关系,都会 snat 成访问 Node 的 ip。snat 成匹配路由网卡的那个 IP,如 ovn0 的 IP

如果我想看到哪些源IP snat成了 ovn0 的 IP,我应该怎样去抓取呢?

CraneRZz avatar Oct 18 '22 03:10 CraneRZz

@CraneRZz 你可以在 pod 的 netNS 里抓网卡或者直接在 pod 内部抓包

xujunjie-cover avatar Oct 18 '22 03:10 xujunjie-cover

@CraneRZz 你可以在 pod 的 netNS 里抓网卡或者直接在 pod 内部抓包

好的,感谢您的耐心解答!

CraneRZz avatar Oct 18 '22 03:10 CraneRZz