나는 tc 와 netem을 처음 사용 합니다. 특정 IP 주소로 전송되는 패킷을 지연시키고 싶습니다. 그러나 아래 명령을 사용하면 IP 주소 1.2.3.4가 아닌 시스템의 모든 패킷이 지연됩니다.
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1
내 생각에 나머지 모든 트래픽이 netem을 통과하지 않도록 지정하려면 끝에 모든 종류의 catch-all 필터가 필요합니다. 그러나 나는 일을 할 수 없습니다. 어떻게 작동합니까?
답변
좋아, 나는 내 자신의 문제를 해결했다. 위의 처음 3 줄 ( “tc qdisc”줄)을 실행하면 아직 필터가 없기 때문에 모든 패킷이 지연됩니다. 네 번째 줄은 단일 IP 주소의 패킷 만 지연하도록 변경합니다. “지연”목록에 추가 IP 주소를 추가하기 위해 추가 필터 라인을 추가 할 수 있습니다. 따라서 필터를 가리 키지 않고 “netem delay”라인을 만들지 마십시오.
답변
선택한 답변이 잘못되었거나 불완전합니다. 나는 비슷한 문제에 직면했고, 선택된 대답은 도움이되었지만 충분하지 않았습니다.
먼저 다음 명령은 실제로 필요하지 않습니다.
tc qdisc del dev eth0 루트
루트 qdisc를 ‘삭제’하지만 즉시 pfifo_fast로 대체됩니다 (따라서 연결이 끊어지지 않습니다).
두 번째 명령 :
tc qdisc add dev eth0 루트 핸들 1 : prio
pfifo_fast qdisc를 prio로 대체합니다. 기본적으로 prio 대기열에는 하나의 클래스 (1 : 1, 1 : 2 및 1 : 3)로 각각 관리되는 3 개의 밴드 (0, 1, 2)가 있습니다.
패킷은 IP 패키지의 TOS 필드를 사용하여 해당 대역 중 하나로 전송됩니다. 이 구성은 다음을 실행할 때 표시됩니다.
tc qdisc ls
‘priomap’값을 살펴 봅니다.
그런 다음 netem qdisc를 추가합니다.
tc qdisc add dev eth0 parent 1 : 1 handle 2 : netem delay 500ms
이 명령을 사용하면 1 : 1 대역으로가는 모든 트래픽이 지연됩니다 (필터가 설치 될 때까지).
그러나 두 가지 경고가 있습니다.
- 트래픽에 다른 TOS 값이있을 수 있으며 다른 대역으로 전송 될 수 있습니다.
- 트래픽이 다른 대역으로 전달되도록 prio qdisc를 구성 할 수 있습니다.
다음은 필터가 적용되지 않은 동안 netem의 영향을받지 않는 문제를 해결했습니다. 위의 단계 대신 다음과 같이했습니다.
tc qdisc add dev eth0 루트 핸들 1 : prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2
기본적으로 모든 트래픽이 1 : 3 대역으로 전송됩니다.
그런 다음 트래픽을 지연시키는 규칙을 추가했습니다.
tc qdisc add dev eth0 parent 1 : 1 handle 10 : netem delay 100ms 10ms
이렇게하면 대역 0에 qdisc가 생성되지만 모든 트래픽이 대역 3으로 이동하므로 나에게 영향을 미치지 않습니다.
그런 다음 필터를 추가했습니다.
tc 필터 추가 dev eth0 프로토콜 IP 상위 1 : 0 prio 1 u32 일치 ip dst 10.0.0.1/32 일치 ip dport 80 0xffff flowid 1 : 1
이제 필터를 사용하면 선택한 트래픽이 대역 0으로 리디렉션되므로 선택한 IP / 포트만 영향을받습니다.
다른 모든 트래픽은 계속 밴드 3으로 흐르기 때문에 영향을받지 않습니다.
답변
https://wiki.linuxfoundation.org/networking/netem의 간단한 예제 를 통해 구성 중에도 다른 트래픽에 영향을주지 않고 지정된 IP로 패킷을 지연시킬 수 있습니다.
tc qdisc del dev eth0 root # Ensure you start from a clean slate
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 500ms
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
match ip dst 192.168.1.2 flowid 1:3
답변
이 스레드에 설명 된 방법으로 트래픽을 다른 IP에 대해 정상으로 유지하면서 한 IP에 대한 트래픽을 지연시킬 수는 없습니다.
그러나 다음 명령을 사용하여 관리 할 수 있습니다.
tc qdisc add dev eth0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
tc qdisc add dev eth0 parent 1:2 handle 20: netem delay 0ms
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip src `hostname -I` flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 15001ms
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.2.3.4 flowid 1:1
명령이 실행되는 호스트에서 15001ms
IP 1.2.3.4
로의 트래픽 을 지연 시킵니다. 이 명령 hostname -I
은 호스트의 기본 IP를 가져 오는 데 사용되지만 값은 명령 내에서 직접 바꿀 수 있습니다.
0ms
호스트에서 오는 트래픽과 일치시키기 위해 지연된 다른 필터를 추가해야했습니다 . 확실히 우아하지는 않지만 더 좋은 일을하지 못했습니다.
마지막 명령은 단일 포트와 일치하도록 대체 할 수 있습니다.
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 18583 0xffff flowid 1:1
18583
IP 대신 포트로 트래픽을 지연 1.2.3.4
시킵니다.
또한 이 답변 에서 다른 트래픽에 영향 을 주지 않고 트래픽을 지연 시키는 두 번째 방법 을 찾았습니다 .1.2.3.4:18583
tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 1.2.3.4 match ip dport 18583 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq