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フィルタ(たとえば、任意のポート範囲)を使用すると非常に面倒です。しかし、このソリューションのパフォーマンスやエレガンスについては話すことはできません。

答え2

送信パケットにはアプリケーションベースのカテゴリセットがあるため(各アプリケーションが特定のTCP / UDPポートセットを使用すると推測されます)、そのポートに基づいて受信パケットを再分類できます。

例えば。 EdgeRouterで設定された(アウトバウンド)HTTPセッションを再分類します。

iptables -t mangle -A INPUT -i [WANIF] -m state --state ESTABLISHED,RELATED -p tcp -m tcp --sport 80 -j DSCP --set-dscp-class cs3

注:INPUTの代わりにFORWARDテーブルを使用する必要があります。

しかし、送信パケットの追跡と発信中にどのカテゴリがあるかを確認し、同じフローの受信パケットに同じカテゴリを適用することは依然として可能ですが、多くの作業が必要であり、conntrackインターフェイスのカスタマイズが必要になる場合があります。フィルタモジュール。

答え3

どの設定を使用しましたか--set class X:Y?正確には何ですか? iptablesのマニュアルページを検索しましたが、説明したものと似たものが見つかりませんでした。私の考えでは、次のようなことをしたいかもしれません。

  1. 「Server」でIPパケットのTOSフィールドを表示します。
  2. ルータにパケットに対して特別な処理を実行させる。
  3. 「edgeRouter」で、次の操作を行います。

      # If a packet arrives from LAN, is marked and we know nothing about the
      #+ connection, then mark the connection
    iptables -t mangle -A PREROUTING -i $LAN_IF -m tos --tos $TOS_VAL -m \
      connmark \! --mark $TOS_VAL -j CONNMARK --set-xmark $TOS_VAL
    
      # Reset the TOS value when going out to prevent strange interpretation
    iptables -t mangle -A POSTROUTING -o $WAN_IF -m tos --tos $TOS_VAL \
      -j TOS --set-tos 0x00
    
      # If a packet arrives from WAN and the connection is marked, then mark
      #+ the packet so that the routers in LAN know how to deal with it
    iptables -t mangle -A PREROUTING -i $WAN_IF -m connmark --mark $TOS_VAL \
      -j TOS --set-tos $TOS_VAL
    

関連情報