ctinfo action in tc(8) Linux ctinfo action in tc(8)

tc-ctinfo - اکشن پردازش connmark در tc

tc ... action ctinfo [ dscp MASK [STATEMASK] ] [ cpmark [MASK] ] [ zone ZONE ] [ CONTROL ] [ index <INDEX> ]

اکشن CTINFO (کوتاه‌شده‌ی Conntrack Information یا اطلاعات ردیابی اتصال) یک اکشن tc برای بازیابی داده‌ها از نشان‌های ردیابی اتصال (conntrack marks) به درون فیلدهای گوناگون است. در حال حاضر این اکشن دارای دو حالت پردازشی مستقل است که می‌توان آن‌ها را به عنوان زیر‌تابع در نظر گرفت.

حالت DSCP مقدار DSCP ذخیره‌شده در connmark ردیابی اتصال را در فیلد diffserv بسته IPv4/v6 کپی می‌کند. این کپی کردن می‌تواند بر اساس پرچمی که آن هم در connmark ذخیره شده است، به صورت شرطی رخ دهد. حالت DSCP برای کمک به بازیابی رده‌بندی بسته‌ها در ورودی (ingress) طراحی شده است؛ رده‌بندی‌هایی که پس از آن می‌توانند توسط qdiscهایی نظیر CAKE استفاده شوند. این حالت در هر شرایطی که رده‌بندی ترافیک ورودی باید در سراسر پیوندهایی که ممکن است طبق سیاست‌های خود برچسب‌ها را پاک (bleach) یا بازنگاشت (remap) کنند حفظ شود، قابل استفاده است.

حالت CPMARK (مخفف copymark) مقدار connmark ردیابی اتصال را در فیلد نشان (mark) بسته کپی می‌کند. بدون پارامترهای اضافی، این حالت از نظر عملکردی کاملاً معادل اکشن موجود connmark است. می‌توان یک ماسک اختیاری را برای تعیین اینکه کدام بیت‌های connmark بازیابی شوند مشخص کرد. این قابلیت هنگامی که حالت‌های DSCP و CPMARK با یکدیگر ترکیب می‌شوند می‌تواند مفید باشد.

آمارهای ساده (tc -s) برای بازیابی‌های DSCP و کپی‌های CPMARK نگهداری می‌شوند که در آن‌ها مقادیر set نشان‌دهنده تعداد بسته‌های تغییریافته برای آن حالت هستند. حالت DSCP شامل شمارش خطاهایی نیز هست که در آن‌ها فیلد diffserv بسته مقصد غیرقابل نوشتن بوده است.

ماسک ۶ بیت متوالی که محل قرارگیری مقدار DSCP را در فیلد ۳۲ بیتی نشان ردیابی اتصال (conntrack mark) مشخص می‌کند. برای این حالت حتماً باید یک ماسک مشخص شود. mask یک مقدار ۳۲ بیتی بدون علامت است.
ماسکی با حداقل ۱ بیت که محل قرارگیری پرچم بازیابی شرطی را در فیلد ۳۲ بیتی conntrack mark مشخص می‌کند. بیت یا بیت‌های statemask نباید با بیت‌های mask هم‌پوشانی داشته باشند. مقدار DSCP در صورتی بازیابی خواهد شد که عملیات AND منطقی بین conntrack mark و statemask یک نتیجه غیرصفر داشته باشد. statemask یک مقدار اختیاری ۳۲ بیتی بدون علامت است.

نتیجه حاصل از AND منطقی conntrack mark و mask را در فیلد نشان (mark) بسته ذخیره می‌کند. مقدار پیش‌فرض 0xffffffff است، یعنی کل فیلد نشان. mask یک مقدار اختیاری ۳۲ بیتی بدون علامت است.

ناحیه (zone) مربوط به conntrack را هنگام انجام جستجوهای ردیابی اتصال برای بسته‌ها مشخص می‌کند. zone یک مقدار ده‌دهی ۱۶ بیتی بدون علامت است. مقدار پیش‌فرض 0 است.
کلمات کلیدی زیر امکان کنترل نحوه پیمایش بیشتر در درخت qdisc، کلاس‌ها، فیلترها و اکشن‌ها را پس از اجرای این اکشن فراهم می‌کنند.
شروع مجدد از اولین فیلتر در فهرست فعلی.
ادامه کار با اکشن بعدی متصل به همان فیلتر.
انداختن (drop) بسته.
مترادف با drop
ادامه رده‌بندی با فیلتر بعدی موجود در صف.
پایان دادن به فرآیند رده‌بندی و بازگشت به qdisc فراخوان برای پردازش بیشتر بسته. این حالت پیش‌فرض است.
مشخص کردن یک نمایه (index) برای این اکشن تا بتوان بعداً در دستورات دیگر آن را شناسایی کرد. index یک مقدار ده‌دهی ۳۲ بیتی بدون علامت است.

مثالی که بازیابی شرطی DSCP در ورودی (ingress) را از طریق یک IFB نشان می‌دهد:

# راه‌اندازی رابط IFB
tc qdisc add dev ifb4eth0 handle ffff: ingress
# تنظیم qdisc از نوع CAKE روی آن
tc qdisc add dev ifb4eth0 root cake bandwidth 40mbit
# فعال‌سازی رابط (UP)
ip link set dev ifb4eth0 up
# افزودن ۲ اکشن: ctinfo برای بازیابی dscp و mirred برای هدایت بسته‌ها به IFB
tc filter add dev eth0 parent ffff: protocol all prio 10 u32     match u32 0 0 flowid 1:1 action        ctinfo dscp 0xfc000000 0x01000000      mirred egress redirect dev ifb4eth0
tc -s qdisc show dev eth0 ingress
 filter parent ffff: protocol all pref 10 u32 chain 0
 filter parent ffff: protocol all pref 10 u32 chain 0 fh 800: ht divisor 1
 filter parent ffff: protocol all pref 10 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1 not_in_hw
  match 00000000/00000000 at 0
    action order 1: ctinfo zone 0 pipe
    index 2 ref 1 bind 1 dscp 0xfc000000 0x01000000 installed 72 sec used 0 sec DSCP set 1333 error 0 CPMARK set 0
    Action statistics:
    Sent 658484 bytes 1833 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    action order 2: mirred (Egress Redirect to device ifb4eth0) stolen
    index 1 ref 1 bind 1 installed 72 sec used 0 sec
    Action statistics:
    Sent 658484 bytes 1833 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0

مثالی که بازیابی شرطی DSCP در خروجی (egress) را نشان می‌دهد:

این مورد ممکن است بی‌معنی به نظر برسد چرا که نشانه‌گذاری بسته‌های خروجی با iptables به سادگی قابل انجام است؛ با این حال، ممکن است قوانین رده‌بندی جریان در iptables بسیار مفصل باشند و بنابراین نوعی سازوکار «یک‌بار تنظیم کن و فراموش کن» به خصوص در دستگاه‌هایی با محدودیت پردازنده (CPU) می‌تواند بسیار کارآمد باشد.

# هدایت اتصال‌های بدون نشان به زنجیره نشانه‌گذاری که باید DSCP را ذخیره کرده
# و بیت statemask را در connmark تنظیم کند
iptables -t mangle -A POSTROUTING -o eth0 -m connmark     --mark 0x00000000/0x01000000 -g CLASS_MARKING_CHAIN
# اعمال DSCP نشانه‌گذاری‌شده بر روی بسته‌ها
tc filter add dev eth0 protocol all prio 10 u32     match u32 0 0 flowid 1:1 action     ctinfo dscp 0xfc000000 0x01000000
tc -s filter show dev eth0
 filter parent 800e: protocol all pref 10 u32 chain 0
 filter parent 800e: protocol all pref 10 u32 chain 0 fh 800: ht divisor 1
 filter parent 800e: protocol all pref 10 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1 not_in_hw
  match 00000000/00000000 at 0
    action order 1: ctinfo zone 0 pipe
    index 1 ref 1 bind 1 dscp 0xfc000000 0x01000000 installed 7414 sec used 0 sec DSCP set 53404 error 0 CPMARK set 0
    Action statistics:
    Sent 32890260 bytes 120441 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0

tc(8), tc-cake(8), tc-connmark(8), tc-mirred(8)

اکشن ctinfo توسط Kevin Darbyshire-Bryant نوشته شده است.

4 Jun 2019 iproute2