나는 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에 도달할 수 있습니다.