iptablesトレースレコードのIDが0の理由は何ですか?

iptablesトレースレコードのIDが0の理由は何ですか?

ネットワークの問題を分析するためにiptables Traceを使用しますが、ACKパケットのレコードIDは常に0です。

[ 3556.086666] TRACE: raw:OUTPUT:policy:2 IN= OUT=lo SRC=10.233.52.186 DST=10.233.52.186 ID=51512  PROTO=TCP SPT=54186 DPT=80 SYN      
[ 3556.086772] TRACE: nat:OUTPUT:rule:1 IN= OUT=lo SRC=10.233.52.186 DST=10.233.52.186 ID=51512  PROTO=TCP SPT=54186 DPT=80 SYN      
[ 3556.086784] TRACE: nat:KUBE-SERVICES:rule:1 IN= OUT=lo SRC=10.233.52.186 DST=10.233.52.186 ID=51512  PROTO=TCP SPT=54186 DPT=80 SYN      
[ 3556.086793] TRACE: nat:KUBE-MARK-MASQ:rule:1 IN= OUT=lo SRC=10.233.52.186 DST=10.233.52.186 ID=51512  PROTO=TCP SPT=54186 DPT=80 SYN      
[ 3556.086803] TRACE: nat:KUBE-MARK-MASQ:return:2 IN= OUT=lo SRC=10.233.52.186 DST=10.233.52.186 ID=51512  PROTO=TCP SPT=54186 DPT=80 SYN      MARK=0x4000 
[ 3556.086814] TRACE: nat:KUBE-SERVICES:rule:2 IN= OUT=lo SRC=10.233.52.186 DST=10.233.52.186 ID=51512  PROTO=TCP SPT=54186 DPT=80 SYN      MARK=0x4000 
[ 3556.086825] TRACE: nat:KUBE-NODE-PORT:return:2 IN= OUT=lo SRC=10.233.52.186 DST=10.233.52.186 ID=51512  PROTO=TCP SPT=54186 DPT=80 SYN      MARK=0x4000 
[ 3556.086846] TRACE: nat:KUBE-SERVICES:rule:3 IN= OUT=lo SRC=10.233.52.186 DST=10.233.52.186 ID=51512  PROTO=TCP SPT=54186 DPT=80 SYN      MARK=0x4000 
[ 3556.086891] TRACE: raw:OUTPUT:rule:1 IN= OUT=eth0 SRC=10.233.52.186 DST=10.22.46.48 ID=51512  PROTO=TCP SPT=54186 DPT=30080 SYN      MARK=0x4000 
[ 3556.086900] TRACE: raw:OUTPUT:policy:2 IN= OUT=eth0 SRC=10.233.52.186 DST=10.22.46.48 ID=51512  PROTO=TCP SPT=54186 DPT=30080 SYN      MARK=0x4000 
[ 3556.086918] TRACE: filter:OUTPUT:policy:1 IN= OUT=eth0 SRC=10.233.52.186 DST=10.22.46.48 ID=51512  PROTO=TCP SPT=54186 DPT=30080 SYN      MARK=0x4000 
[ 3556.086928] TRACE: nat:POSTROUTING:rule:1 IN= OUT=eth0 SRC=10.233.52.186 DST=10.22.46.48 ID=51512  PROTO=TCP SPT=54186 DPT=30080 SYN      MARK=0x4000 
[ 3556.086939] TRACE: nat:KUBE-POSTROUTING:rule:3 IN= OUT=eth0 SRC=10.233.52.186 DST=10.22.46.48 ID=51512  PROTO=TCP SPT=54186 DPT=30080 SYN      MARK=0x4000 
[ 3556.086948] TRACE: nat:KUBE-POSTROUTING:rule:4 IN= OUT=eth0 SRC=10.233.52.186 DST=10.22.46.48 ID=51512  PROTO=TCP SPT=54186 DPT=30080 SYN      
[ 3556.087562] TRACE: raw:PREROUTING:policy:2 IN=eth0 OUT= SRC=10.22.46.48 DST=10.22.46.11 ID=0  PROTO=TCP SPT=30080 DPT=39830 SYN    
[ 3556.087592] TRACE: filter:INPUT:rule:1 IN=eth0 OUT= SRC=10.22.46.48 DST=10.233.52.186 ID=0  PROTO=TCP SPT=30080 DPT=54186 SYN    
[ 3556.087606] TRACE: filter:KUBE-NODE-PORT:return:2 IN=eth0 OUT= SRC=10.22.46.48 DST=10.233.52.186 ID=0  PROTO=TCP SPT=30080 DPT=54186 SYN    
[ 3556.087617] TRACE: filter:INPUT:policy:2 IN=eth0 OUT= SRC=10.22.46.48 DST=10.233.52.186 ID=0  PROTO=TCP SPT=30080 DPT=54186 SYN

なぜ?

ベストアンサー1

詳細については、以下で説明します。RFC 6864:IPv4 IDフィールド仕様が更新されました。以下のすべての引用はこのRFCで引用されており、順序が必ずしも一致しているわけではありません。

IPv4 ID フィールドは、再構成中のオフセットは同じですが、2 つの異なるパケットに属する 2 つのフラグメントを区別するために使用されます。断片がなければ、特別な処理はありません。

SYNとSYN / ACKの両方にDF(Do Not Fragment)フラグが設定されているため、断片化できないため、IDが無駄になります。

>> DF = 1のIPv4データグラムは断片化されません。

o 原子データグラム: (DF==1)&&(MF==0)&&(frag_offset==0)

原子データグラムから、IPv4 IDフィールドは意味がないので、任意の値に設定できます。
アトミックデータグラムは、ソースアドレス/宛先アドレス/プロトコルタプルに一意のIDを必要としなくなりました。
:

>>ソースソースは、アトミックデータグラムのIPv4 IDフィールドを任意の値に設定できます。

Linuxは、DFフラグがある限り、すべてのSYN / ACKに0を使用します。TCPクイックオープンSYN / ACKに実際のデータも含まれていると変更されることがあります。

これを行うには、断片化が可能な場合(たとえばDF = 0)、断片化が発生した場合(frag_offset> 0またはMF = 1など)、ソースアドレス/宛先アドレス/プロトコルタプル内でIDが一意である必要があります。

したがって、この資料では断片化と再組み立てに対してのみこのフィールドの値を定義します。

>>IPv4 IDフィールドは、断片化および再組み立て以外の目的で使用しないでください。

RFC 6864は、トラフィックを識別するためにIDに依存してはならないことを明確に述べています。

>>ソースソースは、アトミックデータグラムのIPv4 IDフィールドを任意の値に設定できます。

>> IPv4ヘッダーをチェックするすべてのデバイス原子データグラムのIPv4 IDフィールドは無視する必要があります。


ボーナス

トラフィックを識別する非常に制限された方法を提供します。これが必要ですnftablesiptablesこれはできません)。ペイロードの変更によってIPフィールドを直接操作できないか、IPチェックサムを正しく再計算できません。したがって、単一のID値を一度だけ割り当てるように制限され、チェックip id setサムが正しく再計算されます。 rvalueを入力できないため(@th,16,16gets typeなどtcp dport)、クライアントソースポート(整数の保持@th,17,15)の下位15ビットを再利用することを選択しました。これはSYN / ACKの宛先ポートです。

customsynackid.nft:

table ip customsynackid        # for idempotence
delete table ip customsynackid # for idempotence

table ip customsynackid {
    chain prerouting { type filter hook prerouting priority -310; policy accept;
    ip frag-off & 0x4000 != 0 tcp flags syn|ack ip id == 0 ip id set @th,17,15
    }
}

これはルーター(K8sノードなど)で実行されるように設計されており、適用するインターフェースを選択して補完することができます。ポストルーティング変える事前ルーティング。エンドポイントで実行できます(たとえば、ポッドで次の機能を使用できる場合)。nftablesそうではありません)hook preroutingただhook output

このセットIDフィールド到着する(TCPプロトコルdportと0x7fff)。たとえば、ポート37142からポート80へ(したがってポート80からポート37142へ)TCP接続への応答は、IDフィールドが4374(37142&0x7fff = 4374)のSYN / ACKを提供します。

おすすめ記事