Flow filter in tc(8) Linux Flow filter in tc(8)

tc-flow - فیلتر کنترل ترافیک مبتنی بر جریان (flow)

حالت نگاشت (Mapping mode):

tc filter ... flow map key KEY [ OPS ] [ OPTIONS ]
حالت درهم‌سازی (Hashing mode):

tc filter ... flow hash keys KEY_LIST [ perturb secs ] [ OPTIONS ]


OPS := [ OPS ] OP

OPTIONS := [ divisor NUM ] [ baseclass ID ] [ match EMATCH_TREE ] [ action ACTION_SPEC ]

KEY_LIST := [ KEY_LIST ] KEY

OP := { or | and | xor | rshift | addend } NUM

ID := X:Y

KEY := { src | dst | proto | proto-src | proto-dst | iif | priority | mark | nfct | nfct-src | nfct-dst | nfct-proto-src | nfct-proto-dst | rt-classid | sk-uid | sk-gid | vlan-tag | rxhash }

دسته‌بند flow برای گسترش قابلیت‌های درهم‌سازی (hashing) الگوریتم SFQ بدون نیاز به کدنویسی توابع درهم‌سازی جدید در هسته طراحی شده است. این دسته‌بند همچنین امکان نگاشت قطعی کلیدها به کلاس‌ها را فراهم می‌کند.

اعمال یک عملیات (action) از چارچوب عملیات‌های عمومی روی بسته‌های منطبق.
یک آفست (میزان جابه‌جایی) برای شناسه کلاس (class ID) حاصل. ID می‌تواند root، none یا یک شناسه کلاس در مبنای شانزده (هگزادسیمال) به فرم [X:]Y باشد. مقدار X باید با هندل اصلی qdisc یا کلاس مطابقت داشته باشد (در صورت حذف، مقدار مناسب به‌طور خودکار انتخاب می‌شود). اگر کل baseclass حذف شود، مقدار Y به‌طور پیش‌فرض برابر با 1 خواهد بود.
تعداد باکت‌ها (بخش‌ها) جهت مرتب‌سازی و دسته‌بندی. کلیدها به پیمانه (modulo) NUM محاسبه می‌شوند.
اجرای یک عملیات jhash2 روی کلیدهای مشخص‌شده در KEY-LIST. نتیجه (به پیمانه divisor در صورت تعیین) به عنوان شناسه کلاس در نظر گرفته می‌شود که به صورت اختیاری با مقدار baseclass آفست می‌گیرد. می‌توان با استفاده از پارامتر perturb یک بازه زمانی (بر حسب ثانیه) تعیین کرد که پس از آن منبع آنتروپی jhash2 مجدداً بازسازی شود.
داده‌های بسته که توسط KEY مشخص شده‌اند، به شناسه‌های کلاسی که بسته باید به آن‌ها هدایت شود ترجمه می‌شوند. این مقدار می‌تواند قبل از استفاده برای نگاشت، توسط OPS دستکاری و دگرگون شود. این عملیات‌ها به ترتیبی که در اینجا ذکر شده اعمال می‌شوند:
انجام عملیات بیتی AND با مقدار عددی NUM.
انجام عملیات بیتی OR با مقدار عددی NUM.
انجام عملیات بیتی XOR با مقدار عددی NUM.
شیفت دادن مقدار KEY به سمت راست به اندازه NUM بیت.
افزودن NUM به مقدار KEY.
برای عملیات‌های or، and، xor و rshift، مقدار NUM یک عدد صحیح بدون علامت ۳۲ بیتی فرض می‌شود. برای عملیات addend، مقدار NUM می‌تواند دارای یک علامت منفی ('-') در ابتدا باشد تا به جای جمع، تفریق انجام شود و برای کلیدهای src، dst، nfct-src و nfct-dst می‌توان آن را در قالب نمادگذاری آدرس IP مشخص کرد. برای درک بهتر به مثال‌های زیر مراجعه کنید.
تطبیق بسته‌ها با استفاده از زیرساخت تطبیق گسترش‌یافته (extended match). برای توضیحات تفصیلی درباره ساختار نحوی مجاز در EMATCH_TREE به tc-ematch(8) مراجعه کنید.

در حالت نگاشت (mapping mode)، از یک کلید منفرد (پس از دگرگونی اختیاری) برای ساخت شناسه کلاس استفاده می‌شود. شناسه حاصل در بیشتر موارد قابل پیش‌بینی و استنتاج است. در حالت درهم‌سازی (hashing mode)، می‌توان تعدادی کلید را تعیین کرد که درهم‌سازی روی آن‌ها انجام شده و خروجی حاصل به عنوان شناسه کلاس به کار می‌رود. این شناسه از قبل قابل پیش‌بینی نیست و اگر بازه زمانی perturb تعیین شده باشد، حتی ممکن است در طول زمان برای یک جریان معین تغییر کند.

محدوده شناسه‌های کلاس را می‌توان با گزینه divisor که به عنوان مقسوم‌علیه در محاسبه پیمانه (modulo) استفاده می‌شود، محدود کرد.

استفاده از آدرس مبدأ یا مقصد به عنوان کلید. در مورد IPv4 و TIPC، این مقدار برابر با آدرس واقعی است. برای IPv6، آدرس ۱۲۸ بیتی با انجام عملیات XOR روی چهار کلمه ۳۲ بیتی، به یک مقدار ۳۲ بیتی خلاصه (fold) می‌شود. در سایر موارد، آدرس سوکت داخلی هسته (پس از خلاصه شدن به ۳۲ بیت در سیستم‌های ۶۴ بیتی) استفاده می‌شود.
استفاده از شماره پروتکل لایه چهارم به عنوان کلید.
استفاده از درگاه (پورت) مبدأ لایه چهارم به عنوان کلید. در صورت عدم دسترسی، آدرس سوکت داخلی هسته به جای آن استفاده می‌شود.
استفاده از درگاه (پورت) مقصد لایه چهارم به عنوان کلید. در صورت عدم دسترسی، آدرس dst_entry داخلی هسته مرتبط پس از اعمال XOR با شماره پروتکل لایه سوم بسته، استفاده می‌شود.
استفاده از ایندکس رابط شبکه ورودی به عنوان کلید.
استفاده از اولویت بسته به عنوان کلید. معمولاً این مقدار برابر با مقدار DSCP/ECN در هدر IP است.
استفاده از fwmark مربوط به netfilter به عنوان کلید.
استفاده از آدرس مدخل کانترک (conntrack) مرتبط به عنوان کلید.
این‌ها نسخه‌های آگاه از کانترک (conntrack-aware) برای src، dst، proto-src و proto-dst هستند. در صورت استفاده از NAT، این‌ها اساساً مقادیر هدر بسته پیش از اعمال NAT هستند.
استفاده از قلمرو (realm) مدخل جدول مسیریابی مقصد بسته به عنوان کلید.
برای بسته‌های تولیدشده به صورت محلی، شناسه کاربر (UID) یا شناسه گروه (GID) که سوکت مبدأ به آن تعلق دارد به عنوان کلید استفاده می‌شود.
استفاده از شناسه VLAN بسته به عنوان کلید.
استفاده از هش جریان (flow hash) به عنوان کلید.

درهم‌سازی کلاسیک SFQ:
tc filter add ... flow hash 	keys src,dst,proto,proto-src,proto-dst divisor 1024
درهم‌سازی کلاسیک SFQ، اما با استفاده از اطلاعات کانترک (conntrack) جهت عملکرد صحیح همراه با NAT:
tc filter add ... flow hash 	keys nfct-src,nfct-dst,proto,nfct-proto-src,nfct-proto-dst 	divisor 1024
نگاشت IPهای مقصد در محدوده 192.168.0.0/24 به شناسه‌های کلاس 1 تا 256:
tc filter add ... flow map 	key dst addend -192.168.0.0 divisor 256
روش جایگزین برای مثال بالا:
tc filter add ... flow map 	key dst and 0xff
همان مورد، اما با ترتیب معکوس:
tc filter add ... flow map 	key dst and 0xff xor 0xff

tc(8), tc-ematch(8), tc-sfq(8)

20 Oct 2015 iproute2