#server-performance

Linux Trafik Kontrolü (tc): Pratik Bir Kılavuz

12 dakikalık okuma - 5 Haziran 2026

hero section cover

Linux'ta tc komutunu kullanarak bant genişliğini kontrol edin, trafiğe öncelik verin ve gelen ve giden trafiği şekillendirin. Gerçek sunucular için çalışan HTB, IFB, DSCP ve fq_codel yapılandırmaları.

Linux Trafik Kontrolü (tc): Pratik Bir Kılavuz

Linux'un tc komutu, sunucunuzun ağ trafiğini nasıl yönettiği üzerinde doğrudan kontrol sağlar. Tek bir araçtan hizmet başına bant genişliğini sınırlayabilir, toplu aktarımlarda ani artışlar yaşandığında SSH gibi etkileşimli oturumların yanıt verebilirliğini koruyabilir ve hem giden hem de gelen akışları şekillendirebilirsiniz. Bu kılavuz, temel kavramları, çalışan bir HTB kurulumunu, IFB ile gelen trafik şekillendirmeyi, DSCP tabanlı önceliklendirmeyi ve bir sorun oluştuğunda nasıl hata ayıklama yapılacağını ele almaktadır.


 

tc nasıl çalışır

Her tc kurulum dört hareketli parçadan oluşur:

  • qdisc (kuyruk disiplini). Ağ arayüzüne bağlı zamanlayıcı. Paketlerin kuyruğa nasıl ekleneceğini ve kuyruktan nasıl çıkarılacağını belirler.
  • Sınıf. Sınıflı bir qdisc içindeki alt bölüm. Bunu, kendine özgü bir hız sınırı olan bir şerit olarak düşünün.
  • Filtre. Paket başlıklarını (IP'ler, bağlantı noktaları, işaretler) inceler ve her paketi bir sınıfa atar.
  • Eylem. Bir paket eşleştiğinde ne olacağı: iletme, atma, yeniden yönlendirme.

Bunlar bir ağaç yapısı oluşturur. Paketler kök qdisc'ten girer, filtrelere ulaşır, bir major:minor ve iletim için bir yaprak qdisc’te kuyruğa alınır.

Port tabanlı eşleşmeden daha karmaşık işlemler için, paketleri iptables veya nftables ile mangle tablosunda işaretleyin, ardından fw filtreyi tc kullanarak işarete göre sınıflandırın. Bu, her trafik türü için ham u32 kuralları zincirlemekten çok daha iyi ölçeklenir.

Çıkış ve giriş

Yön önemlidir. Çekirdek, giden paketleri arabelleğe alıp geciktirebilir; gerçek şekillendirmeyi sağlayan da budur. Gelen paketler, siz onları gördüğünüzde çoktan kabloyu geçmiştir; bu nedenle, bunları önce bir IFB cihazına yönlendirmediğiniz sürece yalnızca denetleyebilirsiniz (eşik değerinin üzerindeki paketleri düşürebilirsiniz).

ÖzellikÇıkışGiriş
YönGidenGelen
ŞekillendirmeYerelIFB gerektirir
DenetimDesteklenirDesteklenir
Tipik kullanımQoS, bant genişliği paylaşımı, hız sınırlamaHız sınırlama, temel DDoS önleme

Gerçekte kullanacağınız qdisc'ler

  • HTB (Hierarchical Token Bucket). Sınıflı. Hizmet başına garantili minimum bant genişliği istiyorsanız ve diğer sınıflardan kullanılmayan kapasiteyi ödünç alabilme özelliğine sahip olmak istiyorsanız bunu kullanın.
  • TBF (Token Bucket Filter). Sınıfsız. Tüm bir arayüzü tek bir hızda sınırlamanız gerektiğinde kullanın.
  • fq_codel (Adil Kuyruk Kontrolü Gecikmesi). Akış başına adaleti aktif kuyruk yönetimi ile birleştirerek tampon şişmesini ortadan kaldırır. Systemd 217 sürümünden bu yana çoğu Linux dağıtımında varsayılan qdisc olmuştur ve RHEL 9'da varsayılan olarak gelir. Her zaman HTB sınıflarının altında bir yaprak qdisc olarak ekleyin; aksi takdirde tek bir açgözlü akış tüm sınıfı işgal edebilir.

Linux sunucusunda tc'nin kurulumu

tc iproute2 paketi ile birlikte gelir. Debian ve Ubuntu'da şu komutla yükleyin apt-get install iproute2komutuyla yükleyin. RHEL ve türevlerinde ise yum install iproutekomutuyla yükleyin. Root veya sudo yetkisine ihtiyacınız olacaktır.

Öncelikle doğru arayüz adını öğrenin. Arayüzün yanlış adlandırılması, yapılandırmanın hiçbir şey yapmamasının en yaygın nedenidir:

ip link show

Canlı sayaçlar da dahil olmak üzere arayüzde halihazırda neler olduğunu inceleyin:

tc -s qdisc show dev eth0

Hata oluşmasını önlemek için yeni bir yapılandırma uygulamadan önce mevcut tüm root qdisc'leri silin RTNETLINK answers: File exists :

tc qdisc del dev eth0 root 2>/dev/null || true

Sıfırdan başlamak yerine mevcut bir kuralı güncelliyorsanız, replace kullanarak add kullanın.

TSO ve GSO gibi donanım yük devretme özellikleri, paketleri şekillendirmeyi engelleyecek şekilde gruplandırır. Şekillendirilen arayüzde bunları devre dışı bırakın:

sudo ethtool -K eth0 tso off gso off

Yeni arayüzler için sistem genelinde varsayılan qdisc olarak fq_codel yeni arayüzler için sistem genelinde varsayılan qdisc olarak ayarlayın:

sysctl -w net.core.default_qdisc=fq_codel

Yoğun iş yükü altındaki sunucular için bunu BBR tıkanıklık kontrol algoritmasıyla (çekirdek 4.9+) birlikte kullanın. BBR, kuyrukları uzatmadan verimi yüksek tutar:

sysctl -w net.ipv4.tcp_congestion_control=bbr

SSH üzerinden uzak bir sistemi yapılandırıyorsanız, bir güvenlik önlemi olarak ikinci bir oturum açın ve tc qdisc del dev eth0 root yapıştırmaya hazır tutun. Hatalı bir filtre kuralı, sizi anında sistemden dışarıda bırakabilir.

HTB ile giden trafiği şekillendirme

HTB, her hizmete garantili bir minimum (rate) ve bir üst sınır (ceil) atamanıza olanak tanır. Kullanılmayan bant genişliği, öncelik sırasına göre ihtiyacı olanlara aktarılır. İşte 1 Gbps'lik bir uplink için çalışan üç katmanlı bir kurulum.

Kök HTB qdisc'ini oluşturun. default 30 , sınıflandırılmamış paketleri kurallarınızı atlatmasına izin vermek yerine 1:30 sınıfına gönderir; kurallarınızı atlamasına izin vermez:

tc qdisc add dev eth0 root handle 1: htb default 30

Toplam verimi 900 Mbps ile sınırlayın. Her zaman gerçek bağlantı kapasitesinin biraz altında şekillendirme yapın, aksi takdirde kontrolünüz dışında kalan bir yukarı akış yönlendiricisi veya modemde kuyruk oluşur:

tc class add dev eth0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbit

Hizmet kademelerini tanımlayın. Daha düşük prio değerler, kullanılmayan bant genişliğini ilk olarak alır:

# High priority: web and API traffic
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500mbit ceil 900mbit prio 1
 
# Medium priority: database replication
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 300mbit ceil 900mbit prio 2
 
# Low priority: bulk and backup traffic
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 100mbit ceil 900mbit prio 3

Her sınıfa fq_codel her sınıfa yaprak qdisc olarak ekleyin, böylece tek bir akış kendi kademesini domine edemez:

tc qdisc add dev eth0 parent 1:10 handle 10: fq_codel
tc qdisc add dev eth0 parent 1:20 handle 20: fq_codel
tc qdisc add dev eth0 parent 1:30 handle 30: fq_codel

Şimdi trafiği sınıflandırın. Basit bağlantı noktası eşleştirmesi için, u32 en hızlı yöntem şudur:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
  match ip dport 443 0xffff flowid 1:10

Durum bilgisi içeren her şey için, iptables'da işaretleyin ve bu işareti fw:

iptables -t mangle -A OUTPUT -p tcp --dport 5432 -j MARK --set-mark 2
tc filter add dev eth0 protocol ip parent 1:0 prio 2 handle 2 fw flowid 1:20

IFB ile gelen trafiği şekillendirme

Gelen trafiği doğal olarak şekillendiremezsiniz çünkü bir paket ulaştığında bant genişliğinizi zaten kullanmış olur. Bunun çözümü, gelen trafiği bir Ara İşlevsel Blok (IFB) sanal arayüzüne yönlendirmektir; burada çekirdek, bu trafiği giden trafik olarak değerlendirir ve sınıf tabanlı qdisc'leri uygulamanıza izin verir.

Modülü yükleyin ve arayüzü etkinleştirin:

modprobe ifb numifbs=1
ip link set dev ifb0 up

Fiziksel arayüze bir gelen qdisc ekleyin ve her şeyi ifb0:

tc qdisc add dev eth0 ingress handle ffff:
tc filter add dev eth0 parent ffff: protocol all u32 \
  match u32 0 0 action mirred egress redirect dev ifb0

Bu noktadan itibaren, ifb0 diğer arayüzler gibi davranır. HTB ağacınızı, çıkış trafiğinde yaptığınız gibi aynen buraya uygulayın:

tc qdisc add dev ifb0 root handle 1: htb default 30
tc class add dev ifb0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbit
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 500mbit ceil 900mbit prio 1

DSCP ile trafiğe öncelik verme

DSCP (Differentiated Services Code Point), paketleri TOS baytında 6 bitlik bir değerle etiketler; böylece tc filtreleriniz, kural kümesindeki bağlantı noktalarını tek tek taramak yerine etikete göre sınıflandırabilir. DSCP eşleştirirken tceşleştirirken, değeri 2 bit sola kaydırın. DSCP EF (46) şu hale gelir 0xb8şeklini alır. Maske 0xfc , 6 DSCP bitini 2 ECN bitinden ayırır.

Sunucu iş yükleri için mantıklı bir varsayılan eşleme:

Trafik türüDSCPTOS onaltılıkÖrnekler
EtkileşimliEF0xb8SSH, DNS, VoIP
İşletmeAF410x88HTTP, HTTPS, API'ler
TopluCS10x20Yedeklemeler, FTP, paket güncellemeleri
Elinden gelenin en iyisiCS00x00Diğer her şey

Giden paketleri, filtrelerinize ulaşmadan önce iptables'da etiketleyin tc filtrelerinize ulaşmadan önce etiketleyin:

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 46

Ardından bu etiketi tc ve doğru HTB sınıfına yönlendirin:

# EF (SSH, VoIP) goes to the high-priority class
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
  match ip tos 0xb8 0xfc flowid 1:10
 
# AF41 (web traffic) goes to the medium class
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 \
  match ip tos 0x88 0xfc flowid 1:20
 
# CS1 (bulk) goes to the low-priority class
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
  match ip tos 0x20 0xfc flowid 1:30

İzleme ve sorun giderme

Sürekli kullanacağınız üç komut:

tc -s qdisc show dev eth0
tc -s class show dev eth0
tc -s filter show dev eth0

Şunu izleyin dropped ve overlimits sayıcıları izleyin. Düşen paketler, kuyruğun dolduğunu; sınırların aşılması ise sınıf sınırına ulaştığınızı ve çekirdeğin trafiği geciktirmek veya atmak zorunda kaldığını gösterir. Canlı görüntü için:

watch -n 1 'tc -s class show dev eth0'

İç -d iç parametreler (hedef, aralık, kuantum) için ve -j bir metrik yığınına aktarıyorsanız JSON çıktısı için ekleyin. Bunu ss -tin ile birleştirerek TCP katmanındaki RTT tahminlerini ve yeniden iletimleri görüntüleyin.

Çoğu hata aşağıdaki kısa listeye girer:

BelirtiOlası nedenÇözüm
RTNETLINK answers: File existsKök qdisc zaten yapılandırılmıştc qdisc del dev eth0 root ilk
Kurallar geçerli ancak trafik sınırlandırılmıyorYanlış arayüz veya TSO/GSO hala etkindirŞununla doğrulayın ip link showile doğrulayın, ethtool -K
Filtre asla eşleşmiyorYanlış bağlantı noktası/IP sözdizimi veya maske hizalamasıBir karşı önlem ekleyin ve tc -s filter show
Yeniden başlatma sonrası kurallar kaybolurYapılandırma yalnızca bellekte bulunurBir komut dosyasına sarın ve systemd veya NetworkManager dağıtıcıdan çağırın
Öncelikli trafikte yüksek gecikmeLeaf qdisc yok veya patlama değeri çok düşükYaprak fq_codel yaprak sınıflarına ekleyin, yükseltin burst

Yanlış bir yapılandırma nedeniyle kendinizi dışarıda bırakırsanız, sıfırlama işlemi basittir:

tc qdisc del dev eth0 root

tc Sahip olmadığınız bant genişliğini yaratamazsınız, ancak iyi donanımlı bir uplink üzerinde bu, öngörülebilir performans ile bir kiracının büyük bir aktarım başlattığı anda çöken bir sunucu arasındaki farkı yaratır. Ham bant genişliğine ve bunu istediğiniz gibi şekillendirme özgürlüğüne ihtiyacınız varsa, FDC'nin özel sunucularına bir göz atın.

Blog

Bu hafta öne çıkanlar

Daha fazla makale
iperf3 Kılavuzu: Linux ve Windows'ta Ağ Hızını Test Etme
#bandwidth#server-performance

iperf3 Kılavuzu: Linux ve Windows'ta Ağ Hızını Test Etme

Linux ve Windows'ta doğru sonuçlar elde etmek için iperf3'ü kurun, bant genişliği testleri yapın ve TCP tamponlarını ayarlayın. UDP, çift yönlü ve 10GbE+ testlerini kapsar.

10 dakikalık okuma - 7 Mayıs 2026

#server-performance

Linux Sunucu İş Yükü Optimizasyonu için Ayarlanmış Profiller

16 dakikalık okuma - 9 Haziran 2026

Daha fazla makale
background image

Sorularınız mı var veya özel bir çözüme mi ihtiyacınız var?

icon

Esnek seçenekler

icon

Küresel erişim

icon

Anında dağıtım

icon

Esnek seçenekler

icon

Küresel erişim

icon

Anında dağıtım