"tc", "htb" 및 "iptables"를 사용하여 "IP"당 업로드 대역폭을 제한할 수 있습니까? (다운로드 제한이 필요하지 않습니다)

"tc", "htb" 및 "iptables"를 사용하여 "IP"당 업로드 대역폭을 제한할 수 있습니까? (다운로드 제한이 필요하지 않습니다)

질문

internet비슷한 검색을 했지만 Limit 에 대한 정보를 많이 찾을 수 없었습니다 upload. 제시된 솔루션은 제한적인 기준이 아닙니다 IP.이것그러나 LAN 전체.

             +-----+
+--------+   |  S  |
| User A |---+  W  |
+--------+   |  I  |
+--------+   |  T  |     +--------+        +----------+
| User B |---+  C  +-----| Router |--------| Internet |
+--------+   |  H  |     +--------+        +----------+
   ....     ... / ...
+--------+   |  H  |
| User N |---+  U  |
+--------+   |  B  |
             +-----+
  • UserA:172.16.10.2
  • UserB:172.16.10.3-RouterPrivate:172.16.0.1
  • UserC:172.16.10.4

나는 단지 upload제한 172.16.10.3하고 172.16.10.4사용하고 싶습니다 tc htb.iptables

내가 시도한 것

내 요구 사항에 따라 스크립트를 수정했습니다.

IF_INET=external

# upload bandwidth limit for interface
BW_MAX=2000

# upload bandwidth limit for 172.16.16.11
BW_CLIENT=900


# first, clear previous settings
tc qdisc del dev ${IF_INET} root

# top-level htb queue discipline; send unclassified data into class 1:10
tc qdisc add dev ${IF_INET} root handle 1: htb default 10

# parent class (wrap everything in this class to allow bandwidth borrowing)
tc class add dev externel parent 1: classid 1:1 htb \
  rate ${BW_MAX}kbit ceil ${BW_MAX}kbit

# two child classes
#

# the default child class
tc class add dev ${IF_INET} parent 1:1 \
  classid 1:10 htb rate $((${BW_MAX} - ${BW_CLIENT}))kbit ceil ${BW_MAX}kbit

# the child class for traffic from 172.16.16.11
tc class add dev ${IF_INET} parent 1:1 \
  classid 1:20 htb rate ${BW_CLIENT}kbit ceil ${BW_MAX}kbit

# classify traffic
tc filter add dev ${IF_INET} parent 1:0 protocol ip prio 1 u32 \
  match ip src 172.16.16.11/32 flowid 1:20

하지만 이것은아니요업로드를 제한하는 데 사용됩니다. 그렇다면 해결책은 무엇입니까?

답변1

.10.3 및/또는 .10.4 대신 172.16.16.11을 소스 IP로 사용하는 이유는 무엇입니까? !

로컬 open-vswitch 인터페이스에 연결된 로컬 VM을 사용합니다("nc -klvp 42 >/dev/null" 실행). 특정 소스 IP에 대한 트래픽 조절을 보여주기 위해 "class 1:20"에서 "ceil" 매개변수를 제거했습니다.

tc스크립트

#!/bin/bash
export IF_INET=ovs-br0
export UNIT=kbps

export BW_MAX=2048
export BW_CLIENT=128

tc qdisc del dev ${IF_INET} root &>/dev/null
tc qdisc add dev ${IF_INET} root handle 1: htb default 10

tc class add dev ${IF_INET} parent 1: classid 1:1 htb rate ${BW_MAX}$UNIT
tc class add dev ${IF_INET} parent 1:1 classid 1:10 htb rate $((${BW_MAX} - ${BW_CLIENT}))$UNIT ceil ${BW_MAX}$UNIT
tc class add dev ${IF_INET} parent 1:1 classid 1:20 htb rate ${BW_CLIENT}$UNIT 

tc filter add dev ${IF_INET} parent 1:0 protocol ip prio 1 u32 match ip src 172.16.10.3/32 flowid 1:20
tc filter add dev ${IF_INET} parent 1:0 protocol ip prio 1 u32 match ip src 172.16.10.4/32 flowid 1:20

소스 IP가 다른 로컬 IP 주소/경로

section61:~ # ip a s dev ovs-br0 | grep 172.16.1
inet 172.16.10.4/24 scope global ovs-br0
inet 172.16.10.3/24 scope global secondary ovs-br0
inet 172.16.10.5/24 scope global secondary ovs-br0
inet 172.16.10.6/24 scope global secondary ovs-br0

section61:~ # ip route get 172.16.10.13 | grep -v cache 
172.16.10.13 dev ovs-br0 src 172.16.10.3 uid 0 
section61:~ # ip route get 172.16.10.14 | grep -v cache 
172.16.10.14 dev ovs-br0 src 172.16.10.4 uid 0 
section61:~ # ip route get 172.16.10.15 | grep -v cache 
172.16.10.15 dev ovs-br0 src 172.16.10.5 uid 0 
section61:~ # ip route get 172.16.10.16 | grep -v cache 
172.16.10.16 dev ovs-br0 src 172.16.10.6 uid 0 

서로 다른 소스 IP를 사용하는 두 개의 데이터 스트림

section61:~ # dd if=/dev/zero of=/dev/stdout count=$((1*1024*1024)) bs=1024 | pv | nc 172.16.10.13 42
7.03MiB 0:00:58 [ 120KiB/s] [                                                                          <=>               ]

section61:~ # dd if=/dev/zero of=/dev/stdout count=$((4*1024*1024)) bs=1024 | pv | nc 172.16.10.15 42
 135MiB 0:01:17 [1.76MiB/s] [                                        <=>                                                 ]

트래픽 조절을 위해 qdisc 클래스를 확인하려면 다음을 실행하는 것이 좋습니다.배몬

힌트

  • 1:20 수준에서 "ceil"을 사용하는 경우 1:10을 완전히 포화시키려면 두 개의 데이터 스트림을 동시에 생성해야 합니다! 그렇지 않으면 1시 20분에 1시 10분의 사용되지 않은 알림을 받게 됩니다.
  • "iptables mangle .. match-set"을 사용하여 패킷을 분류하는 것도 작동합니다.

오픈수세 도약 15.1 - 리눅스 4.12.14-lp151.28.75-default

관련 정보