iptablesとtcを使用してcgroupに属する受信(入力)パケットを監視する方法は?

iptablesとtcを使用してcgroupに属する受信(入力)パケットを監視する方法は?

cgroupでアプリケーションのダウンロード(接続)速度を制限しようとしています。 iptablesでアプリケーションの出力パケットを表示し、表示されたパケットを処理するようにtcフィルタを設定して、アップロード(送信)速度を正常に制限できました。ただし、受信に対して同じ手順を実行しても機能しません。


私が従う制限ステップアップロード:

  1. cgroup別にOUTPUTパケットを表示
$ sudo iptables -I OUTPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-...scope'\
  -j MARK --set-mark 11
  1. ルートqdiscのファームウェアタグ(11)でフィルタリング
$ tc qdisc add dev $IFACE root handle 1: htb default 1 
$ tc filter add dev $IFACE parent 1: protocol ip prio 1 handle 11 fw \
  action police rate 1000kbit burst 10k drop 

これはFirefoxのアップロード速度を1000kbitに正常に制限します。


私が制限しようとしていたステップダウンロード:

  1. cgroup別にINPUTパケットを表示
$ sudo iptables -I INPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-...scope'\
  -j MARK --set-mark 22
  1. qdiscエントリのファームウェアタグ(22)でフィルタリング
$ tc qdisc add dev $IFACE ingress handle ffff:
$ tc filter add dev $IFACE parent ffff: protocol ip prio 1 handle 22 fw \ 
  action police rate 1000kbit burst 10k drop 

iptablesを使用してアプリケーションのダウンロードを正常にブロックできます。

$ sudo iptables -I INPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-....scope' -j DROP

それでは、iptablesは着信パケットをcgroupとしてマークしているように見えますが、何らかの理由でtcがそれをフィルタリングできないか、tcフィルタが適用される前にパケットが消費されていますか?それでは、入力パケットを表示する目的は何ですか?

cgroupに着信パケットをブロックする方法がある場合は、これを制限する方法もあるでしょうか?

ベストアンサー1

@ABのコメントによると:

mangle / INPUTに設定されたフラグは、tcエントリがwaaaayの前に発生するため、tcには影響しません。確認する:en.wikipedia.org/wiki/Netfilter#/media/
...

cgroupのアウトバウンドパケットの接続マークを保存するには、-j CONNMARK --save-mark次のコマンドを使用してインバウンドパケットの接続マークを取得します。TC-Commac、最後にパケットを次にリダイレクトします。IFBアプリ警察。


  1. cgroup接続パケットの表示(双方向):
$ sudo iptables -A OUTPUT -t mangle -m cgroup --path '/user.slice/.../app-firefox-...scope' \
    -j MARK --set-mark 0x11
$ sudo iptables -A OUTPUT -t mangle -j CONNMARK  --save-mark
  1. ifb インターフェイスの生成
$ modprobe ifb
$ ip link set ifb0 up
$ tc qdisc add dev ifb0 root htb #For policing, we don't care about the qdisc type

  1. connmark$IFACEエントリを検索してifb0にリダイレクトします。
$ tc qdisc add dev $IFACE ingress handle ffff:
$ tc filter add dev $IFACE parent ffff: protocol all prio 10 u32 match u32 0 0 flowid 1:1 \
    action connmark \
    action mirred egres s redirect dev ifb0
  1. ifb0 ルート qdisc のタグ付きパケットにポリサーを適用する
$ tc filter add dev ifb0 parent 1: protocol ip prio 20 handle 0x11 fw \
    action police rate 1000kbit burst 10k drop

これはFirefoxのダウンロード速度を1000kbitに制限します。

おすすめ記事