نصب tc و مدیریت ترافیک سرور
چگونه پهنای باند را در سرور لینوکس مدیریت و کنترل کنیم؟

ابزار tc
چیست؟
tc
کوتاه شدهی Traffic Control هست.
ابزاری از پکیج iproute2
که توی لینوکس استفاده میشه برای مدیریت ترافیک شبکه.
به طور خلاصه:
✅ میتونی با tc
سرعت ورودی یا خروجی رو محدود کنی.
✅ میتونی ترافیک رو صفبندی کنی (queue)، مثلا صفهای مختلف با اولویت بسازی.
✅ میتونی تأخیر (delay)، از دست دادن بستهها (loss)، یا تغییر ترتیب بستهها (reorder) شبیهسازی کنی.
✅ در پروژههای واقعی و تستی یا سرورهای واقعی کاربرد زیادی داره.
🔹 چه کارهایی دقیقا میشه با tc
کرد؟
کار | توضیح |
---|---|
محدود کردن سرعت (Rate Limit) | مثلا بگی نهایتا با سرعت ۵ مگابیت در ثانیه بشه دانلود کرد. |
اولویتبندی ترافیک (QoS) | مثلا بگی پورتهای خاص یا IPهای خاص سرعت بیشتری داشته باشن. |
شبیهسازی Delay | مثلا بگی بستهها ۱۰۰ میلیثانیه تأخیر بخورن، مناسب تست. |
simulate loss یا drop | مثلا ۵٪ بستهها عمداً گم بشن، برای تست رفتار نرمافزار. |
🔹 اجزای اصلی در tc
tc
روی ۳ سطح اصلی کار میکنه:
اجزا | توضیح |
---|---|
qdisc (Queue Discipline) | کنترل نحوه صفبندی و ارسال بستهها (مهمترین بخش) |
class | گروهبندی ترافیک تحت یک qdisc برای تنظیمات جزئیتر |
filter | فیلتر کردن ترافیک و مشخص کردن این که هر بسته به کدوم class بره |
🔹 معروفترین qdisc
ها:
qdisc | کاربرد |
---|---|
pfifo_fast | صف پیشفرض، اولویتبندی ساده |
tbf (Token Bucket Filter) | محدود کردن پهنای باند با نرخ ثابت |
htb (Hierarchical Token Bucket) | تقسیمبندی دقیقتر پهنای باند بین کلاسهای مختلف |
netem | شبیهسازی تاخیر، گم شدن بسته، خراب شدن بسته و … |
ingress | برای کنترل سرعت بستههای ورودی (upload به سرور) |
🔹 یک مثال ساده:
مثلاً این دستور:
میگه روی خروجی کارت شبکه eth0، ترافیک رو محدود کن به:
-
سرعت ۵ مگابیت بر ثانیه
-
تا ۱۰ کیلوبایت به صورت ناگهانی اجازه بده
-
حداکثر تاخیر ۷۰ میلیثانیه باشه
نصب tc
نصب بسته iproute
نصب ابزارهای لازم برای کامپایل
iproute
دستور tc فعال نمی شود، برای این موضوع می توانید از طریق سورس نصب کنید.git clone https://github.com/iproute2/iproute2.git cd iproute2 make make install
🔵 با tc
به تنهایی نمیتوان مستقیماً سرعت ورودی (ingress) را محدود کرد.
چون tc
روی خروجی (egress) خیلی راحت کار میکند، ولی روی ورودی باید ترفند بزنی.
راه درست محدودسازی پهنای باند ورودی upload:
ما باید روی Ingress qdisc کار کنیم و بستههای ورودی را فیلتر کنیم و بعد با police
محدود کنیم.
فرمول کلی:
توضیح این دستورات:
-
tc qdisc add dev eth0 handle ffff: ingress
-
ایجاد صفبندی (qdisc) روی ورودی کارت شبکه (interface).
-
-
tc filter add dev eth0 parent ffff: protocol all prio 50 u32 match u32 0 0 police rate 8mbit burst 10k drop flowid :1
-
هر بستهای که میاد رو فیلتر کن، اگر بیشتر از ۸ مگابیت بر ثانیه بود → بندازش (drop کن).
-
burst 10k
یعنی حداکثر ۱۰ کیلوبایت اجازه جهش لحظهای.
-
نکته:
-
عدد
8mbit
رو به دلخواه میتونی تغییر بدی به هر سرعتی که میخوای. -
اگه بخوای خیلی حرفهایترش کنی، میشه
reclassify
یاcontinue
بجایdrop
بزاری ولی این سادهترین روش برای کاهش سرعت ورودی است.
خلاصه خیلی ساده:
نوع کنترل | روش معمولی | روش برای ورودی |
---|---|---|
خروجی (Download سمت کاربر) | tc tbf |
راحت |
ورودی (Upload به سرور) | tc ingress + police |
با ترفند |
اسکریپت پیشرفته محدودسازی پهنای باند
🛡 توضیح نکات پیشرفته:
ویژگی | توضیح |
---|---|
FailSafe | اگر SSH قطع شد یا مشکل پیش اومد، قوانین بعد ۳۰ ثانیه حذف میشن تا دسترسی کامل از بین نره |
لاگ | اطلاعات در /tmp/bandwidth_limiter.log ثبت میشه |
رنگی | پیامها با رنگهای قرمز و سبز برای فهم بهتر |
ورودی پویا | دیگه لازم نیست دستی تو کد تغییر بدی |
⚡️ روش استفاده:
-
اسکریپت رو ذخیره کن مثلا به نام
limit_bandwidth.sh
-
دسترسی اجرایی بده:
-
اجراش کن:
✅ ویژگیهای نسخه پیشرفته اسکریپت:
🌟 گرفتن ورودی سرعت دانلود و آپلود (کاربر خودش وارد میکند)
🌟 انتخاب کارت شبکه به صورت پویا (اگر خواستی)
🌟 FailSafe تایمر: اگر اسکریپت قطع شد، بعد از ۳۰ ثانیه قوانین خودش پاک میشه. (بعد از اطمینان این قسمت را غیرفعال کنید تا قوانین حذف نشود.)
🌟 لاگبرداری (ثبت در یک فایل)
🌟 پیامهای رنگی و واضح
🌟 پاکسازی قوانین قدیمی قبل از اجرای جدید
پاک کردن rule ها:
نوع رول | دستور پاک کردن |
---|---|
رول روی خروجی (download سمت کلاینت) | tc qdisc del dev eth0 root |
رول روی ورودی (upload به سرور) | tc qdisc del dev eth0 ingress |
اگر بخوای همهی رولها رو با هم پاک کنی:
میتونی دوتا دستور رو پشت هم بزنی:
یا اگر حرفهایتر بخوای:
(اینطوری اگر وجود نداشت هم خطا نمیده.)