Netfilterでは、オプション--set-mark
mangle
テーブルを通過するパケット。
インターネット上のチュートリアルと例の大部分は、これは次のようにパケットにマークを追加するだけだと言いますが、どのマークが設定され、それがパケットのどこに存在するかについての詳細はありません:
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
私の質問は:
マークは、ネットワークパケットに付加される32ビットの整数値です。それとやり取りする一部のネットワークパーツ(以下を参照)は、この値に対してビット単位の演算を実行できます。その結果、1つの32ビット値から32フラグのコレクションまで、またはフラグとより小さい値の組み合わせの間で解釈できます。その使用を整理することを選択します(tc
はこれを行うことができません)。もちろん、このマークは、Linuxカーネルによって処理される限り存在します。それはネットワーク上に存在することができないので、それは純粋に仮想的で内部的なものです。使用場所に応じて、ファイアウォールマーク、fwmark、または単にマークと呼ばれることがあります。
カーネルによって処理される各ネットワークパケットは、 sk_buff
で定義される linux/include/linux/skbuff.h
と呼ばれる構造によって処理されます。この構造には、該当する場合、パケットに関連するさまざまなメタデータが含まれます。たとえば、IPsec情報(存在する場合)、関連するconntrackエントリがいったん検索された場合など、その マーク も含まれます。
ネットワークスタックのさまざまな部分がこのマークを読み取り、その値に基づいて動作を変更したり、(再)書き込みしたりできます。例:
tc
、ip rule
(例:ip rule add fwmark 1 lookup 42
)で設定された特別なルールを設定して、このfwmarkでルーティングの決定を変更できます(例:これらのパケットを他のインターフェイスに送信するルーティングテーブルを使用する)デフォルト)、iptables
、そして他のいくつかの場所...
このマークの主な目的は、これらのすべてのネットワークパーツを一種のメッセージとして使用することで相互に対話させることです。 NetfilterとGeneral Networkingのパケットフロー は、これらの要素がパケットの処理を受信する順序、つまりそのマークを受信する順序を確認するのに役立ちます。
Fwmarkの他にも関連するマークがあります:
connmark
、これはパケットのsk_buffとともには格納されませんが、conntrackエントリ追跡パケットflowsに格納されます。そのconnmarkはもちろん、 connmark
一致と CONNMARK
ターゲットを使用してiptablesで使用できます。使用例は次のとおりです。 Netfilter Connmark To Linux and beyond! 。これにより、1つの単一パケットに基づいて行われた決定が記憶され、同じ接続のすべてのパケットに適用されます。secmark
および同様に関連する connsecmark
は、 SELinux などのLinuxセキュリティモジュールと対話することを目的としています。