--set-mark
Netfilterでは、このテーブルを通過するmangle
パケットを選択できます。
インターネット上のほとんどのチュートリアルと例では、以下のようにパケットにフラグを追加するだけだと言いますが、どのフラグが設定されており、パケットの場所についての詳細はありません。
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
私の質問は次のとおりです
- どのフラグが設定されており、パケットの正確にどこにありますか?
答え1
タグは、ネットワークパケットに添付されている32ビット整数値です。対話するネットワークの一部(以下を参照)は、この値に対してビット単位の操作を実行することができます。これは、処理方法に応じて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、
- さまざまな(通常トンネル)インターフェイスタイプはフラグを設定または対話できます。ワット, ersspan, gre, gretap, ipip, 座って,ラインバッカー...またはXFRM変換(
ip xfrm state/policy
)。タイプによっては、このフラグはペイロードまたはエンベロープ(たとえば、WireGuard)に設定され、時にはカプセル化解除/カプセル化プロセス中に継承されることがあります。 - アウトレットオプション
SO_MARK
、 - 電子BPF、
他にもありますが…
このタグの主な目的は、これを一種のメッセージとして使用して、これらすべてのネットワーク部分が互いに対話できるようにすることです。これ一般ネットワークのNetfilterとパケットフローこれらの要素がパケット処理とその指示をどの順序で受信するかを確認することが役に立ちます。
fwmarkに加えて、他の関連マーカーがあります:
connmark
、パケットのsk_buffには保存されず、conntrackエントリ追跡パケットには保存されます。流れ。もちろん、iptablesでもconnmarkを使うことができます。connmark
一致CONNMARK
使用例のある対象:Netfilter ConnmarkをLinux以上に!。これにより、単一のパケットに基づいた決定を覚えてから、同じ接続上のすべてのパケットに適用できます。secmark
同様に関連しています。connsecmark
以下のLinuxセキュリティモジュールと対話するように設計されています。SELinux。