VoIP 설정 · 3 min read · Jan 22, 2026

VoIP 사용자를 위한 QoS 및 트래픽 쉐이핑: iproute2 및 Asterisk 사용

VoIP 사용자를 위한 QoS 및 트래픽 쉐이핑: iproute2 및 Asterisk 사용

내 VoIP 전화 통화의 품질은 내가 무엇인가를 다운로드하거나 업로드할 때마다 저하되었습니다. 이는 특히 나에게 전화하는 사람들에게 짜증이 났습니다(나는 그들이 나를 듣는 것보다 그들을 더 잘 들었습니다). 그래서 나는 Iproute2와 VoIP 트래픽에 관한 다른 방법들을 살펴보았지만, 잘 작동하는 것을 찾을 수 없었습니다. 몇 가지 실험 후, 나는 나에게 적합한 설정을 찾았습니다: 어떤 활동이 있든 일관된 VoIP 품질.

내 VoIP 시스템에 대한 참고 사항: 나는 여분의 노트북(IBM T20)에서 Asterisk를 사용하고 있으며, 내 VoIP 제공자는 캐나다의 훌륭한 Unlimitel입니다. 나는 내 Asterisk 박스를 호스팅하기 때문에 원하는 대로 구성할 수 있습니다. 또한 내 인트라넷에 있는 IAX 하드폰을 구입했습니다.

설정

나는 당신이 이미 리눅스 방화벽을 설정해 두었다고 가정합니다. VoIP 패킷은 당신의 방화벽을 통과하고 NAT는 이미 설정되어 작동하고 있습니다. 우리는 이 설정으로 방화벽을 건드리지 않을 것입니다. 당신이 해야 할 일은 VoIP 패킷의 우선 순위를 정하기 위해 올바른 qdisc, 클래스 및 필터를 만드는 것입니다. 이를 위해 Iproute2의 tc 명령이 있습니다.

당신의 네트워크가 다음과 같다고 가정해 봅시다:

Internet <------> Cable modem <-------> Linux Firewall <-----> Intranet <-----> VoIP phone

나는 IAX와 함께 Asterisk를 사용하고 있으므로, 관심 있는 포트는 포트 4569입니다. SIP를 사용하는 경우, 다음 줄에서 포트를 조정하십시오.

배경 정보

IP 패킷에는 QoS(서비스 품질)를 미리 설정할 수 있는 영역이 있습니다. 당신의 ISP는 아마도 이를 무시할 것이지만, 당신은 로컬 네트워크에서 일부 트래픽 쉐이핑을 위해 이를 활용할 수 있습니다. 4개의 QoS 비트는 다음과 같습니다:

0x02: 금전적 비용 최소화

0x04: 신뢰성 극대화

0x08: 처리량 극대화

0x10: 지연 최소화

공식적으로는 이 비트 중 하나만 켤 수 있습니다. 그러면 방화벽은 패킷이 들어올 때 이를 살펴보고 어떤 패킷을 먼저 전달할지 결정할 수 있습니다. 보통은 지연 최소화가 됩니다.

비공식적으로는 이 비트를 동시에 켤 수 있습니다. 따라서 지연 최소화와 처리량 극대화를 모두 가진 패킷을 가질 수 있습니다. 이를 염두에 두고 Iproute2의 몇 가지 기능을 살펴보겠습니다.

Iproute2 및 tc

기본적으로 패킷은 선입선출 방식으로 전송됩니다. tc를 사용하면 이를 극적으로 변경할 수 있습니다. 매우 간단한 큐 시스템을 사용해 보겠습니다: 3개의 “파이프”(또는 큐)를 만들고 우선 순위를 할당합니다. 즉, 큐 1에 무언가가 있는 한 큐 2를 비우지 않고, 큐 2에 무언가가 있는 한 큐 3를 비우지 않습니다.

이는 다음 명령으로 수행됩니다(참고: eth1은 외부 인터페이스입니다):

tc qdisc add dev eth1 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0

priomap의 16개 값은 중요합니다. 기본적으로 대부분의 패킷은 3번째 큐에 들어가며(0부터 시작하므로 “2”라고 불립니다), QoS 지연 최소화가 설정된 패킷은 2번째 큐에 들어가고, 모든 QoS 비트가 켜진 패킷은 1번째 큐에 들어갑니다. (prio 큐잉 규칙은 기본적으로 3개의 큐를 설정합니다)

16개의 값은 다음 QoS에 대해 순서대로 나열됩니다:

1: 0x00: QoS가 설정되지 않음 -> 3번째 큐(2)

2: 0x02: 금전적 비용 최소화 (MMC) (2)

3: 0x04: 신뢰성 극대화 (MR) (2)

4: 0x06: MMC + MR (2)

5: 0x08: 처리량 극대화 (MT) (2)

6: 0x0a: MT + MMC (2)

7: 0x0c: MT + MR (2)

8: 0x0e: MT + MR + MMC (2)

9: 0x10: 지연 최소화 (MD) (1)

10: 0x12: MD + MMC (1)

11: 0x14: MD + MR (1)

12: 0x16: MD + MMC + MR (1)

13: 0x18: MD + MT (1)

14: 0x1a: MD + MT + MMC (1)

15: 0x1c: MD + MT + MR (1)

16: 0x1e: MD + MT + MR + MMC (0)

이것이 우리의 첫 번째 단계였습니다.

다음으로, 각 큐가 자체적으로 큐잉 규칙을 가지도록 조정하겠습니다:

tc qdisc add dev eth1 parent 1:1 handle 10: sfq limit 3000
tc qdisc add dev eth1 parent 1:2 handle 20: sfq
tc qdisc add dev eth1 parent 1:3 handle 30: sfq

이것은 첫 번째 큐에 3000 패킷의 용량을 부여합니다. 실제로는 tc 프로그램에서 최대 크기로 하드 코딩된 128 패킷의 크기가 됩니다.

이 시점에서 대부분의 패킷은 3번째 큐를 통과하게 되며, 지연 최소화 QoS 비트가 설정된 패킷을 제외합니다.

당신의 Asterisk 박스에서 iax.conf를 다음과 같이 조정하면, 일부 패킷이 첫 번째 큐에 들어갈 수 있습니다:

tos=0x1e

그러나 이것이 보장되지 않기 때문에, tc의 또 다른 트릭인 필터를 사용하여 강제로 큐 1로 보내겠습니다.

IAX가 포트 4569를 사용하므로, 이 포트로의 모든 패킷이 첫 번째 큐를 통과하도록 강제하겠습니다:

tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dport 4569 0xffff flowid 1:1
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 4569 0xffff flowid 1:1
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip tos 0x10 0xff flowid 1:2

기술적으로 마지막 줄은 필요하지 않지만, 남겨두는 것이 나쁘지 않습니다.

이제 완료되었습니다! 모든 VoIP 패킷이 가장 먼저 큐에서 처리됩니다. 대량 다운로드나 업로드 중에도 전화 통화의 상호작용을 잃지 않을 것입니다.

통계를 보려면 다음 명령을 실행하십시오:

tc -s qdisc ls dev eth1

큐를 제거하고 정상 상태로 돌아가려면 다음을 실행하십시오:

tc qdisc del dev eth1 root

이제 부팅 시 적절한 명령을 자동으로 실행할 차례입니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.