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

12 dakikalık okuma - 5 Haziran 2026

hero section cover
İçindekiler
  • Linux Trafik Kontrolü (tc): Pratik Kılavuz
  • tc nasıl çalışır
  • Linux sunucusunda tc'yi kurma
  • HTB ile giden trafiği şekillendirme
  • IFB ile gelen trafiği şekillendirme
  • DSCP ile trafiğe öncelik verme
  • İzleme ve sorun giderme
Paylaş

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önGidenGelen
ŞekillendirmeYerelIFB gerektirir
DenetimDesteklenirDesteklenir
Tipik kullanımQoS, bant genişliği paylaşımı, hız ayarlamaHı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 show

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

tc -s qdisc show dev eth0

Hata 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 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 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 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=bbr

SSH ü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 30

Toplam 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 900mbit

Hizmet 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 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ş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:10

Durum 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:20

IFB 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 up

Fiziksel 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 ifb0

Buradan 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 1

DSCP 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üDSCPTOS onaltılıkÖrnekler
EtkileşimliEF0xb8SSH, DNS, VoIP
İşAF410x88HTTP, 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 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

Watch 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:

BelirtiMuhtemel nedenÇözüm
RTNETLINK answers: File existsRoot 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 açıkŞununla onaylayın ip link showile onaylayı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 kaybolduYapı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 ç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
Linux Trafik Kontrolü (tc): Pratik Bir Kılavuz

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

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