Skip to content

Freedom — Xray-core ​

Freedom خروجی دورزن Xray است — ترافیک را بدون هیچ پروتکل پراکسی واسطه‌ای به مقصد واقعی ارسال می‌کند. همچنین دو ویژگی ضد-DPI را حمل می‌کند: قطعه‌بندی TCP/TLS و تزریق دلخواه بستهٔ نویز.

خروجی ​

settings برای یک خروجی با "protocol": "freedom":

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
targetStrategystringasisasis | useip | useipv4 | useipv6 | useipv4v6 | useipv6v4 | forceip | forceipv4 | forceipv6 | forceipv4v6 | forceipv6v4منسوخ — هنگام راه‌اندازی، مقدار غیر از asis همراه با هشدار به streamSettings.sockopt.domainStrategy (با همان مقادیر) منتقل می‌شود؛ به‌جای آن همان را تنظیم کنید. نحوهٔ تفکیک آدرس مقصد پیش از برقراری اتصال. asis هرچه موتور مسیریابی تحویل داده باشد بدون تغییر عبور می‌دهد؛ useip* فقط در صورت نیاز به IP تفکیک می‌کند؛ forceip* همیشه تفکیک و جایگزین می‌کند. پسوندهای *v4v6 / *v6v4 کنترل می‌کنند کدام خانواده اول امتحان شود.
domainStrategystring(inherits targetStrategy)<same values>نام مستعار قدیمی برای targetStrategy. تنها وقتی targetStrategy خالی است خوانده می‌شود. همراه با targetStrategy منسوخ شده است.
redirectstring(unset)<host:port>بازنویسی مقصد هر اتصال. برای ارسال به یک سرویس محلی صرف نظر از مسیریابی سودمند است.
userLeveluint320<uint32>سطح policy پیش‌فرض برای اتصال‌های عبوری از این خروجی.
fragment*Fragment(disabled)Fragmentقطعه‌بندی TCP در سطح سگمنت برای دور زدن DPI مبتنی بر طول.
noise*Noise(unsupported)(use noises)پشتیبانی نمی‌شود — از آرایهٔ noises استفاده کنید. تنظیم noise در ساخت پیکربندی خطای صریح ایجاد می‌کند.
noises[]*Noise(unset)[Noise]فهرست بسته‌های نویز که پیش از (یا بین) بسته‌های واقعی ارسال می‌شوند تا تطبیق الگو را گمراه کنند.
proxyProtocoluint3200 | 1 | 2افزودن یک سرآیند PROXY-protocol به اتصال‌های خروجی. 0 غیرفعال می‌کند؛ 1 / 2 به‌ترتیب v1 (متنی) یا v2 (دودویی) را تنظیم می‌کنند.
ipsBlocked*StringList(ignored)(use finalRules)پشتیبانی نمی‌شود — مسدودسازی IP را با finalRules بیان کنید؛ تنظیم آن فقط یک هشدار ثبت می‌کند و هیچ اثری ندارد.
finalRules[]*FreedomFinalRuleConfig(unset)[FreedomFinalRuleConfig]قواعد اجازه/مسدودسازی به ازای هر اتصال که در زمان برقراری اتصال ارزیابی می‌شوند — یک دیوارهٔ آتش سبک روی خود خروجی، که بر اساس شبکه / پورت / IP تطبیق می‌یابد. وقتی streamSettings.sockopt.dialerProxy تنظیم شده باشد نادیده گرفته می‌شود (همراه با هشدار).

منبع: infra/conf/freedom.go:19-30 · ثابت‌شده در v26.9.9 (52a412d)

fragment ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
packetsstring(all)tlshello | <from-to> | کدام بسته‌ها قطعه‌بندی شوند. tlshello فقط TLS ClientHello را قطعه‌بندی می‌کند (ظریف‌تر، برای ابهام‌سازی SNI سودمند). یک بازه مانند "1-3" بسته‌های آن بازهٔ آفست را قطعه‌بندی می‌کند. خالی هر بسته را قطعه‌بندی می‌کند — تهاجمی‌ترین حالت.
length*Int32Range(required){from, to}بازهٔ بایت‌ها به ازای هر قطعه. حداقل باید > 0 باشد.
interval*Int32Range(required){from, to}بازهٔ میلی‌ثانیه‌های تأخیر بین قطعه‌ها.
maxSplit*Int32Range(unbounded){from, to}بازهٔ کل تقسیم‌ها به ازای هر بسته. سقف اختیاری.

منبع: infra/conf/freedom.go:32-37 · ثابت‌شده در v26.9.9 (52a412d)

noises[] ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
typestring(required)rand | str | hex | base64شکل بار بستهٔ نویز. rand بایت‌های تصادفی تولید می‌کند که طول آن از packet (یک رشتهٔ بازه) می‌آید. str/hex/base64 مقدار packet را تحت‌اللفظی تفسیر می‌کنند.
packetstring(required)<bytes or range>محتوای بار. قالب به type بستگی دارد.
delay*Int32Range(unset){from, to}بازهٔ میلی‌ثانیه‌های صبر پیش از ارسال این بستهٔ نویز.
applyTostringipip | all | ipv4 | ipv6محدود کردن تزریق نویز به یک خانوادهٔ IP. ip و all به هر دو اعمال می‌شوند.

منبع: infra/conf/freedom.go:39-44 · ثابت‌شده در v26.9.9 (52a412d)

finalRules[] ​

یک دیوارهٔ آتش کوچک اجازه/مسدودسازی که خروجی freedom هنگام برقراری اتصال خروجی اعمال می‌کند. قواعد به ترتیب ارزیابی می‌شوند؛ اولین تطبیق تصمیم می‌گیرد. مسدودسازی IP اینجا تعریف می‌شود — فیلد ipsBlocked نادیده گرفته می‌شود.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
actionstring(required)allow | blockبا یک اتصال تطبیق‌یافته چه کنیم. block آن را رد می‌کند؛ allow آن را عبور می‌دهد — قواعد allow را اول فهرست کنید تا استثناهایی را از یک block گسترده‌تر جدا کنید.
network*NetworkList(any)tcp | udp | tcp,udpفقط با این شبکه‌ها تطبیق بده.
port*PortList(any)<port / range list>فقط با این پورت‌های مقصد تطبیق بده.
ip*StringList(any)<IP / CIDR / geoip:>فقط با این IPهای مقصد تطبیق بده. دسته‌های geoip: را می‌پذیرد.
blockDelay*Int32Range(immediate){from, to}برای یک اقدام block، پیش از اسقاط اتصال یک تأخیر تصادفی در این بازهٔ میلی‌ثانیه‌ای صبر کن — به‌جای شکست سریع یک کاوشگر را معطل می‌کند.

منبع: infra/conf/freedom.go:46-52 · ثابت‌شده در v26.9.9 (52a412d)

مثال‌ها ​

خروجی Freedom ساده (عبوری):

json
{
  "outbounds": [
    { "tag": "direct", "protocol": "freedom", "settings": {} }
  ]
}

اجبار تفکیک IPv4-سپس-IPv6:

json
{
  "outbounds": [
    {
      "tag": "direct-v4",
      "protocol": "freedom",
      "settings": {},
      "streamSettings": { "sockopt": { "domainStrategy": "forceipv4v6" } }
    }
  ]
}

قطعه‌بندی TLS-hello (تلاش اول خوب برای ابهام‌سازی SNI):

json
{
  "outbounds": [
    {
      "tag": "frag",
      "protocol": "freedom",
      "settings": {
        "fragment": {
          "packets": "tlshello",
          "length":   { "from": 10, "to": 20 },
          "interval": { "from": 10, "to": 20 }
        }
      }
    }
  ]
}

تزریق نویز (4 بایت تصادفی پیش از هر اتصال IPv4، با تأخیر 0-1 میلی‌ثانیه):

json
{
  "outbounds": [
    {
      "tag": "noisy",
      "protocol": "freedom",
      "settings": {
        "noises": [
          {
            "type": "rand",
            "packet": "4-4",
            "delay": { "from": 0, "to": 1 },
            "applyTo": "ipv4"
          }
        ]
      }
    }
  ]
}

QUIC (UDP/443) را به‌کلی مسدود کن و اتصال‌ها به بازه‌های خصوصی را معطل کن تا کاوش را کند کنی:

json
{
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "finalRules": [
          { "action": "block", "network": "udp", "port": "443" },
          { "action": "block", "ip": ["geoip:private"], "blockDelay": { "from": 1000, "to": 3000 } }
        ]
      }
    }
  ]
}

ارسال همه چیز به یک سرویس محلی (کمک‌کار آزمون):

json
{
  "outbounds": [
    {
      "tag": "redir",
      "protocol": "freedom",
      "settings": { "redirect": "127.0.0.1:8080" }
    }
  ]
}

نکات ​

  • targetStrategy / domainStrategy در settings خروجی freedom منسوخ هستند. هنگام راه‌اندازی، Xray مقدار غیر از asis را به streamSettings.sockopt.domainStrategy منتقل می‌کند و هشداری ثبت می‌کند؛ targetStrategy سطح خروجی روی یک خروجی freedom نیز به همین شکل منتقل می‌شود (infra/conf/xray.go:341-364). مقدار منتقل‌شده sockopt.domainStrategyای را که خودتان تنظیم کرده باشید بازنویسی می‌کند، پس فقط یکی از آن‌ها را پیکربندی کنید. domainStrategy همچنان فقط به‌عنوان جایگزین وقتی targetStrategy خالی است خوانده می‌شود (infra/conf/freedom.go:46-48).
  • با finalRules و مقصد دامنه‌ای، freedom ابتدا دامنه را تفکیک می‌کند (با sockopt.domainStrategy، یا حل‌کنندهٔ سیستم وقتی آن AsIs است) تا قواعد block را بررسی کند، سپس آدرسی را که واقعاً به آن متصل شده دوباره بررسی می‌کند.
  • وقتی streamSettings.sockopt.dialerProxy تنظیم شده باشد، freedom آخرین گام نیست: finalRules نادیده گرفته می‌شوند (هشداری ثبت می‌شود) و دامنه از پیش تفکیک نمی‌شود.
  • freedom هنگام راه‌اندازی streamSettings.sockopt.addressPortStrategy را رد می‌کند.
  • رشته‌های استراتژی ناشناخته به‌جای جایگزین بی‌صدا خطای راه‌اندازی تولید می‌کنند (infra/conf/freedom.go:72-73).
  • noise (مفرد) پشتیبانی نمی‌شود: تنظیم آن در راه‌اندازی با پیامی که به noises = [ { ... } ] اشاره می‌کند شکست می‌خورد (infra/conf/freedom.go:145-147).
  • ipsBlocked پشتیبانی نمی‌شود — آن را به‌صورت قاعدهٔ { "action": "block", "ip": [...] } در finalRules بیان کنید؛ خود این فیلد فقط یک هشدار ثبت می‌کند و در غیر این صورت نادیده گرفته می‌شود.
  • اقدامات finalRules فقط allow / block هستند (اقدامات ناشناخته در راه‌اندازی خطا می‌دهند). ip دسته‌های geoip: را می‌پذیرد؛ blockDelay صرفاً به قواعد block اعمال می‌شود.
  • fragment.packets: "tlshello" نقطهٔ شروع توصیه‌شده است — قطعه‌بندی فقط TLS ClientHello مانع DPI مبتنی بر SNI می‌شود اما بقیهٔ اتصال را دست‌نخورده می‌گذارد (سربار بایتی فقط یک‌باره است).
  • fragment.length.from و fragment.interval وقتی fragment حضور دارد الزامی هستند (infra/conf/freedom.go:102-118). بازهٔ maxSplit اختیاری است.
  • proxyProtocol خارج از 1..2 بی‌صدا نادیده گرفته می‌شود — فقط آن دو مقدار خروجی سرآیند تولید می‌کنند (infra/conf/freedom.go:162-164).

نکات بین‌هسته‌ای ​

  • sing-box این را Direct می‌نامد و خروجی تقریباً هیچ گزینهٔ مخصوص خود ندارد — فیلدی برای بازنویسی مقصد ندارد؛ برای آن رفتار از اقدامات route استفاده کنید. به Direct — sing-box مراجعه کنید.
  • mihomo نوع Direct به‌طور مشابهی حداقلی دارد؛ پراکسی توکار DIRECT در هر پیکربندی به‌صورت ضمنی وجود دارد. به Direct — mihomo مراجعه کنید.

منبع: infra/conf/freedom.go:19-52 · v26.9.9 (52a412d)

Core Tutorial اثر Argsment