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

Tc ile Linux üzerinde bant genişliğini kontrol edin, trafiğe öncelik verin ve giriş ve çıkışları şekillendirin. Gerçek sunucular için çalışan HTB, IFB, DSCP ve fq_codel yapılandırması.
Linux Trafik Kontrolü (tc): Pratik Kılavuz
Linux'un tc komutu, sunucunuzun ağ trafiğini nasıl işlediğini doğrudan kontrol etmenizi sağlar. Tek bir araçtan hizmet başına bant genişliğini sınırlayabilir, toplu aktarımlarda artış olduğunda 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 giriş ş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 bir alt bölüm. Bunu, kendi 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ğı: ilet, at, yönlendir.
Bunlar bir ağaç oluşturur. Paketler kök qdisc'e girer, filtrelere çarpar, bir major:minor ve iletim için yaprak qdisc'te kuyruğa alınır.
Port tabanlı eşleşmeden daha karmaşık herhangi bir şey için, paketleri mangle tablosunda iptables veya nftables ile 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 alabilir ve geciktirebilir; gerçek şekillendirmeyi sağlayan da budur. Gelen paketler, siz onları gördüğünüzde çoktan kabloyu geçmiştir; bu nedenle, onları önce bir IFB cihazına yönlendirmedikçe, yalnızca denetleyebilirsiniz (eşik değerinin üzerinde olanları düşürmek).
| Ö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 ayarlama | Hız sınırlama, temel DDoS önleme |
Gerçekten kullanacağınız qdisc'ler
- HTB (Hiyerarşik Jeton Kovası). Sınıflı. Diğer sınıflardan kullanılmayan kapasiteyi ödünç alma özelliği ile hizmet başına garantili minimum bant genişliği istediğinizde kullanın.
- TBF (Token Bucket Filter). Sınıflandırmasız. Tüm 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'den beri ç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ı 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'yi kurma
tc , iproute2 paketi ile birlikte gelir. Debian ve Ubuntu'da, bunu apt-get install iproute2. RHEL ve türevlerinde yum install iprouteile yükleyin. Root veya sudo haklarına ihtiyacınız olacaktır.
Önce doğru arayüz adını bulun. Arayüzün yanlış adlandırılması, yapılandırmanın sessizce 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 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 işlemleri, paketleri şekillendirmeyi engelleyecek şekilde gruplandırır. Şekillendirilmiş 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 sunucular için, bunu BBR tıkanıklık kontrol algoritmasıyla (çekirdek 4.9+) eşleştirin. BBR, kuyrukları büyütmeden verimi yüksek tutar:
sysctl -w net.ipv4.tcp_congestion_control=bbrSSH üzerinden uzak bir kutuyu 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 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ızı sağlar. Kullanılmayan bant genişliği, öncelik sırasına göre ihtiyacı olanlara aktarılır. İşte 1 Gbps uplink için çalışan üç katmanlı bir kurulum.
Kök HTB qdisc'i 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 şekillendirin, aksi takdirde kontrol etmediğiniz 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 katmanlarını 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şmesi için u32 en hızlı yöntemdir:
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 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
Paket geldiğinde bant genişliğinizi zaten kullanmış olduğu için, gelen trafiği doğal olarak şekillendiremezsiniz. 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ıflı 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 giriş qdisc'i 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 ifb0Buradan itibaren ifb0 diğer arayüzler gibi davranır. HTB ağacınızı, çıkışta 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 (Farklılaştırılmış Hizmetler Kod Noktası), paketleri TOS baytında 6 bitlik bir değerle etiketler, böylece tc filtreleriniz, kural kümesindeki bağlantı noktalarını takip etmek yerine etikete göre sınıflandırabilir. DSCP'yi eşleştirirken tc, değeri 2 bit sola kaydırın. DSCP EF (46) 0xb8. 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 |
| İş | 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 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 eth0Watch the dropped ve overlimits sayaçlarını izleyin. Düşen paketler, kuyruğun dolduğunu; sınırların aşılması ise sınıf tavanı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) ve -j bir metrik yığınına aktarıyorsanız JSON çıktısı için ekleyin. ss -tin ile eşleştirin.
Çoğu arıza kısa bir listeye girer:
| Belirti | Muhtemel neden | Çözüm |
|---|---|---|
RTNETLINK answers: File exists | Root 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 açık | Şununla onaylayın ip link showile onaylayı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 kayboldu | 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 ç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.

Linux Trafik Kontrolü (tc): Pratik Bir Kılavuz
Tc ile Linux üzerinde bant genişliğini kontrol edin, trafiğe öncelik verin ve giriş ve çıkışları şekillendirin. Gerçek sunucular için çalışan HTB, IFB, DSCP ve fq_codel yapılandırması.
12 dakikalık okuma - 5 Haziran 2026
Güçlü ve ölçülmemiş bir VPS'ye sahip olmak neden önemlidir?
7 dakikalık okuma - 9 Mayıs 2025

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