nat:PREROUTING 단계 후에 패킷이 손실되는 이유는 무엇입니까?

nat:PREROUTING 단계 후에 패킷이 손실되는 이유는 무엇입니까?

나는 calico의 iptables 규칙을 디버깅하려고 시도하다가 이상한 문제를 발견했습니다. nat:PREROUTING 이후 일부 패킷이 손실되었습니다.

세 개의 서로 다른 노드에 세 개의 포드가 있습니다. 예를 들면 다음과 같습니다.

edge1/net-tool-edge1:10.22.46.41/192.168.0.16
node1/net-tool-node1:10.22.46.16/10.234.102.161
master/net-tool-master:10.22.46.11/10.234.79.169

edge1에는 calico-node가 없지만 edge1에서는 fabedge-agent(다른 CNI)가 실행되고 있음을 지적해야 합니다. Edge1에 문제가 있으므로 net-tool-edge1의 패킷이 Node1에서 손실됩니다. 이것이 바로 제가 calico iptable 규칙을 디버깅하려고 하는 이유입니다. 왜냐하면 fabedge의 버그가 calico에 영향을 미치지 않는다고 생각하기 때문입니다.

trace이 기사에서 제안한 대로 대상을 사용하여 iptables를 디버깅했습니다 .https://www.opsist.com/blog/2015/08/11/how-do-i-see-what-iptables-is-doing.html

Calico가 제대로 작동하면(net-tool-master -> net-tool-node1) 다음과 같은 결과가 나타납니다.

raw:PREROUTING:policy:3
mangle:PREROUTING:rule:1
mangle:cali-PREROUTING:rule:3
mangle:cali-from-host-endpoint:return:1
mangle:cali-PREROUTING:return:5
mangle:PREROUTING:policy:2
nat:PREROUTING:rule:1
nat:cali-PREROUTING:rule:1
nat:cali-fip-dnat:return:1
nat:cali-PREROUTING:return:2
nat:PREROUTING:rule:2
nat:KUBE-SERVICES:return:18
nat:PREROUTING:policy:4
mangle:FORWARD:policy:1
filter:FORWARD:rule:1
filter:cali-FORWARD:rule:1
filter:cali-FORWARD:rule:2
filter:cali-from-hep-forward:return:1
filter:cali-FORWARD:rule:4
filter:cali-to-wl-dispatch:rule:3
filter:cali-tw-cali20fd069ebc8:rule:3
filter:cali-tw-cali20fd069ebc8:rule:4
filter:cali-pri-_zbxMTbNMDRyfczFBup:rule:1
filter:cali-pri-_zbxMTbNMDRyfczFBup:rule:2
filter:cali-tw-cali20fd069ebc8:rule:5
filter:cali-FORWARD:rule:5
filter:cali-to-hep-forward:return:1
filter:cali-FORWARD:rule:6
filter:cali-cidr-block:return:1
filter:cali-FORWARD:return:7
filter:FORWARD:rule:2
filter:FABEDGE-FORWARD:return:4
filter:FORWARD:rule:3
filter:KUBE-FORWARD:return:5
filter:FORWARD:rule:4
filter:KUBE-SERVICES:return:1
filter:FORWARD:rule:5
filter:KUBE-EXTERNAL-SERVICES:return:1
filter:FORWARD:rule:6
filter:DOCKER-USER:return:1
filter:FORWARD:rule:7
filter:DOCKER-ISOLATION-STAGE-1:return:2
filter:FORWARD:rule:12
mangle:POSTROUTING:rule:1
mangle:cali-POSTROUTING:rule:1
mangle:POSTROUTING:policy:2
nat:POSTROUTING:rule:1
nat:cali-POSTROUTING:rule:1
nat:cali-fip-snat:return:1
nat:cali-POSTROUTING:rule:2
nat:cali-nat-outgoing:return:2
nat:cali-POSTROUTING:return:4
nat:POSTROUTING:rule:2
nat:FABEDGE-POSTROUTING:return:3
nat:POSTROUTING:rule:3
nat:KUBE-POSTROUTING:rule:1
nat:POSTROUTING:policy:5

패킷이 손실된 경우(net-tool-edge1 -> net-tool-node1) 추적은 다음과 같습니다.

raw:PREROUTING:policy:4
mangle:PREROUTING:rule:1
mangle:cali-PREROUTING:rule:3
mangle:cali-from-host-endpoint:return:1
mangle:cali-PREROUTING:return:5
mangle:PREROUTING:policy:2
nat:PREROUTING:rule:1
nat:cali-PREROUTING:rule:1
nat:cali-fip-dnat:return:1
nat:cali-PREROUTING:return:2
nat:PREROUTING:rule:2
nat:KUBE-SERVICES:return:18
nat:PREROUTING:policy:4

기본 정책은 패킷을 삭제하는 것 같지만 nat 테이블에 대한 PREROUTING 기본 정책은 다음과 같습니다 ACCEPT.

[root@node1 ~]# iptables -t nat -L PREROUTING --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    cali-PREROUTING  all  --  anywhere             anywhere             /* cali:6gwbT8clXdHdC1b1 */
2    KUBE-SERVICES  all  --  anywhere             anywhere             /* kubernetes service portals */
3    DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

이는 실제로 nat:PREROUTING:policy:4정상적인 흔적에서도 나타나기 때문에 그것이 원인이 아닐 수도 있다고 생각합니다.

무슨 일이 일어났는지 정말 알 수가 없어요. conntrack 기록도 발견되지 않았습니다.

어떤 도움이라도 환영합니다. 미리 감사드립니다.

답변1

패킷이 손실되는 이유는 경로가 없고 rp_filter가 켜져 있기 때문입니다. rp_filter를 끄면 데이터 패킷이 최종적으로 net-tool-node1에 도달할 수 있습니다.

관련 정보