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

RawSocket

RawSocket واتروال را به capture و injection مربوط به packetهای خام IPv4 متصل می‌کند. این نود می‌تواند packetها را از network stack میزبان بگیرد، وارد یک chain لایه ۳ کند و packetهای خام IP برگشتی از chain را روی raw output device بنویسد.

در مستندات قدیمی ممکن است نام RawDevice را ببینید؛ نام نوع فعلی نود RawSocket است.

RawSocket یک adapter لایه ۳ است، نه یک tunnel مبتنی بر connection. packetهای captureشده روی worker packet lineها فرستاده می‌شوند و هر payloadی که از یکی از دو جهت chain به RawSocket برسد، یک packet خام و کامل IP در نظر گرفته می‌شود و روی raw output device نوشته خواهد شد.

جایگاه رایج

در لبه یک packet chain:

RawSocket -> PacketReceiver
PacketSender -> RawSocket
TunDevice -> IpManipulator -> RawSocket

همراه نودهای packet disguise:

TunDevice -> PingClient -> RawSocket
RawSocket -> PingServer -> TunDevice

وقتی RawSocket در جایگاه اول است، packetهای wrap‌شده و captureشده را در جهت upstream وارد PingServer می‌کند. PingServer آن‌ها را به سمت TunDevice بازیابی می‌کند؛ packetهای ساده‌ای که TunDevice می‌گیرد در جهت downstream از PingServer عبور می‌کنند تا wrap و از raw output تزریق شوند.

RawSocket می‌تواند نود قبلی، نود بعدی یا هر دو را داشته باشد. جهت ارسال packetهای captureشده هنگام startup تعیین می‌شود:

جایگاه در chainpacketهای IPv4 captureشده به کدام سمت فرستاده می‌شوند
RawSocket آخرین نود chain استبه نود قبلی، در جهت downstream
RawSocket آخرین نود chain نیستبه نود بعدی، در جهت upstream

هر payloadی که از upstream یا downstream به RawSocket برسد، از همان raw output device تزریق می‌شود.

نمونه تنظیم

{
"name": "raw-ip",
"type": "RawSocket",
"settings": {
"capture-device-name": "capture-in",
"raw-device-name": "raw-out",
"capture-filter-mode": "source-ip",
"capture-ips": [
"192.0.2.10",
"198.51.100.0/24"
],
"mark": 10
},
"next": "next-node-name"
}

فیلدهای ضروری

فیلدهای سطح بالا:

فیلدنوعتوضیح
namestringنام دلخواه نود. باید داخل فایل config یکتا باشد.
typestringباید دقیقاً "RawSocket" باشد.
settingsobjectالزامی است، زیرا حالت capture و بازه‌های آن باید تنظیم شوند.

فیلدهای ضروری داخل settings:

گزینهنوعتوضیح
capture-filter-modestringحالت فیلتر capture. parser مقدارهای "source-ip" و "dest-ip" را می‌شناسد، اما پیاده‌سازی فعلی فقط "source-ip" را می‌پذیرد.
capture-ipsآرایه stringآرایه‌ای غیرخالی از آدرس‌ها یا بازه‌های CIDR مربوط به IPv4 که باید capture شوند.

هر عضو capture-ips می‌تواند یک IPv4 تکی باشد:

"192.0.2.10"

یا یک CIDR IPv4:

"198.51.100.0/24"

مقادیر IPv6 رد می‌شوند.

تنظیمات اختیاری

گزینهنوعپیش‌فرضتوضیح
capture-device-namestringunnamed-capture-deviceنامی که به capture-device backend داده می‌شود.
raw-device-namestringunnamed-raw-deviceنامی که به raw-output backend داده می‌شود.
markinteger0firewall mark برای raw output device، در platform یا backendهایی که آن را پشتیبانی می‌کنند.

Aliasهای سازگاری:

Aliasمعنا
listen-ipsبه‌عنوان alias برای capture-ips پذیرفته می‌شود.
capture-ipبازه قدیمیِ تک‌رشته‌ای برای capture. مانند یک ورودی /32 پذیرفته می‌شود؛ در configهای جدید از capture-ips استفاده کنید.

مسیر Capture

در startup، RawSocket این‌ها را می‌سازد:

  • یک capture device با rangeهای IPv4 تنظیم‌شده
  • یک raw output device برای packet injection

وقتی backend مربوط به capture یک packet دریافت می‌کند:

  1. RawSocket بررسی می‌کند که packet از نوع IPv4 باشد.
  2. packetهای غیر IPv4 به pool برگردانده می‌شوند و به chain راه پیدا نمی‌کنند.
  3. worker packet line متناظر از chain گرفته می‌شود.
  4. packet IPv4 captureشده به سمت نود مجاور انتخاب‌شده فرستاده می‌شود.

اعمال فیلتر IP تنظیم‌شده بر عهده backend مربوط به capture است. RawSocket برای هر packet یک line معمول per-connection نمی‌سازد.

مسیر Output

وقتی upstream یا downstream payload به RawSocket می‌رسد:

  1. buffer مربوط به payload یک packet خام IP در نظر گرفته می‌شود.
  2. اگر line مقدار recalculate_checksum داشته باشد و packet از نوع IPv4 باشد، WaterWall قبل از نوشتن checksumهای packet را دوباره محاسبه می‌کند.
  3. packet از طریق raw output device نوشته می‌شود.
  4. اگر raw device در دسترس نباشد یا نوشتن شکست بخورد، buffer به pool برگردانده می‌شود.

هر دو callback upstream و downstream payload از همین write path استفاده می‌کنند.

رفتار Checksum

RawSocket metadata مربوط به checksum را که نودهای قبلی روی packet-line گذاشته‌اند رعایت می‌کند.

اگر line->recalculate_checksum تنظیم شده باشد و payload از نوع IPv4 باشد:

  • تلاش می‌شود checksum کامل packet دوباره محاسبه شود
  • flag پس از محاسبه دوباره پاک می‌شود
  • جزئیات checksum لایه transport در packetهای fragment‌شده IPv4 به‌وسیله helper مشترک checksum مدیریت می‌شود

این رفتار پس از نودهایی مانند IpManipulator یا IpOverrider مفید است؛ نودهایی که فیلدهای IPv4، TCP، UDP یا ICMP را تغییر می‌دهند و پیش از خروجی نهایی، ترمیم checksum را درخواست می‌کنند.

محدودیت‌های Capture Filter

settings parser این مقدارها را می‌شناسد:

source-ip
dest-ip

رفتار فعلی سخت‌گیرانه‌تر است:

  • source-ip پذیرفته می‌شود
  • dest-ip باعث شکست ساخت tunnel می‌شود و پیام خطا، استفاده از TunDevice را برای capture ترافیک خروجی پیشنهاد می‌کند

در Linux، ‏ruleهای NFQUEUE از --queue-bypass استفاده می‌کنند. اگر WaterWall روی queue گوش نکند، packetهای matching به‌جای drop شدن به‌علت نبود queue، از firewall میزبان عبور می‌کنند. این یک سیاست availability از نوع fail-open است: تا وقتی listener وجود ندارد، packetها capture یا transform نمی‌شوند. این گزینه در زمانی که WaterWall هنوز به queue متصل است، overflow شدن queue را fail-open نمی‌کند. WaterWall از شماره queueهایی که از قبل در ruleهای INPUT استفاده شده‌اند دوری می‌کند. شکست نهایی در startup مربوط به capture یا cleanup کردن rule، ‏queue را سریع می‌بندد و آن capture-device object را غیرقابل restart می‌کند؛ در نتیجه --queue-bypass برای هر ruleای که حذف نشده باشد فعال می‌شود. queue reader باید پیش از نصب اولین rule آماده بودن خود را گزارش کند و در تمام مدت نصب ruleها، rollback و cleanup هنگام bring-down در حال اجرا بماند. تا زمانی که همه ruleها نصب نشده‌اند و raw output device آماده نیست، packetها NF_ACCEPT می‌گیرند و وارد chain نمی‌شوند. سپس capture به حالت drop-and-dispatch تغییر می‌کند. هنگام shutdown، پیش از حذف ruleها capture غیرفعال می‌شود. خروج غیرمنتظره reader نیز capture را غیرفعال و queue را فوراً می‌بندد تا ruleهای باقی‌مانده fail-open شوند. تا زمانی که thread مربوط به reader قابل join است، مالک queue descriptor محسوب می‌شود؛ cleanup نهایی درخواست بسته شدن می‌دهد و wrapper مربوط به reader فقط پس از پایان استفاده routine از descriptor، ‏queue را می‌بندد.

اگر به رفتار virtual interface یا پردازش routed برای packetهای خروجی نیاز دارید، از TunDevice استفاده کنید. RawSocket برای زمانی است که مشخصاً capture از host stack همراه با تزریق خام IPv4 می‌خواهید.

رفتار Direction و Lifecycle

Callbackرفتار
upstream Payloadpayload را از طریق raw output device تزریق می‌کند.
downstream Payloadpayload را از طریق raw output device تزریق می‌کند.
captured packet callbackpacket IPv4 captureشده را روی worker packet line به نود مجاور انتخاب‌شده می‌فرستد.
Init, Est, Pause, Resume, Finishکاری انجام نمی‌دهند؛ RawSocket بر اساس lifecycle مربوط به connection کار نمی‌کند.

RawSocket یک adapter است و در runtime معمول packet lineها را از بین نمی‌برد. Worker packet lineها متعلق به chain هستند.

متادیتای نود

Metadata برگرفته از source:

ویژگیمقدار
node flags`kNodeFlagChainHead
adaptertrue
can_have_prevtrue
can_have_nexttrue
layer_groupkNodeLayer3
layer_group_prev_nodekNodeLayerAnything
layer_group_next_nodekNodeLayerAnything
required_padding_left0 bytes

این نود protocol header اضافه نمی‌کند و به left padding نیاز ندارد.

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

  • برنامه را با دسترسی‌های لازم برای backend مربوط به raw/capture در همان platform اجرا کنید.
  • capture-ips را صریح تنظیم کنید؛ آرایه خالی رد می‌شود.
  • به‌جای capture-ip قدیمی، capture-ips را ترجیح دهید.
  • مسیر دریافت فعلی فقط packetهای IPv4 را عبور می‌دهد.
  • رفتار هر platform به raw socket و backendهای موجود برای capture و firewall mark وابسته است.