پرش به مطلب اصلی

LoggerTunnel

LoggerTunnel یک node شفاف برای مشاهده و ثبت payload است. داده را تغییر نمی‌دهد، line تازه‌ای نمی‌سازد و آزاد نمی‌کند و جهت lifecycle در chain را نیز عوض نمی‌کند.

وقتی می‌خواهید رفتار یک chain را بدون دست بردن در مسیر اصلی ترافیک بررسی کنید، از این node استفاده کنید.

جایگاه رایج​

از آنجا که LoggerTunnel فقط نقش ناظر دارد، می‌تواند در ابتدا، میانه یا انتهای بخشی از chain قرار بگیرد:

TcpListener -> LoggerTunnel -> TcpConnector
TunDevice -> LoggerTunnel -> IpManipulator
UdpListener -> LoggerTunnel -> UdpConnector

این node می‌تواند هم prev و هم next داشته باشد، اما نبودن یکی از طرف‌ها نیز مشکلی ایجاد نمی‌کند. اگر callback قرار باشد به سمتی برود که وجود ندارد، node فقط برمی‌گردد و lifecycle ساختگی ایجاد نمی‌کند.

نمونه تنظیمات​

ثبت payload در network logger:

{
"name": "trace-http",
"type": "LoggerTunnel",
"settings": {
"mode": "log",
"level": "info"
},
"next": "next-node"
}

ذخیره payload خام در فایلی جداگانه برای هر جهت:

{
"name": "payload-dump",
"type": "LoggerTunnel",
"settings": {
"mode": "file",
"output-mode": "split-direction"
},
"next": "next-node"
}

استخراج فقط payload مربوط به TCP از packet‌های IPv4:

{
"name": "tcp-body-dump",
"type": "LoggerTunnel",
"settings": {
"mode": "tcp-payload-file",
"output-mode": "per-payload"
},
"next": "next-node"
}

فیلدهای اجباری​

فیلدنوعتوضیح
typestringباید LoggerTunnel باشد.
settingsobjectباید object غیرخالی باشد و mode داشته باشد.

نوشتن فیلد name به‌شدت توصیه می‌شود، زیرا خروجی فایل از نام node به‌عنوان پیشوند استفاده می‌کند. اگر name خالی یا ناموجود باشد، پیشوند LoggerTunnel به کار می‌رود.

تنظیمات​

گزینهاجباریپیش‌فرضتوضیح
modeبلهنداردنوع خروجی. یکی از log، file یا tcp-payload-file.
levelخیر، فقط برای حالت logdebugسطح network logger برای mode: "log". یکی از debug، info، warning، error یا fatal.
output-modeخیر، فقط برای حالت‌های فایلsplit-directionساختار فایل برای mode: "file" و mode: "tcp-payload-file". یکی از per-payload، split-direction یا single-file.

وقتی mode برابر log است، output-mode استفاده نمی‌شود. وقتی mode برابر file یا tcp-payload-file است، level استفاده نمی‌شود.

modeها​

modeچیزی که ثبت می‌شودمقصد
logطول payload و نمایش hex از کل buffer آن.WaterWall network logger.
fileدقیقاً همان بایت‌های موجود در sbuf_t هنگام callback.فایل‌ها در working directory فعلی.
tcp-payload-fileفقط TCP transport payload استخراج‌شده از packet IPv4.فایل‌ها در working directory فعلی.

output-mode​

output-mode برای file و tcp-payload-file استفاده می‌شود.

مقداررفتار
per-payloadهر callbackِ payload را در فایل جداگانه‌ای می‌نویسد: <name>-up-1.txt، <name>-up-2.txt، <name>-down-1.txt و ... . شمارنده‌های upstream و downstream جدا هستند. فایل‌ها در حالت write باز می‌شوند؛ بنابراین فایل هم‌نام از اجرای قبلی ممکن است بازنویسی شود.
split-directionهمه بایت‌های upstream را به <name>-up.txt و بایت‌های downstream را به <name>-down.txt اضافه می‌کند.
single-fileداده هر دو جهت را به <name>-all.txt اضافه می‌کند.

پسوند فایل‌ها .txt است، اما محتوای آن‌ها بایت خام است. هیچ separator، timestamp، طول packet یا marker فریم اضافه نمی‌شود.

جریان اجرا​

LoggerTunnel پیش از عبور دادن payload، آن را در لاگ یا فایل ثبت می‌کند.

مسیر upstream:

previous node -> LoggerTunnel logs payload -> next node

در upstream، اگر next وجود داشته باشد، payload با tunnelNextUpStreamPayload() فرستاده می‌شود.

مسیر downstream:

next node -> LoggerTunnel logs payload -> previous node

در downstream، اگر prev وجود داشته باشد، payload با tunnelPrevDownStreamPayload() فرستاده می‌شود.

callback‌های غیر payload بدون تغییر عبور می‌کنند:

جهت callbackرفتار
Upstream Init, Est, Finish, Pause, Resumeدر صورت وجود next، به node بعدی فرستاده می‌شود.
Downstream Init, Est, Finish, Pause, Resumeدر صورت وجود prev، به node قبلی فرستاده می‌شود.

این node state مخصوص line ندارد. state آن در سطح تونل است و حالت، سطح لاگ، مسیر و شمارنده فایل‌ها و mutex لازم برای serialize کردن نوشتن فایل را نگه می‌دارد.

استخراج TCP Payload​

در tcp-payload-file، هر buffer payload به‌عنوان یک packet کامل IPv4 بررسی می‌شود و فقط بایت‌های پس از header‌های IPv4 و TCP نوشته می‌شوند.

packet در این حالت‌ها نادیده گرفته می‌شود:

  • کوتاه‌تر از header IPv4 باشد
  • IPv4 نباشد
  • protocol آن TCP نباشد
  • طول header یا total length معتبر نباشد
  • fragment شده باشد
  • طول header TCP معتبر نباشد
  • TCP segment هیچ transport payload نداشته باشد

این حالت فقط IPv4 را پشتیبانی می‌کند. packet‌های IPv6 و غیر TCP نادیده گرفته می‌شوند.

اگر یک packet معتبر بعد از IPv4 total length داده اضافه داشته باشد، آن بایت‌های اضافه بخشی از TCP payload استخراج‌شده نیستند.

نکته‌های عملیاتی​

  • LoggerTunnel محتوای واقعی ترافیک را ثبت می‌کند. هنگام کار با password، token، private key، cookie، اطلاعات کاربران و ترافیک production با احتیاط از آن استفاده کنید.
  • در log mode، کل payload به hex تبدیل می‌شود. در ترافیک زیاد یا payload بزرگ، log می‌تواند بسیار حجیم شود.
  • مسیر خروجی فایل نسبت به working directory فعلی processِ WaterWall محاسبه می‌شود.
  • split-direction و single-file به فایل‌های موجود append می‌کنند. در صورت نیاز فایل‌های قدیمی را rotate یا حذف کنید.
  • عملیات نوشتن فایل داخل state مربوط به node، serialize می‌شود؛ بنابراین چند worker هم‌زمان در فایل خروجی نمی‌نویسند.
  • در chain‌های packet، file mode کل packet buffer رسیده به node را ذخیره می‌کند. فقط وقتی از tcp-payload-file استفاده کنید که buffer‌ها packet‌های IPv4 باشند و هدف، ثبت بایت‌های دادهٔ برنامه در TCP باشد.
  • خطا در log یا file write عمداً مسیر forwarding را تغییر نمی‌دهد. payload بدون تغییر از chain عبور می‌کند.

متادیتای نود​

هنگام استفاده از خروجی فایل، پیشوند نام فایل مقدار name node است؛ اگر name خالی باشد، LoggerTunnel به‌کار می‌رود.

metadata برگرفته از کد منبع:

ویژگیمقدار
node flagskNodeFlagNone
can_have_prevtrue
can_have_nexttrue
layer_groupkNodeLayerAnything
layer_group_prev_nodekNodeLayerSameAsNext
layer_group_next_nodekNodeLayerSameAsPrev
required_padding_left0 bytes