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

IpOverrider

IpOverrider آدرس‌های source و destination را در payloadِ خام packet بازنویسی می‌کند.

این node یک packet tunnel لایه ۳ است. socket نمی‌سازد، line اتصال عادی ایجاد نمی‌کند و packet را buffer نمی‌کند. فقط packet‌های عبوری از یک chain را بررسی می‌کند و فیلدهای تعیین‌شده در headerِ IPv4 را درجا تغییر می‌دهد.

جایگاه رایج​

نمونه chain packet:

TunDevice -> IpOverrider -> RawSocket
TunDevice -> WireGuardDevice -> IpOverrider -> UdpStatelessSocket

هرجا در chain از نوع packet بخواهید داده با source یا destination IP متفاوتی از node خارج شود، می‌توانید از این node استفاده کنید.

عملکرد​

  • در upstream، IPv4 source را در صورت وجود rule تغییر می‌دهد.
  • در upstream، IPv4 destination را در صورت وجود rule تغییر می‌دهد.
  • در downstream، IPv4 source را در صورت وجود rule تغییر می‌دهد.
  • در downstream، IPv4 destination را در صورت وجود rule تغییر می‌دهد.
  • یک gate سراسری only120 برای کل عمل بازنویسی node دارد.
  • یک gate سراسری chance برای کل عمل بازنویسی node دارد.
  • هر rule می‌تواند یک IPv4 یا آرایه‌ای غیرخالی از IPv4‌ها داشته باشد.
  • پس از بازنویسی IPv4، checksum‌های headerِ IPv4 و pseudo-header مربوط به TCP/UDP را به‌صورت incremental به‌روز می‌کند.
  • داده upstream را به next و داده downstream را به node قبلی می‌فرستد.

نسخه فعلی می‌تواند در یک instance برای هر دو جهت و هر دو فیلد rule مستقل داشته باشد؛ بنابراین در بسیاری از سناریوهایی که قبلاً چند IpOverrider پشت سر هم لازم بود، حالا یک node کافی است.

نمونه تنظیم​

قالب جدید چند 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نام دلخواه و یکتای node.
typestringباید دقیقاً "IpOverrider" باشد.
settingsobjectاجباری است و باید دست‌کم یک rule بازنویسی داشته باشد.
nextstringبرای عبور عادی داده در upstream لازم است.

در چیدمان مفید، این node باید یک 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احتمال اجرای کل عمل بازنویسی node روی یک packet واجد شرایط.
only120booleanfalseکل عمل node را به 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 خوانده و ذخیره می‌شود، اما بازنویسی IPv6 در runtime فعلی غیرفعال است. رشته خالی، آدرس IPv4، نام میزبان و قالب CIDR پذیرفته نمی‌شوند.

اگر 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 در سطح node، با همان بازه 0 تا 100 و پیش‌فرض قالب جدید.
only120booleangate سراسری طول IPv4 packet با پیش‌فرض false و مرز 120 بایت، مانند قالب جدید.

برای config‌های تازه بهتر است از قالب جدید استفاده کنید، زیرا تا چهار rule را در یک node پوشش می‌دهد. در قالب قدیمی، chance و only120 از قبل در ریشه settings قرار دارند؛ چون این قالب فقط یک rule دارد، رفتار gate مشترک جدید از نظر نتیجه تفاوت دیگری ایجاد نمی‌کند.

chance​

گزینه chance مشخص می‌کند کل عمل node با چه احتمالی اجرا شود. این مقدار برای هر packet واجد شرایط فقط یک بار ارزیابی می‌شود، نه جداگانه برای rule‌های source و destination:

  • مقدار 100 یعنی عمل node همیشه اجرا شود.
  • مقدار 0 یعنی packet همیشه بدون تغییر عبور کند.
  • مقادیر 1 تا 99 درصد احتمال اجرای عمل کامل node را مشخص می‌کنند.

هر worker و جهت یک gate درصدی شبه‌تصادفی غیررمزنگاری مستقل دارد. نتیجه‌ها می‌توانند پشت سر هم رخ دهند و در طول زمان به درصد تنظیم‌شده نزدیک می‌شوند، نه اینکه از یک الگوی ثابت «هر N packet» پیروی کنند.

در مثال زیر، هر دو بازنویسی 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 اندازه برای کل عمل node است. وقتی 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​

node برای هر packet، gate‌های سراسری را پیش از اجرای هر rule ارزیابی می‌کند:

  • وقتی only120 فعال است، IPv4 packet با total IP length بیشتر از 120 کل عمل node را رد می‌کند.
  • در غیر این صورت، settings.chance دقیقاً یک بار ارزیابی می‌شود. اگر chance رخ ندهد، کل عمل node رد می‌شود.
  • وقتی هر دو gate عبور کنند، همه rule‌های source و destination تنظیم‌شده برای جهت packet ارزیابی می‌شوند.

وقتی هرکدام از gate‌ها عمل node را رد کند، packet بدون تغییر عبور می‌کند، cursor آرایه‌های IPv4 جلو نمی‌رود و این node درخواست محاسبه دوباره 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() به node قبلی برمی‌گردد

اگر برای یک جهت rule وجود نداشته باشد، packet بدون تغییر عبور می‌کند. IpOverrider chain را terminate نمی‌کند و packet را نگه نمی‌دارد.

Checksum​

پس از بازنویسی آدرس IPv4، IpOverrider checksumِ headerِ IPv4 را به‌صورت incremental و درجا به‌روز می‌کند. برای packet‌های TCP و packet‌های UDP با checksum فعال نیز delta مربوط به pseudo-headerِ IPv4 را اعمال می‌کند. checksum صفر (غیرفعال) UDP صفر باقی می‌ماند. این node برای بازنویسی خودش درخواست محاسبه کامل 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 بایت

این node فقط فیلدهای موجود در header را درجا بازنویسی می‌کند و به left padding نیاز ندارد.

نکته‌ها​

  • runtime فعلی فقط headerِ IPv4 را بازنویسی می‌کند.
  • IPv6 از config خوانده و ذخیره می‌شود، اما بخش مربوط به بازنویسی آن در کد فعلاً غیرفعال است.
  • مقادیر ipv4 باید آدرس صریح IPv4 باشند. CIDR و hostname پذیرفته نمی‌شوند.
  • برای source IP spoofing واقعی باید شبکه و دیتاسنتر اجازه خروج packet با source غیرمحلی را بدهند؛ بسیاری از providerها چنین ترافیکی را دور می‌اندازند.
  • IpOverrider تنها آدرس IP را تغییر می‌دهد و port مربوط به TCP/UDP را بازنویسی نمی‌کند.

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

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

ویژگیمقدار
node flagskNodeFlagNone
can_have_prevtrue
can_have_nexttrue
layer_groupkNodeLayer3
layer_group_prev_nodekNodeLayerAnything
layer_group_next_nodekNodeLayerAnything
required_padding_left0 bytes