Linux Trafik Kontrolü (tc): Pratik Bir Kılavuz
12 dakikalık okuma - 5 Haziran 2026

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ön | Giden | Gelen |
| Şekillendirme | Yerel | IFB gerektirir |
| Denetim | Desteklenir | Desteklenir |
| Tipik kullanım | QoS, bant genişliği paylaşımı, hız sınırlama | Hı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 showCanlı sayaçlar da dahil olmak üzere arayüzde halihazırda neler olduğunu inceleyin:
tc -s qdisc show dev eth0Hata 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 || trueSı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 offYeni 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_codelYoğ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=bbrSSH ü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 30Toplam 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 900mbitHizmet 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 3Her 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:10Durum 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:20IFB 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 upFiziksel 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 ifb0Bu 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 1DSCP 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ü | DSCP | TOS onaltılık | Örnekler |
|---|---|---|---|
| Etkileşimli | EF | 0xb8 | SSH, DNS, VoIP |
| İşletme | AF41 | 0x88 | HTTP, HTTPS, API'ler |
| Toplu | CS1 | 0x20 | Yedeklemeler, FTP, paket güncellemeleri |
| Elinden gelenin en iyisi | CS0 | 0x00 | Diğ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 46Ardı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:
| Belirti | Olası neden | Çözüm |
|---|---|---|
RTNETLINK answers: File exists | Kök qdisc zaten yapılandırılmış | tc qdisc del dev eth0 root ilk |
| Kurallar geçerli ancak trafik sınırlandırılmıyor | Yanlış arayüz veya TSO/GSO hala etkindir | Şununla doğrulayın ip link showile doğrulayın, ethtool -K |
| Filtre asla eşleşmiyor | Yanlış bağlantı noktası/IP sözdizimi veya maske hizalaması | Bir karşı önlem ekleyin ve tc -s filter show |
| Yeniden başlatma sonrası kurallar kaybolur | Yapılandırma yalnızca bellekte bulunur | Bir komut dosyasına sarın ve systemd veya NetworkManager dağıtıcıdan çağırın |
| Öncelikli trafikte yüksek gecikme | Leaf qdisc yok veya patlama değeri çok düşük | Yaprak 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 roottc 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.

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
Linux Sunucu İş Yükü Optimizasyonu için Ayarlanmış Profiller
16 dakikalık okuma - 9 Haziran 2026

Sorularınız mı var veya özel bir çözüme mi ihtiyacınız var?
Esnek seçenekler
Küresel erişim
Anında dağıtım
Esnek seçenekler
Küresel erişim
Anında dağıtım