Files
thefeed/README-FA.md
T

25 KiB
Raw Blame History

🌍 thefeed

خواندن کانال‌های تلگرام و حساب‌های عمومی X از طریق DNS — برای اینترنت سانسورشده

English | فارسی


thefeed چیست؟

thefeed یک سیستم تونل DNS است که به شما اجازه می‌دهد پیام‌های کانال‌های تلگرام را حتی وقتی تلگرام و اینترنت فیلتر شده، بخوانید. تنها چیزی که نیاز دارید DNS است — که تقریباً هیچ‌وقت مسدود نمی‌شود.

                                  Encrypted DNS TXT
   ┌──────────────┐  feed meta + small media   ┌──────────────────┐    MTProto      ┌──────────┐
   │              │ ─────────────────────────▸ │      Server      │ ─────────────▸  │ Telegram │
   │    Client    │ ◂───────────────────────── │  (DNS auth +     │ ◂─────────────  │   API    │
   │  (Web UI)    │                            │   media relays)  │    RSS / HTTP   ┌──────────┐
   │              │  large media (fast relay)  │                  │ ─────────────▸  │  Nitter  │
   │              │ ◂───── api.github.com ◂──  │                  │ ◂─────────────  │ (X feed) │
   └──────────────┘     (uploaded by server)   └──────────────────┘                 └──────────┘

ویژگی‌ها

سمت سرور (خارج از ایران)

  • اتصال به تلگرام و خواندن پیام‌ کانال‌ها
  • دریافت پست‌های عمومی X از حساب‌های تنظیم‌شده (بدون لاگین)
  • سرو متادیتا و فایل‌های کوچک به صورت پاسخ DNS TXT رمزنگاری‌شده
  • رله‌های مدیا — یک فایل، چند مسیر تحویل:
    • رله DNS (کند، مقاوم به سانسور) فایل را به بلاک‌های DNS تقسیم می‌کند
    • رله گیتهاب (سریع، پیش‌فرض خاموش) بایت‌ها را روی یک ریپازیتوری گیتهاب می‌گذارد و کلاینت با HTTPS ساده می‌گیرد؛ مناسب فایل‌های بزرگ‌تر از سقف DNS
    • رله‌های آینده در کنار همین‌ها اضافه می‌شوند بدون اینکه کلاینت‌های قدیمی را خراب کنند
  • padding تصادفی برای جلوگیری از شناسایی DPI
  • ذخیره‌سازی session — یک‌بار لاگین، همیشه اجرا
  • پشتیبانی از حالت بدون تلگرام (--no-telegram) — خواندن کانال‌های عمومی بدون نیاز به ورود به تلگرام

سمت کلاینت (داخل ایران)

  • رابط کاربری وب با پشتیبانی RTL/فارسی (فونت وزیرمتن)
  • ارسال پیام به کانال‌ها و چت‌های خصوصی (نیاز به --allow-manage سمت سرور و ورود به تلگرام)
  • مدیریت کانال‌ها از راه دور ( افزودن/حذف کانال‌ها از طریق دستورات ادمین وقتی --allow-manage فعال است)
  • دانلود مدیا با رله‌ها — اگر فایل روی رله سریع (گیتهاب) موجود باشد، اول از همان مسیر تلاش می‌کند، در صورت خطا چند بار retry می‌کند و قبل از سوییچ به رله DNS از کاربر می‌پرسد. هش و سایز هر فایل دانلود‌شده حتماً اعتبارسنجی می‌شود
  • به‌روزرسانی خودکار هر کانال: کانال‌های دلخواه را پین کنید تا در پس‌زمینه به‌طور دوره‌ای رفرش شوند (به ازای هر پروفایل ذخیره می‌شود)
  • فشرده‌سازی پیام‌ها (deflate)
  • محافظت رابط وب با رمز عبور (--password سمت کلاینت)
  • لاگ زنده درخواست‌های DNS در مرورگر
  • جستجوی پیام‌ها: جستجو در پیام‌های کانال فعلی با هایلایت نتایج و ناوبری قبلی/بعدی
  • خروجی پیام‌ها: کپی N پیام آخر یک کانال به کلیپبورد
  • بانک ریزالور: مدیریت مشترک ریزالورها برای تمام پروفایل‌ها — بدون نیاز به تنظیم ریزالور جداگانه برای هر پروفایل. ریزالورها از طریق اسکنر، ایمپورت، یا ورود دستی اضافه می‌شوند و به صورت خودکار امتیازدهی می‌شوند
  • پاکسازی ریزالور: حذف ریزالورهای ضعیف از بانک بر اساس حداقل امتیاز دلخواه
  • نمایش ریزالورهای فعال: مشاهده لیست ریزالورهای سالم و فعال از تنظیمات
  • تصویر پس‌زمینه: تنظیم URL تصویر پس‌زمینه برای پنل پیام‌ها (ذخیره محلی)
  • تایم‌اوت DNS: تنظیم تایم‌اوت کوئری DNS برای هر پروفایل (پیش‌فرض ۱۵ ثانیه)
  • اسکنر ریزالور: اسکن بازه‌های IP و CIDR برای پیدا کردن سرورهای DNS کارآمد

اسکنر ریزالور

رابط وب شامل یک اسکنر ریزالور داخلی است (آیکون 🔍 در نوار کناری) که بازه‌های IP را بررسی می‌کند تا سرورهای DNS قابل دسترسی به سرور thefeed شما را پیدا کند:

  • اهداف متنوع: آی‌پی‌های تکی، CIDR (مثل 5.1.0.0/16)، یا نام دامنه — هر خط یکی
  • بارگذاری CIDR ایران: دکمه یک‌کلیکی برای بارگذاری لیست بازه‌های ISP ایران
  • پاک کردن اهداف: دکمه برای پاک کردن سریع لیست CIDR/IP اسکنر
  • انتخاب پروفایل: انتخاب کنید کدام پروفایل برای تست استفاده شود
  • قابل تنظیم: همزمانی (پیش‌فرض ۵۰)، تایم‌اوت (پیش‌فرض ۱۵ ثانیه)، حداکثر آی‌پی
  • گسترش /24: وقتی ریزالور کارآمد پیدا شد، آی‌پی‌های نزدیک در همان /24 هم بررسی می‌شوند
  • مکث / ادامه / توقف: کنترل کامل روی اسکن‌های طولانی (مکث واقعاً ارسال درخواست‌های جدید را متوقف می‌کند)
  • زمان پاسخ: نتایج بر اساس تأخیر مرتب شده‌اند تا سریع‌ترین‌ها اول نمایش داده شوند
  • انتخاب نتایج: چک‌باکس برای انتخاب ریزالورهای مورد نظر
  • اعمال نتایج: افزودن یا جایگزینی بانک ریزالور مستقیم از اسکنر
  • کپی: دکمه کپی برای هر آی‌پی، کپی انتخاب‌شده‌ها، یا کپی همه
  • اسکن جدید: بازنشانی رابط کاربری برای شروع اسکن جدید پس از اتمام
  • لاگ دیباگ: در حالت دیباگ، کوئری‌ها و پاسخ‌های هر probe ثبت می‌شوند

ضد DPI

  • اندازه متغیر پاسخ: Padding تصادفی (۰-۳۲ بایت)
  • کوئری تک‌برچسب: رمزنگاری Base32 در یک برچسب DNS
  • شافل Resolver: توزیع تصادفی کوئری‌ها بین resolverها
  • بانک ریزالور: مخزن مشترک ریزالورها با امتیازدهی دائمی و ابزار پاکسازی
  • محدودیت نرخ: قابل تنظیم برای ترکیب با ترافیک عادی DNS
  • Padding تصادفی کوئری: ۴ بایت تصادفی در هر درخواست
  • اندازه بلاک متغیر: بلاک‌های ۴۰۰-۷۰۰ بایت

🔐 رمزنگاری و احراز هویت

مدل دو بخشی

بخش ۱ — رمز عبور رمزنگاری (--key): روی سرور و کلاینت هر دو لازم است. هر کسی با این رمز می‌تواند همه پیام‌ها (از جمله کانال‌های خصوصی) را بخواند. می‌توانید آن را با دوستان مورد اعتماد به اشتراک بگذارید.

بخش ۲ — مدیریت از راه دور (--allow-manage سمت سرور): وقتی فعال باشد، هر کسی با کلید رمزنگاری می‌تواند پیام ارسال کند و کانال‌ها را مدیریت کند. به صورت پیش‌فرض غیرفعال است.

رمز عبور وب کلاینت (--password): تمام صفحات رابط وب را با HTTP Basic Auth محافظت می‌کند. این فقط محافظت محلی است.

ویژگی‌های امنیتی

  • AES-256-GCM برای تمام پاسخ‌ها و پیام‌های ارسالی
  • کلیدهای مجزا از طریق HKDF برای کوئری و پاسخ
  • Padding تصادفی در هر دو جهت
  • بدون state — هر درخواست مستقل است
  • بررسی رمز عبور ادمین سمت سرور با مقایسه زمان‌ثابت
  • فایل session با مجوز ۰۶۰۰

⚠️ هرگز رمز عبور رمزنگاری (passphrase) خود را عمومی به اشتراک نگذارید — هر کسی با آن می‌تواند کلاینت خودش را اجرا و تمام پیام‌های شما را بخواند. --password سمت کلاینت فقط رابط وب روی دستگاه خودتان را محافظت می‌کند.

دانلود

رلیز ها

حمایت مالی

برای حمایت از من می‌تونید مبلغ دلخواه‌تون رو به صورت USDT یا USDC روی شبکه‌های زیر ارسال کنید:

  • Polygon
  • BNB Chain

آدرس ولت من: 0xe73f022f668c57cce79feccd875ac7332311013a

ممنون از حمایت‌تون ❤️

لینک ها

  • کانال تلگرام من: @networkti
  • کانال کانفیگ عمومی دفید: @thefeedconfig
  • راهنمای نصب سرور دفید: @networkti
  • راهنمای نصب سرور دفید با اسلیپ گیت: @networkti

نصب سریع سرور

sudo bash -c "$(curl -Ls https://raw.githubusercontent.com/sartoopjj/thefeed/main/scripts/install.sh)"

اسکریپت:

  1. آخرین باینری را از GitHub دانلود می‌کند
  2. دامنه، رمز عبور، کانال‌های تلگرام و حساب‌های X را می‌پرسد
  3. به تلگرام لاگین می‌کند (یک‌بار)
  4. سرویس systemd را راه‌اندازی می‌کند
# بروزرسانی
sudo bash install.sh

# لاگین مجدد تلگرام
sudo bash install.sh --login

# حذف
sudo bash install.sh --uninstall

توجه: سرور باید روی پورت ۵۳ پاسخ بدهد. بهتر است روی پورت غیرمحدود (:5300) اجرا و با iptables فوروارد کنید:

نام اینترفیس شبکه خود را با ip a پیدا کنید و eth0 را جایگزین کنید:

sudo iptables -I INPUT -p udp --dport 5300 -j ACCEPT
sudo iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j REDIRECT --to-ports 5300
sudo ip6tables -I INPUT -p udp --dport 5300 -j ACCEPT
sudo ip6tables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j REDIRECT --to-ports 5300

برای ماندگار کردن این قوانین بعد از ریبوت:

sudo apt install iptables-persistent   # Debian/Ubuntu
sudo netfilter-persistent save

اگر مشکلی پیش آمد — حذف فوری redirect:

# حذف قانون iptables (بازگشت به حالت اولیه)
sudo iptables -t nat -D PREROUTING -i eth0 -p udp --dport 53 -j REDIRECT --to-ports 5300
sudo iptables -D INPUT -p udp --dport 5300 -j ACCEPT
sudo netfilter-persistent save

🐳 نصب با Docker (سرور)

اجرای سرور با Docker — بدون نیاز به نصب Go.

شروع سریع (کانال‌های عمومی، بدون لاگین تلگرام)

# ۱. تنظیم محیط
cp .env.example .env
nano .env   # مقادیر THEFEED_DOMAIN و THEFEED_KEY را وارد کنید

# ۲. آماده‌سازی دایرکتوری داده
mkdir -p data
cp configs/channels.txt data/
cp configs/x_accounts.txt data/   # اختیاری

# ۳. ساخت و اجرا
docker compose up -d

# ۴. هدایت ترافیک DNS خارجی به کانتینر
#    نام اینترفیس شبکه خود را با ip a پیدا کنید و eth0 را جایگزین کنید
sudo iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j REDIRECT --to-ports 5300
sudo iptables -I INPUT -p udp --dport 5300 -j ACCEPT
sudo ip6tables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j REDIRECT --to-ports 5300
sudo ip6tables -I INPUT -p udp --dport 5300 -j ACCEPT

# ماندگار کردن قوانین iptables بعد از ریبوت
sudo apt install -y iptables-persistent
sudo netfilter-persistent save

# ۵. مشاهده لاگ‌ها
docker compose logs -f

توجه: کانتینر روی پورت 5300 listen می‌کند (نه 53) تا با systemd-resolved تداخل نداشته باشد. قانون iptables PREROUTING فقط ترافیک DNS خارجی (پورت 53) را به کانتینر هدایت می‌کند و DNS محلی سرور بدون مشکل کار می‌کند.

با تلگرام (لاگین یکباره)

# ۱. تنظیم محیط (متغیرهای تلگرام را در .env از حالت کامنت خارج کنید)
cp .env.example .env
nano .env

# ۲. لاگین یکباره (تعاملی — کد تأیید را وارد کنید)
docker compose run -it --rm server \
  --login-only --data-dir /data \
  --domain YOUR_DOMAIN --key YOUR_KEY \
  --api-id YOUR_API_ID --api-hash YOUR_HASH \
  --phone YOUR_PHONE

# ۳. در docker-compose.yml فلگ --no-telegram را حذف و فلگ‌های تلگرام را اضافه کنید
# ۴. اجرای سرور
docker compose up -d
# ۵. تنظیم iptables redirect (مشابه قدم ۴ در شروع سریع)

جزئیات Docker

مورد مقدار
ایمیج پایه alpine:3.21 (حدود ۲۳ مگابایت)
ساخت دو مرحله‌ای (golang:1.26-alpinealpine)
کاربر thefeed (UID 1000، غیر root)
پورت کانتینر :5300/udp (هاست :5300/udp + iptables redirect از :53)
داده ولوم ./data (کانال‌ها، session، کش)
تنظیمات فایل .env (در git ذخیره نمی‌شود)
# ساخت مجدد بعد از تغییرات کد
docker compose build

# توقف
docker compose down

ایمنی پورت ۵۳ و سرویس‌ها

کانتینر روی پورت 5300 (نه 53) listen می‌کند تا با systemd-resolved یا سرویس‌های DNS دیگر سرور تداخل نداشته باشد. ترافیک DNS خارجی توسط iptables PREROUTING هدایت می‌شود که فقط بسته‌های ورودی از اینترفیس شبکه خارجی را تحت تأثیر قرار می‌دهد — DNS محلی سرور دست‌نخورده باقی می‌ماند.

قبل از راه‌اندازی — بررسی پورت ۵۳:

# چه سرویسی از پورت 53 استفاده می‌کند؟
ss -ulnp | grep ':53 '

# نتیجه مورد انتظار: فقط systemd-resolved روی 127.0.0.53 (بی‌خطر)
# UNCONN  127.0.0.53%lo:53  users:(("systemd-resolve",...))

بعد از راه‌اندازی — بررسی سلامت سرویس‌ها:

# ۱. DNS محلی سرور هنوز کار می‌کند
dig +short google.com @127.0.0.53

# ۲. کانتینر thefeed در حال اجراست
docker ps --filter name=thefeed

# ۳. کانال‌ها در حال دریافت هستند
docker logs thefeed-server --tail 5

# ۴. قانون iptables فعال است
iptables -t nat -L PREROUTING -n | grep 5300

# ۵. بقیه کانتینرها سالم هستند
docker ps --format 'table {{.Names}}\t{{.Status}}' | head -10

اگر مشکلی پیش آمد — حذف فوری redirect:

# حذف قانون iptables (بازگشت به حالت اولیه)
sudo iptables -t nat -D PREROUTING -i eth0 -p udp --dport 53 -j REDIRECT --to-ports 5300
sudo iptables -D INPUT -p udp --dport 5300 -j ACCEPT
sudo netfilter-persistent save

🖥️ نصب کلاینت

لینوکس / macOS / ویندوز

از صفحه Releases باینری مناسب سیستم خود را دانلود کنید.

# اجرا (مرورگر خودکار باز می‌شود)
./thefeed-client

# با پورت و دایرکتوری سفارشی
./thefeed-client --port 9090 --data-dir ./mydata

# با رمز عبور ادمین
./thefeed-client --password "your-password"

اندروید (Termux)

# نصب Termux از F-Droid
pkg update && pkg install curl

# دانلود باینری اندروید
curl -Lo thefeed-client https://github.com/sartoopjj/thefeed/releases/latest/download/thefeed-client-android-arm64
chmod +x thefeed-client

# اجرا
./thefeed-client
# مرورگر را باز کنید: http://127.0.0.1:8080

⚙️ تنظیمات DNS

شما به دو رکورد DNS نیاز دارید. فرض کنید IP سرور شما 203.0.113.10 است:

نوع نام مقدار
A ns.example.com 203.0.113.10
NS t.example.com ns.example.com

🛠️ ساخت از سورس

# پیش‌نیازها: Go 1.26+
make build          # ساخت سرور و کلاینت
make build-all      # کراس‌کامپایل تمام پلتفرم‌ها
make test           # اجرای تست‌ها
make upx            # فشرده‌سازی باینری‌ها با UPX

🎞️ رله‌های مدیا

هر رله مستقل است — یک فایل می‌تواند هم‌زمان روی DNS و گیتهاب (و رله‌های آینده) قابل دسترسی باشد. کلاینت بر اساس فلگ‌هایی که در پیام دیده، سریع‌ترین مسیر در دسترس را انتخاب می‌کند، در صورت خطا چند بار retry می‌کند و قبل از فال‌بک به مسیر کندتر از کاربر می‌پرسد. هش و سایز هر دانلود اعتبارسنجی می‌شود.

دو رله الان موجود هست:

  • رله DNS (کند، پیش‌فرض روشن). بایت‌ها به بلاک‌های DNS تقسیم می‌شوند. در شبکه‌های فیلترشده کار می‌کند. سقف پیش‌فرض: ۱۰۰ کیلوبایت.
  • رله گیتهاب (سریع، پیش‌فرض خاموش). فایل‌ها در یک ریپازیتوری آپلود می‌شوند و کلاینت‌ها از طریق api.github.com (که در خیلی از کشورها برخلاف raw.githubusercontent.com در دسترس است) با HTTPS می‌گیرند. به یک Personal Access Token با اسکوپ contents:write نیاز دارد. مسیر فایل‌ها <repo>/<sanitised-domain>/<size>_<crc32> است تا چند سرور بتوانند یک ریپازیتوری مشترک داشته باشند. سقف پیش‌فرض: ۱۵ مگابایت.

پرچم‌ها / متغیرهای محیطی:

Flag Env Default توضیح
--dns-media-enabled THEFEED_DNS_MEDIA_ENABLED false فعال/غیرفعال کردن رله DNS
--dns-media-max-size THEFEED_DNS_MEDIA_MAX_SIZE_KB 100 (KB) سقف هر فایل
--dns-media-cache-ttl THEFEED_DNS_MEDIA_CACHE_TTL_MIN 600 (min) TTL
--dns-media-compression THEFEED_DNS_MEDIA_COMPRESSION gzip none / gzip / deflate
--github-relay-enabled THEFEED_GITHUB_RELAY_ENABLED false فعال‌سازی رله گیتهاب
--github-relay-token THEFEED_GITHUB_RELAY_TOKEN PAT با دسترسی contents:write
--github-relay-repo THEFEED_GITHUB_RELAY_REPO owner/repo
--github-relay-branch THEFEED_GITHUB_RELAY_BRANCH main برنچ کامیت
--github-relay-max-size THEFEED_GITHUB_RELAY_MAX_SIZE_KB 15360 (KB) سقف هر فایل
--github-relay-ttl THEFEED_GITHUB_RELAY_TTL_MIN 600 (min) فایل‌های یتیم در سیکل بعدی پاک می‌شوند

📋 پرچم‌های سرور

پرچم پیش‌فرض توضیح
--data-dir ./data دایرکتوری داده‌ها
--domain دامنه DNS (الزامی)
--key رمز عبور رمزنگاری (الزامی)
--channels {data-dir}/channels.txt فایل کانال‌ها
--x-accounts {data-dir}/x_accounts.txt فایل حساب‌های X
--x-rss-instances http://nitter.net,https://nitter.net لیست URL پایه برای RSS حساب‌های X
--api-id شناسه API تلگرام
--api-hash هش API تلگرام
--phone شماره تلفن تلگرام
--listen :53 آدرس شنود DNS
--login-only false فقط لاگین به تلگرام
--no-telegram false اجرا بدون ورود به تلگرام (فقط کانال‌های عمومی)
--padding 32 داکثر padding تصادفی
--msg-limit 15 حداکثر تعداد پیام‌ها برای هر کانال تلگرام
--fetch-interval 10 فاصله چرخه فتچ بر حسب دقیقه (حداقل ۳)
--allow-manage false فعال‌سازی مدیریت از راه دور (ارسال پیام و مدیریت کانال‌ها)
--debug false لاگ کردن هر کوئری DNS رمزگشایی‌شده
--dns-media-enabled false سرو مدیا از طریق DNS (مسیر کند)
--dns-media-max-size 100 سقف هر فایل برای رله DNS بر حسب KB
--dns-media-cache-ttl 600 TTL رله DNS بر حسب دقیقه
--dns-media-compression gzip فشرده‌سازی رله DNS: none / gzip / deflate
--github-relay-enabled false سرو مدیا از طریق گیتهاب (مسیر سریع)
--github-relay-token توکن گیتهاب (contents:write)
--github-relay-repo owner/repo ریپازیتوری رله
--github-relay-branch main برنچی که رله روش کامیت می‌کند
--github-relay-max-size 15360 سقف هر فایل برای رله گیتهاب بر حسب KB
--github-relay-ttl 600 TTL رله گیتهاب بر حسب دقیقه

📋 پرچم‌های کلاینت

پرچم پیش‌فرض توضیح
--data-dir ./thefeeddata دایرکتوری داده‌ها
--port 8080 پورت رابط وب
--password رمز عبور ادمین (خالی = بدون احراز هویت)

📂 فرمت channels.txt

# خطوط با # کامنت هستند
@VahidOnline
@SomeChannel

📂 فرمت x_accounts.txt

# خطوط با # کامنت هستند
Vahid

🔒 نکات امنیتی دریافت X

  • دریافت پست‌های X فقط از RSS/XML انجام می‌شود.
  • آدرس instanceها اعتبارسنجی می‌شوند (http/https، فقط host، بدون path/query/fragment).
  • اندازه پاسخ محدود است و timeout اعمال می‌شود.
  • اگر یک mirror خطای 403 بدهد یا در دسترس نباشد، سرور خودکار instance بعدی را امتحان می‌کند.
  • پیشنهاد: لیست mirrorهای قابل اعتماد خودتان را با --x-rss-instances (یا THEFEED_X_RSS_INSTANCES) تنظیم کنید.

🤝 مشارکت

مشارکت شما خوش‌آمد است! Issue بزنید یا Pull Request بفرستید.

📄 لایسنس

MIT


برای ایران آزاد شیر و خورشید

هر ایرانی حق دسترسی آزاد به اطلاعات را دارد