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

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"
}

فیلدهای لازم

فیلدنوعتوضیح
namestringنام دلخواه و یکتای نود.
typestringباید دقیقاً "IpOverrider" باشد.
settingsobjectاجباری است و باید دست‌کم یک rule بازنویسی داشته باشد.
nextstringبرای عبور عادی داده در 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 تا 100100احتمال اجرای کل عمل بازنویسی نود روی یک packet واجد شرایط.
only120booleanfalseکل عمل نود را به IPv4 packetهایی با total IP length حداکثر 120 بایت محدود می‌کند.

هیچ‌کدام از این گزینه‌ها را داخل source-ip یا dest-ip قرار ندهید. در قالب جدید، chance و only120 داخل rule پذیرفته نمی‌شوند و باید به settings.chance و settings.only120 منتقل شوند.

فیلدهای آدرس هر Rule

فیلدنوعتوضیح
ipv4string یا آرایه stringآدرس IPv4 جایگزین یا فهرستی غیرخالی از IPv4ها. مقادیر باید آدرس صریح IPv4 باشند، نه CIDR یا hostname.
ipv6stringخوانده و ذخیره می‌شود، اما بازنویسی IPv6 در runtime فعلی غیرفعال است.

اگر ipv4 آرایه باشد، هر packetی که rule روی آن اعمال می‌شود آدرس بعدی آرایه را به‌صورت round-robin می‌گیرد. Cursor هر rule جداست.

اگر یک rule هم ipv4 و هم ipv6 داشته باشد، ipv4 به کار می‌رود، زیرا parser ابتدا آن را بررسی می‌کند.

قالب قدیمی

در قالب قدیمی یک rule مستقیم داخل settings تعریف می‌شود:

فیلدنوعتوضیح
directionstringباید "up" یا "down" باشد.
modestringباید "source-ip" یا "dest-ip" باشد.
ipv4 / ipv6string، یا آرایه برای ipv4آدرس جایگزین برای rule انتخاب‌شده.
chanceinteger percentاحتمال سراسری packet در سطح نود، با همان بازه 0 تا 100 و پیش‌فرض قالب جدید.
only120booleangate سراسری طول 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:

  1. gateهای سراسری only120 و chance ارزیابی می‌شوند
  2. اگر هر دو عبور کنند، up.source-ip و up.dest-ip بررسی می‌شوند
  3. packet با tunnelNextUpStreamPayload() به next می‌رود

downstream payload:

  1. gateهای سراسری only120 و chance ارزیابی می‌شوند
  2. اگر هر دو عبور کنند، down.source-ip و down.dest-ip بررسی می‌شوند
  3. 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_left0 bytes
بازه chance0 تا 100
شرط only120IPv4 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 را بازنویسی نمی‌کند.