web-dev-qa-db-ja.com

--set-markオプションはNetfilter(IPTABLES)でどのように機能しますか?

Netfilterでは、オプション--set-markmangleテーブルを通過するパケット。

インターネット上のチュートリアルと例の大部分は、これは次のようにパケットにマークを追加するだけだと言いますが、どのマークが設定され、それがパケットのどこに存在するかについての詳細はありません:

iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1

私の質問は:

  • どのような種類のマークが設定され、パケット内のこのマークが正確にどこにあるのですか?
3
ivanleoncz

マークは、ネットワークパケットに付加される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
  • その候補の後継者 nftables

そして他のいくつかの場所...

このマークの主な目的は、これらのすべてのネットワークパーツを一種のメッセージとして使用することで相互に対話させることです。 NetfilterとGeneral Networkingのパケットフロー は、これらの要素がパケットの処理を受信する順序、つまりそのマークを受信する順序を確認するのに役立ちます。

Fwmarkの他にも関連するマークがあります:

  • connmark 、これはパケットのsk_buffとともには格納されませんが、conntrackエントリ追跡パケットflowsに格納されます。そのconnmarkはもちろん、 connmark 一致と CONNMARK ターゲットを使用してiptablesで使用できます。使用例は次のとおりです。 Netfilter Connmark To Linux and beyond! 。これにより、1つの単一パケットに基づいて行われた決定が記憶され、同じ接続のすべてのパケットに適用されます。
  • secmark および同様に関連する connsecmark は、 SELinux などのLinuxセキュリティモジュールと対話することを目的としています。
5
A.B