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로 제한합니다.

관련 정보