nat:PREROUTINGステップ後にパケットが失われるのはなぜですか?

nat:PREROUTINGステップ後にパケットが失われるのはなぜですか?

私はcalicoのiptablesルールをデバッグしようとしましたが、奇妙な問題を見つけました。 nat:PREROUTING以降、一部のパケットが失われました。

3つの異なるノードに3つのポッドがあります。たとえば、次のようになります。

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.49.16

edge1にはcalico-nodeはありませんが、edge1ではfabedge-agent(他のCNI)が実行されていることを指摘する必要があります。 Edge1に問題があるため、net-tool-edge1のパケットはNode1で失われます。これが私がcalico iptableルールをデバッグしようとしている理由です。なぜなら、fabedgeのバグがカリコに影響を与えないと思うからです。

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に到達する可能性があります。

関連情報