act_connmark

act_connmark

ネットワークトポロジがあります。

Server <-> router1 <-> router2 <-> router3 <-> edgeRouter <-> "internet"

すべてのルータはLinuxベースであり、iptablesをサポートしています。

サーバーはiptables(--set class X:Y)を使用してトラフィックカテゴリを設定し、ルータは設定されたカテゴリに従っていくつかの「ルーティング」を実行します。 (カテゴリは元のアプリケーションによって異なります)。

エッジルータはISPを介してインターネットにパケットを転送し、返信(応答)パケットを受信します。受信した応答は間違いなくトラフィックカテゴリを設定していません。

iptablesリターンパケット(NATスタイル、「ESTABLISHED」接続のパケット)を追跡し、元のパケットと同じトラフィッククラスでリターンパケットにタグを付けるためにエッジルータでルール(mangleまたは同様のもの)を使用できますか?エッジルーターでNATを有効にすることは問題ではありません。

TLDR:iptablesを使用して、同じ接続の同じクラスの受信パケットを送信パケットに分類する方法。

ベストアンサー1

TLDR:iptablesを使用して、同じ接続の同じクラスの受信パケットを送信パケットに分類する方法。

tcあなたの質問でどの分類方法が言及されているかは完全には明確ではありませんが、一般的にトラフィック調整とキュールールについて話している場合は、次のものが適用されます。

act_connmark

受信 qdisc 処理は netfilter 以前に実行されるため、iptables を使用して受信トラフィックを直接分類することはできません (IMQ でカーネルを再コンパイルせずに以下を参照)。ただし、接続追跡を使用して間接的に分類できます。カーネルで利用可能な場合は、この目的のために設計され、それをサポートするフィルタにアクションを追加するact_connmarkモジュールを使用できますconnmarktc

# 0. Load modules and IFB device
modprobe act_connmark
modprobe ifb
ip link set ifb0 up

# 1. Classify packets by marking them
iptables -t mangle -A POSTROUTING -p tcp --sport 22 -j MARK --set-mark 1

# 2. Append rule to save the packet mark to the connection mark
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

# 3. Restore the connection mark to the packet mark with 'action connmark'
#    before redirecting to the ifb-device
tc qdisc add dev eth0 handle ffff: ingress
tc qdisc add dev ifb0 handle 1: root
tc filter add dev eth0 parent ffff: prio 1 \
   protocol ip u32 match u32 0 0 flowid ffff:1 \
   action connmark \
   action mirred egress redirect dev ifb0

# 4. Apply filters to classify packets based on their mark
# ... setup qdiscs and classes as usual on ifb0... then
tc filter add dev ifb0 parent 1: prio 1 protocol ip handle 1 fw classid 1:01

IMQ

私が理解したのは、IMQ(Intermediate Queue Device)はnetfilterによって処理された後に仮想デバイスを再ループしてカーネルの通常のトラフィックをバイパスすることです。これはカーネルツリーとマージされないため、ほとんどのディストリビューションには含まれず、ユーザーはカーネルに直接パッチを適用してコンパイルする必要があります。これにより、次のように動作します。

# classify and save mark in POSTROUTING as before... then
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -j IMQ --todev 0

# ... setup qdiscs and classes as usual on imq0 ... then
tc filter add dev imq0 parent 1: prio 1 protocol ip handle 1 fw classid 1:01

また、iptablesを使用して受信の高度な分類を実行できます。これは、通常のu32フィルタ(たとえば、任意のポート範囲)を使用すると非常に面倒です。しかし、このソリューションのパフォーマンスやエレガンスについては話すことはできません。

おすすめ記事