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 تعیین میشود:
| جایگاه در chain | packetهای 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"
}
فیلدهای ضروری
فیلدهای سطح بالا:
| فیلد | نوع | توضیح |
|---|---|---|
name | string | نام دلخواه نود. باید داخل فایل config یکتا باشد. |
type | string | باید دقیقاً "RawSocket" باشد. |
settings | object | الزامی است، زیرا حالت capture و بازههای آن باید تنظیم شوند. |
فیلدهای ضروری داخل settings:
| گزینه | نوع | توضیح |
|---|---|---|
capture-filter-mode | string | حالت فیلتر 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-name | string | unnamed-capture-device | نامی که به capture-device backend داده میشود. |
raw-device-name | string | unnamed-raw-device | نامی که به raw-output backend داده میشود. |
mark | integer | 0 | firewall 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 دریافت میکند:
RawSocketبررسی میکند که packet از نوع IPv4 باشد.- packetهای غیر IPv4 به pool برگردانده میشوند و به chain راه پیدا نمیکنند.
- worker packet line متناظر از chain گرفته میشود.
- packet IPv4 captureشده به سمت نود مجاور انتخابشده فرستاده میشود.
اعمال فیلتر IP تنظیمشده بر عهده backend مربوط به capture است. RawSocket برای هر packet یک line معمول per-connection نمیسازد.
مسیر Output
وقتی upstream یا downstream payload به RawSocket میرسد:
- buffer مربوط به payload یک packet خام IP در نظر گرفته میشود.
- اگر line مقدار
recalculate_checksumداشته باشد و packet از نوع IPv4 باشد، WaterWall قبل از نوشتن checksumهای packet را دوباره محاسبه میکند. - packet از طریق raw output device نوشته میشود.
- اگر 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 Payload | payload را از طریق raw output device تزریق میکند. |
downstream Payload | payload را از طریق raw output device تزریق میکند. |
| captured packet callback | packet 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 |
| adapter | true |
can_have_prev | true |
can_have_next | true |
layer_group | kNodeLayer3 |
layer_group_prev_node | kNodeLayerAnything |
layer_group_next_node | kNodeLayerAnything |
required_padding_left | 0 bytes |
این نود protocol header اضافه نمیکند و به left padding نیاز ندارد.
نکتههای عملی
- برنامه را با دسترسیهای لازم برای backend مربوط به raw/capture در همان platform اجرا کنید.
capture-ipsرا صریح تنظیم کنید؛ آرایه خالی رد میشود.- بهجای
capture-ipقدیمی،capture-ipsرا ترجیح دهید. - مسیر دریافت فعلی فقط packetهای IPv4 را عبور میدهد.
- رفتار هر platform به raw socket و backendهای موجود برای capture و firewall mark وابسته است.