다음 시나리오를 시뮬레이트하려고합니다. 4 개의 우분투 서버 시스템 A, B, C 및 D가있는 경우 시스템 A와 시스템 C 사이에서 네트워크 대역폭을 20 %, A와 B 사이에서 10 % 줄이려고합니다. 네트워크 시뮬레이션 / 스로틀 링 도구를 사용하여이 작업을 수행합니까?
tc
iptables 표시와 함께 사용할 때 수행합니다.
다음 시나리오를 시뮬레이트하려고합니다. 4 개의 우분투 서버 시스템 A, B, C 및 D가있는 경우 시스템 A와 시스템 C 사이에서 네트워크 대역폭을 20 %, A와 B 사이에서 10 % 줄이려고합니다. 네트워크 시뮬레이션 / 스로틀 링 도구를 사용하여이 작업을 수행합니까?
tc
iptables 표시와 함께 사용할 때 수행합니다.
답변:
이렇게하려면 필터 를 tc
단독으로 u32
사용하거나 iptables 표시 와 결합하여 사용할 수 있습니다 (복잡한 필터 구문을 배우고 싶지 않은 경우 더 간단 할 수 있음). 다음 게시물에서 이전 솔루션에 대해 자세히 설명하겠습니다.
예를 들어 10Mbit / s 가상 인터페이스를 실행하는 A, B, C 및 D를 고려해 봅시다 .
당신은 기본적으로 원합니다 :
이를 시뮬레이션하기 위해 브리지에 연결된 4 개의 네트워크 네임 스페이스와 가상 이더넷 인터페이스를 만듭니다.
물론, 귀하의 경우 실제 NIC로 작업하고 브리지는 인프라에 따라 게이트웨이 또는 스위치가됩니다.
시뮬레이션에서 우리는 10.0.0.0/24 네트워크에서 다음과 같은 설정을 할 것입니다.
10.0.0.254
+-------+
| |
| br0 |
| |
+---+---+
|
| veth{A..D}.peer
|
+------------+------+-----+------------+
| | | |
vethA | vethB | vethC | vethD |
+---+---+ +---+---+ +---+---+ +---+---+
| | | | | | | |
| A | | B | | C | | D |
| | | | | | | |
+-------+ +-------+ +-------+ +-------+
10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
먼저 설정 단계를 통해 구성 내용을 이해하고 익숙하지 않은 경우 건너 뛰십시오. 그러나 알아야 할 것은 명령 ip netns exec <namespace> <command>
이 네트워크 네임 스페이스 (즉, 이전 그리기의 상자 중 하나)에서 명령을 실행할 수 있다는 것입니다. 이것은 다음 섹션에서도 사용됩니다.
# Create the bridge
ip link add br0 type bridge
# Create network namespaces and veth interfaces and plug them into the bridge
for host in {A..D} ; do
ip link netns add ${host}
ip link add veth${host} type veth peer name veth${host}.peer
ip link set dev veth${host}.peer master br0
ip link set dev veth${host} netns ${host}
ip netns exec ${host} ip link set veth${host} up
done
# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD
이 시점에서 앞에서 설명한 설정이 있습니다.
원하는 것을 얻기 위해 교통 통제에 들어갈 시간입니다. 이 tc
도구를 사용하면 큐잉 규칙을 추가 할 수 있습니다.
qdisc , 클래스 및 필터의 3 가지 개념이 있습니다 . 이러한 개념은 복잡한 패킷 흐름 관리를 설정하고 원하는 기준 / 기준에 따라 트래픽의 우선 순위를 지정하는 데 사용할 수 있습니다.
간단히 말해서 :
이 모든 것은 일반적으로 나뭇잎이 qdiscs이고 클래스가 노드 인 트리로 작동합니다. 트리 또는 하위 트리의 루트는로 선언 <id>:
되고 하위 노드는로 선언됩니다 <parent_id>:<children_id>
. 이 구문을 명심하십시오.
귀하의 경우 A를 가져 와서 설정하려는 트리를 렌더링하십시오 tc
.
1:
|
|
|
1:1
/ | \
/ | \
/ | \
1:10 1:20 1:30
| | |
| | |
:10 :20 :30
설명 :
1:
장치 vethA에 연결된 루트 qdisc이며, htb
계층 토큰 버킷 과 같이 명시 적으로 가져옵니다 (장치의 기본 qdisc 는 OS에 따라 다르거 pfifo
나 pfifo_fast
OS에 따라 다름). 대역폭 관리에 특히 적합합니다. 이 수준에서 정의 된 필터와 일치하지 않는 패킷은 1:30
클래스 로 이동합니다 .1:1
htb
디바이스의 전체 트래픽을 10Mbit / s로 제한 하는 클래스 가됩니다 .1:10
htb
출력 트래픽을 9Mbit / s (10Mbit / s의 90 %)로 제한 하는 클래스 가됩니다 .1:20
htb
출력 트래픽을 8Mbit / s (10Mbit / s의 80 %)로 제한 하는 클래스 가됩니다 .1:30
htb
트래픽을 10Mbit / s (폴백)로 제한 하는 클래스 가됩니다 .:10, :20, :30
있는 sfq
확률 공정성 큐의 qdisc를. 다시 말해,이 qdisc는 흐름을 기반으로 전송 스케줄링에서 공정성을 보장 할 것입니다.이 모든 것은 다음 명령으로 설정됩니다.
ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10
마지막으로 필요한 것은 필터를 추가하여 대상 IP가 B 인 1:10
IP 패킷이 클래스 로 이동 하고 대상 IP가 C 인 IP 패킷이 클래스 로 이동하는 필터를 추가하는 것입니다 1:20
.
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20
이제 아이디어를 얻었 tc
으므로 B와 C에 비슷한 규칙을 추가해야합니다. 그러므로 이러한 굴착 장치에서 A쪽으로의 전송도 형성됩니다.
이제 테스트 해 봅시다. 이것을 개인적으로 사용하는 데 사용하기 위해 iperf
클라이언트 또는 서버로 실행할 수있는 단일 바이너리로 구성되어 있으며 두 호스트간에 최대한 많은 트래픽을 자동으로 보냅니다.
A와 B 사이 :
$ ip netns exec B iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 2.0- 4.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 5] 4.0- 6.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 5] 6.0- 8.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 5] 8.0-10.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 5] 0.0-10.1 sec 10.8 MBytes 8.91 Mbits/sec
우리는 9Mbit / s 대역폭을 가지고 있습니다.
A와 C 사이 :
$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 2.0- 4.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 5] 4.0- 6.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 5] 6.0- 8.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 5] 8.0-10.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 5] 0.0-10.1 sec 9.62 MBytes 7.98 Mbits/sec
우리는 8Mbit / s 대역폭을 가지고 있습니다.
A와 D 사이 :
$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.62 MBytes 11.0 Mbits/sec
[ 5] 2.0- 4.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 4.0- 6.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 6.0- 8.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 8.0-10.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 0.0-10.2 sec 12.0 MBytes 9.89 Mbits/sec
여기에 우리의 가상 인터페이스 최대 속도가 10 메가 비트를 / S 에 도달했다.
각 htb
매개 변수 의 첫 번째 측정 버스트 는 적절한 매개 변수를 조정하여 클래스 에서 더 잘 처리 할 수 있습니다 .
제거 :
1:
: tc filter del dev vethA parent 1: prio 1 u32
.1:
: tc filter del dev vethA parent 1:
.1:20
과 그 자녀들 : tc class del dev vethA parent 1:1 classid
1:20
.tc qdisc del dev vethA
.시뮬레이션 세트를 정리하려면 다음을 수행하십시오.
# Remove veth pairs and network namespaces
for host in {A..D} ; do
ip link del dev veth${host}.peer
ip netns del ${host}
done
# Remove the bridge
ip link del dev br0
가장 좋은 방법은 tc 도구를 현재 통합 된 (최소한 우분투 서버에서) netem 모듈과 함께 사용하는 것입니다. 이 기사에서 자세한 정보는 Stackoverflow 에서 찾을 수 있습니다 .
물방울이 잘 작동합니다.
이 토론은 몇 가지 제한 사항을 보여줍니다 : /unix/109973/how-to-change-speed-limit-of-running-trickle-instance