ネットワークの問題を分析するために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フィールドは無視する必要があります。。
ボーナス
トラフィックを識別する非常に制限された方法を提供します。これが必要ですnftables(iptablesこれはできません)。ペイロードの変更によってIPフィールドを直接操作できないか、IPチェックサムを正しく再計算できません。したがって、単一のID値を一度だけ割り当てるように制限され、チェックip id set
サムが正しく再計算されます。 rvalueを入力できないため(@th,16,16
gets 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を提供します。