Flower filter in tc(8) Linux Flower filter in tc(8)

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


tc filter ... flower [ MATCH_LIST ] [ action ACTION_SPEC ] [ classid CLASSID ] [ hw_tc TCID ]

MATCH_LIST := [ MATCH_LIST ] MATCH

MATCH := { indev ifname | verbose | skip_sw | skip_hw | { dst_mac | src_mac } MASKED_LLADDR | vlan_id VID | vlan_prio PRIORITY | vlan_ethtype { ipv4 | ipv6 | ETH_TYPE } | cvlan_id VID | cvlan_prio PRIORITY | cvlan_ethtype { ipv4 | ipv6 | ETH_TYPE } | pppoe_sid PSID | ppp_proto { ip | ipv6 | mpls_uc | mpls_mc | PPP_PROTO } | mpls LSE_LIST | mpls_label LABEL | mpls_tc TC | mpls_bos BOS | mpls_ttl TTL | l2tpv3_sid LSID | ip_proto { tcp | udp | sctp | icmp | icmpv6 | l2tp | IP_PROTO } | ip_tos MASKED_IP_TOS | ip_ttl MASKED_IP_TTL | { dst_ip | src_ip } PREFIX | { dst_port | src_port } { MASKED_NUMBER | min_port_number-max_port_number } | tcp_flags MASKED_TCP_FLAGS | type MASKED_TYPE | code MASKED_CODE | { arp_tip | arp_sip } IPV4_PREFIX | arp_op { request | reply | OP } | { arp_tha | arp_sha } MASKED_LLADDR | enc_key_id KEY-ID | { enc_dst_ip | enc_src_ip } { ipv4_address | ipv6_address } | enc_dst_port port_number | enc_tos TOS | enc_ttl TTL | { geneve_opts | vxlan_opts | erspan_opts | gtp_opts | pfcp_opts } OPTIONS | ip_flags IP_FLAGS | l2_miss L2_MISS | cfm CFM_OPTIONS | enc_flags ENCFLAG-LIST }

LSE_LIST := [ LSE_LIST ] LSE

LSE := lse depth DEPTH { label LABEL | tc TC | bos BOS | ttl TTL }

CFM := cfm mdl LEVEL | op OPCODE

ENCFLAG-LIST := [ ENCFLAG-LIST/ ] ENCFLAG

ENCFLAG := { [no]tuncsum | [no]tundf | [no]tunoam | [no]tuncrit }

فیلتر flower جریان‌ها (flows) را با مجموعه‌ای از کلیدهای مشخص‌شده مطابقت می‌دهد و یک شناسه کلاس (class ID) انتخاب‌شده به صورت اختیاری را به بسته‌های متعلق به آن‌ها اختصاص می‌دهد. علاوه بر این (یا به عنوان جایگزین)، می‌توان یک کنش (action) از چارچوب کنش‌های عمومی را فراخوانی کرد.

اعمال یک کنش (action) از چارچوب کنش‌های عمومی بر روی بسته‌های منطبق.
مشخص کردن کلاسی که بسته‌های منطبق به آن هدایت شوند. CLASSID به فرم X:Y است، که در آن X و Y به عنوان اعداد در قالب شانزده‌شانزدهی (هگزادسیمال) تفسیر می‌شوند.
مشخص کردن یک کلاس ترافیک سخت‌افزاری برای هدایت بسته‌های منطبق به آن. TCID در محدوده ۰ تا ۱۵ است.
تطبیق بر اساس نام رابط ورودی. بدیهی است که این مورد فقط برای جریان‌های هدایت‌شده (forwarded) منطقی است. ifname نام یک رابط است که باید در زمان فراخوانی tc وجود داشته باشد.
فعال‌سازی ثبت گزارش با جزئیات کامل (verbose)، از جمله خطاهای برون‌سپاری سخت‌افزاری (offloading) در زمانی که از فلگ skip_sw استفاده نمی‌شود.
عدم پردازش فیلتر توسط نرم‌افزار. اگر سخت‌افزار از برون‌سپاری برای این فیلتر پشتیبانی نکند یا برون‌سپاری TC برای این رابط فعال نباشد، عملیات با شکست مواجه خواهد شد.
عدم پردازش فیلتر توسط سخت‌افزار.
تطبیق بر اساس نشانی MAC مبدأ یا مقصد. یک ماسک می‌تواند به صورت اختیاری برای محدود کردن بیت‌های مورد تطبیق نشانی ارائه شود. ماسک با قرار دادن یک اسلش پس از نشانی و سپس خود ماسک مشخص می‌شود. این ماسک می‌تواند در قالب LLADDR باشد که در این حالت یک ماسک بیتی (bitwise) است، یا به صورت تعداد بیت‌های باارزش بالا برای تطبیق مشخص شود. اگر ماسک ذکر نشود، تطبیق بر روی تمام بیت‌ها فرض خواهد شد.
تطبیق بر اساس تعداد تگ‌های VLAN در بسته. NUM می‌تواند ۰ یا یک عدد صحیح مثبت کوچک باشد؛ معمولاً در محدوده ۰ تا ۴ است.
تطبیق بر اساس شناسه تگ VLAN. VID یک مقدار ۱۲ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر اساس اولویت تگ VLAN. PRIORITY یک مقدار ۳ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر اساس پروتکل لایه سه. VLAN_ETH_TYPE می‌تواند ipv4، ipv6 یا یک مقدار ۱۶ بیتی بدون علامت در قالب شانزده‌شانزدهی باشد. برای تطبیق روی بسته‌های QinQ، این مقدار باید 802.1Q یا 802.1AD باشد.
تطبیق بر اساس شناسه تگ VLAN داخلی در QinQ. VID یک مقدار ۱۲ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر اساس اولویت تگ VLAN داخلی در QinQ. PRIORITY یک مقدار ۳ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر اساس پروتکل لایه سه در QinQ. VLAN_ETH_TYPE می‌تواند ipv4، ipv6 یا یک مقدار ۱۶ بیتی بدون علامت در قالب شانزده‌شانزدهی باشد.
تطبیق بر اساس شناسه نشست (session id) در PPPoE. PSID یک مقدار ۱۶ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر اساس پروتکل لایه سه در PPP. PPP_PROTO می‌تواند یکی از موارد ip، ipv6، mpls_uc، mpls_mc یا یک مقدار ۱۶ بیتی بدون علامت در قالب شانزده‌شانزدهی باشد.
تطبیق بر روی پشته برچسب MPLS. LSE_LIST فهرستی از مدخل‌های پشته برچسب (Label Stack Entries) است که هر کدام با کلمه کلیدی lse مشخص می‌شوند. این گزینه نمی‌تواند همراه با گزینه‌های مستقل mpls_label، mpls_tc، mpls_bos و mpls_ttl استفاده شود.
تطبیق بر روی یک مدخل پشته برچسب MPLS. LSE_OPTIONS فهرستی از گزینه‌ها است که مشخصات LSE را برای تطبیق توصیف می‌کند.
عمق مدخل پشته برچسب مورد نظر. عمق از ۱ شروع می‌شود (بیرونی‌ترین مدخل پشته برچسب). حداکثر عمق قابل استفاده ممکن است توسط هسته محدود شده باشد. این گزینه اجباری است. DEPTH یک مقدار ۸ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر روی فیلد برچسب MPLS در depth تعیین‌شده. LABEL یک مقدار ۲۰ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر روی فیلد کلاس ترافیک (Traffic Class) در MPLS در depth تعیین‌شده. TC یک مقدار ۳ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر روی فیلد انتهای پشته (Bottom Of Stack) در MPLS در depth تعیین‌شده. BOS یک مقدار ۱ بیتی در قالب ده‌دهی است.
تطبیق بر روی فیلد زمان حیات (Time To Live) در MPLS در depth تعیین‌شده. TTL یک مقدار ۸ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق شناسه برچسب در بیرونی‌ترین مدخل پشته برچسب MPLS. LABEL یک مقدار ۲۰ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر روی فیلد TC در MPLS (که معمولاً برای اولویت بسته استفاده می‌شود) در بیرونی‌ترین مدخل پشته برچسب MPLS. TC یک مقدار ۳ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر روی فیلد انتهای پشته (Bottom Of Stack) در بیرونی‌ترین مدخل پشته برچسب MPLS. BOS یک مقدار ۱ بیتی در قالب ده‌دهی است.
تطبیق بر روی فیلد زمان حیات (Time To Live) در بیرونی‌ترین مدخل پشته برچسب MPLS. TTL یک مقدار ۸ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر روی فیلد شناسه نشست L2TPv3 که روی IPv4 یا IPv6 منتقل می‌شود. LSID یک مقدار ۳۲ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر اساس پروتکل لایه چهار. IP_PROTO می‌تواند tcp، udp، sctp، icmp، icmpv6، l2tp یا یک مقدار ۸ بیتی بدون علامت در قالب شانزده‌شانزدهی باشد.
تطبیق بر روی TOS در IPv4 یا کلاس ترافیک در IPv6 - هشت بیت در قالب شانزده‌شانزدهی. یک ماسک می‌تواند به صورت اختیاری برای محدود کردن بیت‌های مورد تطبیق ارائه شود. ماسک با افزودن یک اسلش پس از مقدار و سپس خود ماسک مشخص می‌شود. در صورت عدم ذکر ماسک، تطبیق بر روی تمام بیت‌ها فرض می‌شود.
تطبیق بر روی TTL در IPv4 یا حد جهش (hop-limit) در IPv6 - مقدار هشت بیتی در قالب ده‌دهی یا شانزده‌شانزدهی. یک ماسک می‌تواند به صورت اختیاری برای محدود کردن بیت‌های مورد تطبیق ارائه شود. همان منطقی که برای ماسک در تطبیق روی ip_tos استفاده می‌شود، در اینجا نیز به کار می‌رود.
تطبیق بر روی نشانی IP مبدأ یا مقصد. PREFIX بسته به گزینه protocol در فیلتر tc، باید یک نشانی معتبر IPv4 یا IPv6 باشد که به صورت اختیاری یک اسلش و طول پیشوند به دنبال آن می‌آید. اگر پیشوند ذکر نشود، tc تطبیق کامل نشانی میزبان را فرض می‌کند.
تطبیق بر روی شماره پورت مبدأ یا مقصد پروتکل لایه ۴، همراه با یک ماسک اختیاری. متناوباً می‌توان مقادیر کمینه و بیشینه را برای تطبیق روی محدوده‌ای از شماره پورت‌های مبدأ یا مقصد پروتکل لایه ۴ تعیین کرد. تنها برای مقادیر udp، tcp و sctp در ip_proto در دسترس است که باید از قبل مشخص شده باشند.
تطبیق بر روی پرچم‌های TCP که به صورت یک میدان بیتی ۱۲ بیتی در قالب شانزده‌شانزدهی نمایش داده می‌شوند. یک ماسک می‌تواند به صورت اختیاری برای محدود کردن بیت‌های مورد تطبیق ارائه شود. ماسک با آوردن یک اسلش پس از مقدار و سپس خود ماسک تعیین می‌شود. در صورت عدم ذکر ماسک، تطبیق بر روی تمام بیت‌ها فرض می‌شود.
تطبیق بر روی نوع (type) یا کد (code) در ICMP. یک ماسک می‌تواند به صورت اختیاری برای محدود کردن بیت‌های مورد تطبیق ارائه شود. ماسک با آوردن یک اسلش پس از مقدار و سپس خود ماسک مشخص می‌شود. ماسک باید عددی باشد که یک ماسک بیتی را نشان می‌دهد. اگر ماسک ذکر نشود، تطبیق روی تمام بیت‌ها فرض می‌شود. این گزینه‌ها تنها برای مقادیر icmp و icmpv6 در ip_proto در دسترس هستند که باید از قبل مشخص شده باشند.
تطبیق بر روی نشانی IP فرستنده یا هدف در ARP یا RARP. IPV4_PREFIX باید یک نشانی معتبر IPv4 باشد که به صورت اختیاری یک اسلش و طول پیشوند به دنبال آن می‌آید. اگر پیشوند مشخص نشود، tc تطبیق کامل نشانی میزبان را فرض می‌کند.
تطبیق بر روی عملیات ARP یا RARP. ARP_OP می‌تواند request، reply یا یک مقدار صحیح ۰، ۱ یا ۲ باشد. یک ماسک می‌تواند به صورت اختیاری برای محدود کردن بیت‌های مورد تطبیق عملیات ارائه شود. ماسک با آوردن یک اسلش پس از نشانی و سپس خود ماسک مشخص می‌شود. این ماسک می‌تواند به صورت یک مقدار ۸ بیتی بدون علامت که نشان‌دهنده یک ماسک بیتی است ارائه گردد. در صورت عدم ذکر ماسک، تطبیق بر روی تمام بیت‌ها فرض می‌شود.
تطبیق بر روی نشانی MAC فرستنده یا هدف در ARP یا RARP. یک ماسک می‌تواند به صورت اختیاری برای محدود کردن بیت‌های مورد تطبیق نشانی ارائه شود. ماسک با آوردن یک اسلش به دنبال نشانی و سپس خود ماسک ارائه می‌شود. این ماسک می‌تواند در قالب LLADDR باشد که در این صورت یک ماسک بیتی است، یا به عنوان تعداد بیت‌های باارزش بالا برای تطبیق تعیین شود. در صورت عدم ذکر ماسک، تطبیق بر روی تمام بیت‌ها فرض می‌شود.
تطبیق بر اساس اطلاعات ردیابی اتصال (connection tracking)
تطبیق وضعیت اتصال که می‌تواند ترکیبی از پرچم‌های [{+|-}flag] باشد، که در آن flag می‌تواند یکی از موارد زیر باشد:
- اتصال ردیابی‌شده (Tracked).
- اتصال جدید (New).
- اتصال برقرارشده (Established).
- بسته در جهت پاسخ (reply) است، به این معنی که در جهتی مخالف بسته‌ای است که اتصال را آغاز کرده است.
- وضعیت نامعتبر است؛ بسته نتوانست به یک اتصال منتسب شود.
- بسته مرتبط با یک اتصال موجود است.
مثال: +trk+est
تطبیق ناحیه اتصال که می‌تواند دارای ماسک باشد.
تطبیق ۳۲ بیتی بر روی نشان اتصال (connection mark) که می‌تواند دارای ماسک باشد.
تطبیق ۱۲۸ بیتی بر روی برچسب اتصال (connection label) که می‌تواند دارای ماسک باشد.
تطبیق بر اساس فراداده تونل IP. شناسه کلید (Key id) NUMBER یک شناسه کلید تونل ۳۲ بیتی است (مانند VNI برای تونل VXLAN). PREFIX باید یک نشانی معتبر IPv4 یا IPv6 باشد که به صورت اختیاری یک اسلش و طول پیشوند به دنبال آن می‌آید. در صورت عدم وجود پیشوند، tc تطبیق کامل نشانی میزبان را فرض می‌کند. پورت مقصد (Dst port) NUMBER یک پورت مقصد ۱۶ بیتی UDP است. NUMBER در enc_tos یک مقدار ۸ بیتی tos (شامل dscp+ecn) است و NUMBER در enc_ttl یک مقدار زمان حیات (time-to-live) ۸ بیتی است. OPTIONS در geneve_opts باید یک فهرست معتبر از گزینه‌های geneve جداشده با کاما باشد که هر گزینه شامل یک کلید و به دنبال آن به صورت اختیاری یک اسلش و ماسک مربوطه است. در صورت عدم ذکر ماسک‌ها، tc تطبیق کامل را فرض می‌کند. این گزینه‌ها را می‌توان به فرم CLASS:TYPE:DATA/CLASS_MASK:TYPE_MASK:DATA_MASK توصیف کرد، که در آن CLASS به عنوان یک مقدار ۱۶ بیتی شانزده‌شانزدهی، TYPE به عنوان یک مقدار ۸ بیتی شانزده‌شانزدهی و DATA به عنوان یک مقدار شانزده‌شانزدهی با طول متغیر نشان داده می‌شوند. در vxlan_opts شناسه OPTIONS از چند گزینه پشتیبانی نمی‌کند و شامل یک کلید به همراه یک اسلش و ماسک مربوطه است. اگر ماسک ذکر نشود، tc تطبیق کامل را فرض می‌کند. این گزینه می‌تواند به فرم GBP/GBP_MASK توصیف شود که در آن GBP به صورت یک عدد ۳۲ بیتی نمایش داده می‌شود. در erspan_opts شناسه OPTIONS از چند گزینه پشتیبانی نمی‌کند و شامل یک کلید به همراه یک اسلش و ماسک مربوطه است. در صورت عدم ذکر ماسک، tc تطبیق کامل را فرض می‌کند. این گزینه می‌تواند به فرم VERSION:INDEX:DIR:HWID/VERSION:INDEX_MASK:DIR_MASK:HWID_MASK توصیف شود که در آن VERSION به صورت یک عدد ۸ بیتی، INDEX به صورت یک عدد ۳۲ بیتی و DIR و HWID به صورت یک عدد ۸ بیتی نمایش داده می‌شوند. استفاده از چند گزینه پشتیبانی نمی‌شود. توجه داشته باشید که INDEX/INDEX_MASK زمانی استفاده می‌شود که VERSION برابر با ۱ باشد، و DIR/DIR_MASK و HWID/HWID_MASK زمانی استفاده می‌شوند که VERSION برابر با ۲ باشد. در gtp_opts شناسه OPTIONS از چند گزینه پشتیبانی نمی‌کند و شامل یک کلید به همراه یک اسلش و ماسک مربوطه است. اگر ماسک ذکر نشود، tc تطبیق کامل را فرض می‌کند. این گزینه را می‌توان به فرم PDU_TYPE:QFI/PDU_TYPE_MASK:QFI_MASK توصیف کرد که در آن هر دو مقدار PDU_TYPE و QFI به صورت مقادیر ۸ بیتی شانزده‌شانزدهی نمایش داده می‌شوند. در pfcp_opts شناسه OPTIONS از چند گزینه پشتیبانی نمی‌کند و شامل یک کلید به همراه یک اسلش و ماسک مربوطه است. اگر ماسک ذکر نشود، tc تطبیق کامل را فرض می‌کند. این گزینه می‌تواند به فرم TYPE:SEID/TYPE_MASK:SEID_MASK توصیف شود که در آن TYPE به عنوان یک عدد ۸ بیتی و SEID به صورت ۶۴ بیتی ارائه می‌شوند. هر دوی TYPE و SEID در قالب شانزده‌شانزدهی ارائه می‌شوند.
IP_FLAGS می‌تواند یکی از مقادیر frag، nofrag، firstfrag یا nofirstfrag باشد که به ترتیب می‌توان از frag و nofrag برای تطبیق روی بسته‌های قطعه‌قطعه‌شده یا قطعه‌قطعه‌نشده استفاده کرد. گزینه‌های firstfrag و nofirstfrag می‌توانند برای تمایز بیشتر بسته‌های قطعه‌بندی‌شده به کار روند. از firstfrag می‌توان برای نشان دادن اولین بسته قطعه‌بندی‌شده استفاده کرد. گزینه nofirstfrag می‌تواند نشان‌دهنده بسته‌های قطعه‌بندی‌شده بعدی یا بسته‌های قطعه‌بندی‌نشده باشد.
تطبیق بر اساس نیافتن آدرس در لایه ۲ (layer 2 miss) در FDB / MDB راه‌انداز بریج. L2_MISS می‌تواند ۰ یا ۱ باشد. هنگامی که ۱ باشد، بر روی بسته‌هایی که با عدم تطابق در لایه ۲ مواجه شده‌اند تطبیق داده می‌شود. وقتی ۰ باشد، بر روی بسته‌هایی تطبیق انجام می‌شود که با استفاده از یک مدخل FDB / MDB هدایت شده‌اند. توجه داشته باشید که بسته‌های پخشی (broadcast) با عدم تطابق مواجه نمی‌شوند چرا که جستجویی برای آن‌ها انجام نمی‌گیرد.
تطبیق بر روی فیلدهای مدیریت خطای اتصال (Connectivity Fault Management یا CFM). CFM_OPTIONS فهرستی از گزینه‌ها است که ویژگی‌های فیلدهای اطلاعاتی CFM را برای تطبیق توصیف می‌کند.
تطبیق بر روی فیلد سطح دامنه نگهداری (Maintenance Domain یا MD). LEVEL یک مقدار ۳ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر روی فیلد کد عملیات (opcode) در CFM. OPCODE یک مقدار ۸ بیتی بدون علامت در قالب ده‌دهی است.
تطبیق بر اساس پرچم‌های کنترلی تونل. ENCFLAG-LIST فهرستی از پرچم‌های کنترلی تونل زیر است: [no]tuncsum، [no]tundf، [no]tunoam، [no]tuncrit، که هر کدام با '/' جدا شده‌اند.

همان‌طور که در بالا در موارد مربوطه بیان شد، تطبیق‌های یک لایه معین به طور ضمنی به تطبیق‌های لایه پایین‌تر بعدی وابسته هستند. به طور دقیق، تطبیق‌های لایه یک و دو (indev، dst_mac، src_mac و enc_flags) هیچ وابستگی ندارند؛ تطبیق‌های MPLS و لایه سه (mpls، mpls_label، mpls_tc، mpls_bos، mpls_ttl، ip_proto، dst_ip، src_ip، arp_tip، arp_sip، arp_op، arp_tha، arp_sha و ip_flags) به گزینه protocol در فیلتر tc وابسته هستند؛ تطبیق‌های پورت در لایه چهار (dst_port و src_port) به تنظیم بودن ip_proto روی مقادیر tcp، udp یا sctp وابسته می‌باشند؛ و در نهایت تطبیق‌های ICMP (code و type) به تنظیم بودن ip_proto روی icmp یا icmpv6 وابستگی دارند.

تنها می‌توان از یک ماسک در هر اولویت (prio) استفاده کرد. اگر کاربر نیاز به تعیین ماسک متفاوتی داشته باشد، باید از prio متفاوتی استفاده کند.

tc(8), tc-flow(8)

22 Oct 2015 iproute2