IpOverrider
IpOverrider آدرسهای source و destination را در payloadِ خام packet بازنویسی
میکند.
این نود یک packet tunnel لایه ۳ است. Socket نمیسازد، line اتصال عادی ایجاد نمیکند و packet را بافر نمیکند. فقط packetهای عبوری از یک chain را بررسی میکند و فیلدهای تعیینشده در headerِ IPv4 را درجا تغییر میدهد.
جایگاه رایج
نمونه chain packet:
TunDevice -> IpOverrider -> RawSocket
TunDevice -> WireGuardDevice -> IpOverrider -> UdpStatelessSocket
هرجا در chain از نوع packet بخواهید داده با source یا destination IP متفاوتی از نود خارج شود، میتوانید از این نود استفاده کنید.
عملکرد
- در upstream، IPv4 source را در صورت وجود rule تغییر میدهد.
- در upstream، IPv4 destination را در صورت وجود rule تغییر میدهد.
- در downstream، IPv4 source را در صورت وجود rule تغییر میدهد.
- در downstream، IPv4 destination را در صورت وجود rule تغییر میدهد.
- یک gate سراسری
only120برای کل عمل بازنویسی نود دارد. - یک gate سراسری
chanceبرای کل عمل بازنویسی نود دارد. - هر rule میتواند یک IPv4 یا آرایهای غیرخالی از IPv4ها داشته باشد.
- پس از بازنویسی IPv4، checksumهای headerِ IPv4 و pseudo-header مربوط به TCP/UDP را بهصورت incremental بهروز میکند.
- داده upstream را به
nextو داده downstream را به نود قبلی میفرستد.
نسخه فعلی میتواند در یک instance برای هر دو جهت و هر دو فیلد rule مستقل داشته
باشد؛ بنابراین در بسیاری از سناریوهایی که قبلاً چند IpOverrider پشت سر هم لازم
بود، حالا یک نود کافی است.
نمونه تنظیم
قالب جدید چند rule:
{
"name": "ip-rewrite",
"type": "IpOverrider",
"settings": {
"up": {
"source-ip": {
"ipv4": "10.0.0.10"
},
"dest-ip": {
"ipv4": "198.51.100.10"
}
},
"down": {
"source-ip": {
"ipv4": "203.0.113.10"
},
"dest-ip": {
"ipv4": "10.0.0.20"
}
}
},
"next": "next-packet-node"
}
نمونه آرایه IPv4:
{
"name": "source-pool",
"type": "IpOverrider",
"settings": {
"up": {
"source-ip": {
"ipv4": ["10.0.0.10", "10.0.0.11", "10.0.0.12"]
}
}
},
"next": "next-packet-node"
}
قالب قدیمی
قالب قدیمی تک-rule هنوز پذیرفته میشود:
{
"name": "ip-rewrite-old",
"type": "IpOverrider",
"settings": {
"direction": "up",
"mode": "dest-ip",
"ipv4": "198.51.100.10"
},
"next": "next-packet-node"
}
فیلدهای لازم
| فیلد | نوع | توضیح |
|---|---|---|
name | string | نام دلخواه و یکتای نود. |
type | string | باید دقیقاً "IpOverrider" باشد. |
settings | object | اجباری است و باید دستکم یک rule بازنویسی داشته باشد. |
next | string | برای عبور عادی داده در upstream لازم است. |
در چیدمان مفید، این نود باید یک packet node قبلی هم داشته باشد.
قالب جدید چند rule
قالب پیشنهادی فعلی از objectهای up و/یا down استفاده میکند:
| مسیر rule | معنی |
|---|---|
settings.up.source-ip | تغییر IPv4 source در مسیر upstream. |
settings.up.dest-ip | تغییر IPv4 destination در مسیر upstream. |
settings.down.source-ip | تغییر IPv4 source در مسیر downstream. |
settings.down.dest-ip | تغییر IPv4 destination در مسیر downstream. |
حداقل یکی از این rule objectها باید وجود داشته باشد. اگر کلید up یا down
وجود داشته باشد، parser قالب جدید را انتخاب میکند و دیگر object را بهعنوان
تنظیمات قدیمی نمیخواند.
هر rule باید ipv4 یا ipv6 داشته باشد.
گزینههای نود
chance و only120 باید مستقیماً در object اصلی settings و کنار up و
down قرار بگیرند:
| فیلد | نوع | پیشفرض | توضیح |
|---|---|---|---|
chance | درصد integer از 0 تا 100 | 100 | احتمال اجرای کل عمل بازنویسی نود روی یک packet واجد شرایط. |
only120 | boolean | false | کل عمل نود را به IPv4 packetهایی با total IP length حداکثر 120 بایت محدود میکند. |
هیچکدام از این گزینهها را داخل source-ip یا dest-ip قرار ندهید. در قالب
جدید، chance و only120 داخل rule پذیرفته نمیشوند و باید به
settings.chance و settings.only120 منتقل شوند.
فیلدهای آدرس هر Rule
| فیلد | نوع | توضیح |
|---|---|---|
ipv4 | string یا آرایه string | آدرس IPv4 جایگزین یا فهرستی غیرخالی از IPv4ها. مقادیر باید آدرس صریح IPv4 باشند، نه CIDR یا hostname. |
ipv6 | string | خوانده و ذخیره میشود، اما بازنویسی IPv6 در runtime فعلی غیرفعال است. |
اگر ipv4 آرایه باشد، هر packetی که rule روی آن اعمال میشود آدرس بعدی آرایه
را بهصورت round-robin میگیرد. Cursor هر rule جداست.
اگر یک rule هم ipv4 و هم ipv6 داشته باشد، ipv4 به کار میرود، زیرا parser
ابتدا آن را بررسی میکند.
قالب قدیمی
در قالب قدیمی یک rule مستقیم داخل settings تعریف میشود:
| فیلد | نوع | توضیح |
|---|---|---|
direction | string | باید "up" یا "down" باشد. |
mode | string | باید "source-ip" یا "dest-ip" باشد. |
ipv4 / ipv6 | string، یا آرایه برای ipv4 | آدرس جایگزین برای rule انتخابشده. |
chance | integer percent | احتمال سراسری packet در سطح نود، با همان بازه 0 تا 100 و پیشفرض قالب جدید. |
only120 | boolean | gate سراسری طول IPv4 packet با پیشفرض false و مرز 120 بایت، مانند قالب جدید. |
برای پیکربندیهای تازه بهتر است از قالب جدید استفاده کنید، زیرا تا چهار rule را
در یک نود پوشش میدهد. در قالب قدیمی، chance و only120 از قبل در ریشه
settings قرار دارند؛ چون این قالب فقط یک rule دارد، رفتار gate مشترک جدید از
نظر نتیجه تفاوت دیگری ایجاد نمیکند.
chance
گزینه chance مشخص میکند کل عمل نود با چه احتمالی اجرا شود. این مقدار برای هر
packet واجد شرایط فقط یک بار ارزیابی میشود، نه جداگانه برای ruleهای source و
destination:
- مقدار
100یعنی عمل نود همیشه اجرا شود. - مقدار
0یعنی packet همیشه بدون تغییر عبور کند. - مقادیر
1تا99درصد احتمال اجرای عمل کامل نود را مشخص میکنند.
در مثال زیر، هر دو بازنویسی source و destination تقریباً روی 25 درصد packetهای upstream با هم اجرا میشوند. در سایر packetها هیچکدام اجرا نمیشوند:
{
"name": "override-with-chance",
"type": "IpOverrider",
"settings": {
"chance": 25,
"up": {
"source-ip": {
"ipv4": "10.0.0.10"
},
"dest-ip": {
"ipv4": "198.51.100.10"
}
}
},
"next": "next-packet-node"
}
only120
گزینه only120 یک gate اندازه برای کل عمل نود است. وقتی true باشد، همه
بازنویسیهای تنظیمشده برای IPv4 packetهایی با total IP length حداکثر 120
بایت با هم اجرا میشوند. packetهای بزرگتر بدون تغییر عبور میکنند.
{
"name": "override-small-packets",
"type": "IpOverrider",
"settings": {
"only120": true,
"up": {
"source-ip": {
"ipv4": "10.0.0.10"
},
"dest-ip": {
"ipv4": "198.51.100.10"
}
}
},
"next": "next-packet-node"
}
ترکیب only120 و chance
نود برای هر packet، gateهای سراسری را پیش از اجرای هر rule ارزیابی میکند:
- وقتی
only120فعال است، IPv4 packet با total IP length بیشتر از120کل عمل نود را رد میکند. - در غیر این صورت،
settings.chanceدقیقاً یک بار ارزیابی میشود. اگر chance رخ ندهد، کل عمل نود رد میشود. - وقتی هر دو gate عبور کنند، همه ruleهای source و destination تنظیمشده برای جهت packet ارزیابی میشوند.
وقتی هرکدام از gateها عمل نود را رد کند، packet بدون تغییر عبور میکند، cursor آرایههای IPv4 جلو نمیرود و این نود درخواست محاسبه دوباره checksum نمیدهد.
رفتار جهتها
upstream payload:
- gateهای سراسری
only120وchanceارزیابی میشوند - اگر هر دو عبور کنند،
up.source-ipوup.dest-ipبررسی میشوند - packet با
tunnelNextUpStreamPayload()بهnextمیرود
downstream payload:
- gateهای سراسری
only120وchanceارزیابی میشوند - اگر هر دو عبور کنند،
down.source-ipوdown.dest-ipبررسی میشوند - packet با
tunnelPrevDownStreamPayload()به نود قبلی برمیگردد
اگر برای یک جهت rule وجود نداشته باشد، packet بدون تغییر عبور میکند.
IpOverrider chain را terminate نمیکند و packet را نگه نمیدارد.
Checksum
پس از بازنویسی آدرس IPv4، IpOverrider checksumِ headerِ IPv4 را بهصورت
incremental و درجا بهروز میکند. برای packetهای TCP و packetهای UDP با checksum
فعال نیز delta مربوط به pseudo-headerِ IPv4 را اعمال میکند. checksum صفر
(غیرفعال) UDP صفر باقی میماند. این نود برای بازنویسی خودش درخواست محاسبه کامل
checksum نمیدهد و هر درخواست محاسبه دوبارهای را که از قبل وجود داشته حفظ
میکند.
Packet Line
IpOverrider یک packet tunnel خالص است:
- برای هر packet چرخه عمر اتصال جداگانه ندارد.
- line نمیسازد و آزاد نمیکند.
- callbackهای payload مسیر اصلی runtime هستند.
- callbackهای stream-style مثل
Finish،Pause،ResumeوEstبرای استفاده عادی معتبر نیستند
پیادهسازی برای packet lineها state جداگانهای تخصیص نمیدهد.
محدودیتها و Padding
| مقدار | اندازه |
|---|---|
required_padding_left | 0 bytes |
بازه chance | 0 تا 100 |
شرط only120 | IPv4 total length برابر یا کمتر از 120 بایت |
این نود فقط فیلدهای موجود در header را درجا بازنویسی میکند و به left padding نیاز ندارد.
نکتهها
- runtime فعلی فقط headerِ IPv4 را بازنویسی میکند.
- IPv6 از پیکربندی خوانده و ذخیره میشود، اما بخش مربوط به بازنویسی آن در کد فعلاً غیرفعال است.
- مقادیر
ipv4باید آدرس صریح IPv4 باشند. CIDR و hostname پذیرفته نمیشوند. - برای source IP spoofing واقعی باید شبکه و دیتاسنتر اجازه خروج packet با source غیرمحلی را بدهند؛ بسیاری از providerها چنین ترافیکی را دور میاندازند.
IpOverriderتنها آدرس IP را تغییر میدهد و port مربوط به TCP/UDP را بازنویسی نمیکند.