Yazılara geri dön
Yazı

Linux tc ile VoIP DSCP EF İşaretleme ve Öncelik Kuyruğu Yapılandırması

Linux traffic control kullanarak VoIP trafiğini DSCP EF ile işaretleyip öncelik kuyruğuna yerleştirerek gecikmeyi azaltın ve ses kalitesini artırın.

NetworktcVoIPQoSDSCP

VoIP trafiği ses kopuklukları veya çağrı kesintilerini önlemek için tutarlı düşük gecikme gerektirir. Ağ geçidi veya yönlendirici olarak çalışan Linux sunucularda tc (traffic control) kullanarak paketleri DSCP EF ile işaretleyip yüksek öncelikli kuyruğa yerleştirebilirsiniz. Bu sayede ses paketleri bağlantı yoğun olsa bile veri trafiğinden önce iletilir.

Benim ortamımda Ubuntu 22.04 üzerinde küçük bir SIP geçidi çalıştırıyorum; yerel PBX için gelen ve giden çağrıları işliyor. QoS olmadan ses trafiği yedeklemeler, güncellemeler ve web trafiğiyle rekabet giriyor ve yoğun saatlerde gecikmeler belirginleşiyor. tc tabanlı DSCP EF işaretlemesi ve öncelik kuyruğu uyguladıktan sonra stres testlerinde MOS skoru 3.2'den 4.4'e çıktı.

VoIP paketlerini DSCP EF ile işaretleme

İlk olarak VoIP trafiğini belirlemeliyiz. Benim durumumda SIP sinyali UDP 5060 portunu kullanır ve RTP medya portları 10000 ile 20000 arasında değişir. Bu portlar için DSCP alanını EF (0x2b) değeriyle ayarlamak için iptables kullanıyorum.

# SIP sinyalini işaretle
iptables -t mangle -A POSTROUTING -p udp --dport 5060 -j DSCP --set-dscp-class EF
# RTP medya aralığını işaretle
iptables -t mangle -A POSTROUTING -p udp --dport 10000:20000 -j DSCP --set-dscp-class EF

İşaretlemeleri tcpdump ile doğrulayabilirsiniz:

tcpdump -i eth0 -vv -s 0 'udp and (port 5060 or portrange 10000-20000)'

Çıktıda DS field: 0x2e (46) görüyorsanız EF işaretlemesinin yapıldığını onaylamış olursunuz.

tc ile öncelik kuyruğu oluşturma

Paketler işaretlendikten sonra dışa yönlü arayüzde (eth0) trafiği şekillendiriyoruz. HTB (Hierarchical Token Bucket) kullanarak iki sınıf oluşturuyorum: EF için yüksek öncelikli ve diğer tüm trafik için varsayılan sınıf.

# Mevcut qdisc'i temizle
tc qdisc del dev eth0 root 2>/dev/null || true

# 100mbit tavanlı kök HTB ekle
tc qdisc add dev eth0 root handle 1: htb default 20

# Yüksek öncelikli sınıf (10mbit garanti)
tc class add dev eth0 parent 1: classid 1:10 htb rate 10mbit ceil 100mbit

# Varsayılan sınıf (kalan bant genişliği)
tc class add dev eth0 parent 1: classid 1:20 htb rate 20mbit ceil 100mbit

# Her iki sınıfa SFQ ekle (adalet için)
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

# EF işaretli paketleri yüksek öncelikli sınıfa yönlendir
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32
  match ip dscp 0x2e 0xfc flowid 1:10

# Kalan trafiği varsayılan sınıfa yönlendir
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32
  match ip dst 0.0.0.0/0 flowid 1:20

Bu yapılandırma VoIP trafiği için en fazla 10mbit garantiliyken öncelik sınıfı boşsa bağlantının tam hızına kadar patlama yapmasına olanak tanır. Diğer trafik en az 20mbit garantili alır ve boş bant genişliğini de kullanabilir.

İzleme ve sorun giderme

Kuralları uyguladıktan sonra istatistikleri şu komutla kontrol edin:

tc -s class show dev eth0

Düşen paketler ve backlog sayaçlarına bakın. Yüksek öncelikli sınıfta düşme görüyorsanız rate veya ceil değerini artırmalı olabilirsiniz.

Gerçek zamanlı bant genişliği kullanımını gözlemlemek için tcptrack veya iftop gibi araçları kullanın. VoIP için özellikle test çağrıları sırasında sipp veya pjsua gibi araçlarla jitteri izleyin.

Sık karşılaşılan bir hata, sunucu simetrik ise giriş ve çıkış trafiğini iki yönde de işaretlemeyi unutmak. Benim kurulumumda sadece çıkışı işaretliyorum çünkü üst yönlendirici gelen trafik için QoS'yu halletiyor; ancak yolunuzu kendi ortamınıza göre doğrulayın.

Yapılandırmayı kalıcı hale getirme

Bu komutlar yeniden başlatmada kalıcı olmaz. Ben bunları /etc/network/if-up.d/00-voip-qos dosyasına kaydedip betiği çalıştırılabilir yapıyorum.

#!/bin/bash
[ "$IFACE" != "eth0" ] || exit 0
# tc ve iptables komutlarını buraya ekleyin

Alternatif olarak declaratif konfigurasyon tercih ediyorsanız systemd-networkd veya Netplan kancalarını kullanabilirsiniz.

Son notlar

VoIP QoS sesi sınırsız bant genişliğiyle tanımakla ilgili değil, bağlantı yoğun olduğunda zamanında teslimatı sağlamakla ilgilidir. DSCP EF ve tc kullanarak devre aşırı sağlama yapmadan arama kalitesinde belirgin iyileşmeler elde edebilirsiniz.

Daha önce DNS-over-TLS konulu yazımda (https://furkanikkan.com/urun/systemd-resolved-ile-dns-over-tls-ve-dnssec-yapilandirma-kilavuzu-102) belirttiğim gibi küçük paket bazlı iyileştirmeler birikerek güvenilir bir kullanıcı deneyimi oluşturur. İlkesi burada da geçerli: işaretle, sınıflandır ve kuyruğa yerleştir.

Linux tabanlı bir VoIP geçidi çalıştırıyorsanız bu ayarları bir saat içinde incelemek zorunda kalırsınız. Kullanıcılar farkı duyacaklar.


Kapak görseli: Unknown · CC0 (Openverse / kamu malı) · https://www.rawpixel.com/image/6038427/photo-image-public-domain-technology-line