tc를 사용하여 패킷을 단일 IP 주소로만 지연


20

나는 tcnetem을 처음 사용 합니다. 특정 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 필터가 필요합니다. 그러나 나는 일을 할 수 없습니다. 어떻게 작동합니까?

답변:


14

좋아, 나는 내 자신의 문제를 해결했다. 위의 처음 3 줄 ( "tc qdisc"줄)을 실행하면 아직 필터가 없기 때문에 모든 패킷이 지연됩니다. 네 번째 줄은 단일 IP 주소의 패킷 만 지연하도록 변경합니다. "지연"목록에 추가 IP 주소를 추가하기 위해 추가 필터 라인을 추가 할 수 있습니다. 따라서 필터를 가리 키지 않고 "netem delay"라인을 만들지 마십시오.


답장을 보내 주셔서 감사합니다. 이상하게도 그것이 두 가지 방법 모두 잘 작동한다는 것을 알았습니다. 난 그냥 내가 줄 알았는데, 테스트에 도움이 세 가지 명령 주위에 래퍼 스크립트를 작성 조금 돌려 줄 :
의 Arran Cudbard 벨

13

선택한 답변이 잘못되었거나 불완전합니다. 나는 비슷한 문제에 직면했고, 선택된 대답은 도움이되었지만 충분하지 않았습니다.

먼저 다음 명령은 실제로 필요하지 않습니다.

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으로 흐르기 때문에 영향을받지 않습니다.


"ip dst 10.0.0.1/32"는 무엇입니까? 목적지 IP입니까? "ip src xxx.yyy.zz.www / aa"가 있다는 것을 의미합니까?
Zach Folwick

예,이 예에서는 대상 IP입니다. 그리고 네, 'ip src'옵션이 있습니다.
전신

첫 번째 명령 (tc qdisc del)의 이유는이 작업을 시도 할 때와 마찬가지로 이전 상태를 지우는 것입니다. 받아 들여진 대답이 나를 위해 일했습니다.
Dan Pritts

감사합니다.이 답변은 정말 도움이되었습니다.
PepeHands

1

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

경고를 추가해야합니다. 나중에 예상보다 지연이 더 광범위하게 적용되어 바닥에 도달 할 수없는 것처럼 보였습니다. 모든 트래픽이 지연되는 것은 아닙니다.
NeilenMarais

0

이 스레드에 설명 된 방법으로 트래픽을 다른 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

명령이 실행되는 호스트에서 15001msIP 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

18583IP 대신 포트로 트래픽을 지연 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.