پیشنیازها
سرور پنل، سرورهای نود و ماشین ساخت چه چیزی لازم دارند، و ایجنت روی نود چه چیزهایی را تغییر میدهد.
در این صفحه
Mistgate یک سرور Linux برای پنل، یک یا چند سرور Linux برای نودها و یک نام دامنه لازم دارد. فایلهای اجرایی را از یک ریلیز GitHub میگیرید، یا خودتان روی ماشینی از آنِ خودتان از روی سورس میسازید.
سرور پنل#
| چه چیزی | پیشنیاز |
|---|---|
| سیستم | Linux روی amd64 یا arm64. systemd برای زنده نگه داشتن mistgate serve (نمونهٔ یک unit در نصب پنل هست). |
| دسترسی | root برای نصب. پنلِ در حال اجرا فقط باید TCP 443 و 80 را bind کند و در پوشهٔ دادهاش بنویسد. |
| دامنه | نام میزبانی که رکورد A آن (و اگر IPv6 دارید، AAAA) به سرور اشاره کند، مثلاً panel.example.com. |
| پورتهای ورودی | TCP 443: سایت پوششی، اشتراکها، صفحههای کاربر، پنل مدیریت (در حالتهای prefix و host) و ایجنتهای نود. TCP 80 وقتی پنل گواهیاش را از Let's Encrypt میگیرد. چیز دیگری نه، مگر اینکه listener جداگانهای برای پنل مدیریت یا ایجنت انتخاب کنید. |
| خروجی | Let's Encrypt روی HTTPS وقتی از آن استفاده میکنید. پورتهای سرورهای شما روی نودها: پنل هر سرور را مثل یک کلاینت بررسی میکند (Hysteria2 روی UDP، AmneziaWG روی UDP). SSH (TCP 22 یا پورتی که بدهید) به سروری که از پنل مدیریت بهعنوان نود نصب میکنید. GitHub روی HTTPS (api.github.com، github.com و میزبان دانلودش) برای ریلیزها: پنل هر 10 دقیقه دنبال بستهٔ امضاشدهٔ تازهٔ نود و هر 10 دقیقه دنبال بهروزرسانی پنل میگردد. Cloudflare روی HTTPS وقتی حسابهای WARP ثبت میکنید، کپچای Turnstile را روشن میکنید یا در R2 نسخهٔ پشتیبان میگذارید. |
| ذخیرهسازی | پوشهٔ داده، بهطور پیشفرض /var/lib/mistgate: یک پایگاه دادهٔ SQLite، کلید اصلی، بستهٔ نود و چند فایل کوچک. |
| نرمافزار دیگر | هیچ. پنل یک فایل اجرایی ایستاست. فقط بهروزرسانی خودکارش systemd را صدا میزند (systemctl، systemd-run). |
نسخهٔ Cloudflare (پیشنمایش) به سرور پنل نیاز ندارد؛ پیشنیازهای خودش، Workers Paid و دامنهای روی DNS شرکت Cloudflare، در نصب نسخهٔ Cloudflare آمده است.
پنل را روی سروری جدا نگه دارید. نودی روی همان میزبان با پنل بر سر TCP 443 (Hysteria2 بهطور پیشفرض آنجا یک سایت HTTPS اجرا میکند) و TCP 80 رقابت میکند.
سرورهای نود#
| چه چیزی | پیشنیاز |
|---|---|
| سیستم | Linux با systemd: Ubuntu نسخهٔ 22.04 یا جدیدتر، یا Debian نسخهٔ 12 یا جدیدتر. amd64 یا arm64. |
| دسترسی | برای نصبکنندهٔ SSH: root از راه SSH، یا کاربر SSH با sudo -n بدون پرسش، با ورود با رمز عبور؛ پورت SSH باید از سرور پنل در دسترس باشد. نصبکننده تغییرهای سیستمی را با root انجام میدهد، دستکم 256 MB حافظه روی سرور و یک بستهٔ امضاشدهٔ نود در پنل لازم دارد، و پورت SSH و TCP 80، TCP 443 و UDP 443 را در UFW یا firewalldِ از قبل فعال باز میکند. mistgate-node install دستی هم با root اجرا میشود؛ ایجنت با root و با مجموعهٔ محدودشدهای از قابلیتها (capability) اجرا میشود. |
| آدرس | یک آدرس IPv4 عمومی. کلاینتها به آدرس نود وصل میشوند: دامنهای که به سرور اشاره میکند، یا خود IP. |
| nftables | فرمان nft (روی Debian 12 و Ubuntu 22.04 به بالا بهطور پیشفرض نصب است). ایجنت قانونهای فایروالش را با آن مدیریت میکند. پرش پورت به redirect در خانوادهٔ inet نیاز دارد که کرنلهای 5.2 به بالا دارند. |
| دستگاه TUN | /dev/net/tun برای بکاند AmneziaWG در فضای کاربر و برای WARP. روی VPS مبتنی بر کانتینر (OpenVZ، LXC) TUN را در پنل کنترل سرویسدهنده روشن کنید. |
| ساعت | همگام با NTP. ایجنت ساعتی را که بیش از 30 ثانیه با ساعت پنل فرق دارد گزارش میکند و بررسی time_sync عیبیاب هم آن را میبیند. |
| پورتهای ورودی | پورت UDP هر سرور Hysteria2 و AmneziaWG روی نود: Hysteria2 از 443 شروع میکند، پروفایل AmneziaWG یک پورت تصادفی بین 10000 و 60000 میگیرد. پورت TCP هر سرور VLESS (بهطور پیشفرض 443؛ نه 80). بازهٔ پرش پورت یک پروفایل Hysteria2 وقتی روشنش میکنید (از 1024 به بالا، حداکثر 20000 پورت). TCP 443 برای سایت HTTPS که Hysteria2 به هر کس که کلاینت نیست نشان میدهد، و برای Let's Encrypt. TCP 80 برای Let's Encrypt وقتی چیز دیگری آن را نگرفته باشد. |
| خروجی | TCP به پنل (معمولاً 443). TCP به هدف REALITY هر سرور VLESS (معمولاً 443): نود برای هر بازدیدکنندهای که کلاینت نیست به آن وصل میشود. Let's Encrypt، DNS، و نقطههای اتصال WARP شرکت Cloudflare وقتی نود از WARP استفاده میکند. HTTPS به www.speedtest.net و نزدیکترین سرورهای سرعت Ookla (پورت 8080)، یا بهعنوان جایگزین speed.cloudflare.com، proof.ovh.net و cachefly.net، فقط وقتی مالک ظرفیت شبکهٔ نود را اندازه میگیرد، و یک بار برای نودی تازه: نودها را ببینید. |
| بدون پورت مدیریت | ایجنت به پنل وصل میشود. هیچ چیز روی نود لازم نیست از پنل اتصال بپذیرد. |
خوب است بدانید:
- IPv6 اختیاری است. نود بدون IPv6 روی IPv4 سرویس میدهد. نودی که آدرس IPv6 سراسری دارد اما نمیتواند روی IPv6 به بیرون وصل شود از نودِ بدون IPv6 بدتر است: برنامههایی که پاسخ AAAA میگیرند گیر میکنند. بررسی
ipv6عیبیاب دربارهٔ آن هشدار میدهد. - کانتینرها. روی OpenVZ یا LXC ایجنت نمیتواند مقدارهای sysctl خودش را تنظیم کند (آن را در لاگ مینویسد و ادامه میدهد)، و ماژول کرنل AmneziaWG نصبشدنی نیست. بکاند فضای کاربر وقتی TUN روشن باشد کار میکند.
- ماژول کرنل AmneziaWG. اختیاری. بهطور پیشفرض AmneziaWG در فضای کاربر اجرا میشود و ماژولی لازم ندارد. برحسب درخواست، ایجنت (یا
mistgate-node awg prepare-kernel) ماژول را روی Ubuntu از PPA شرکت Amnezia و روی Debian از روی سورس میسازد. برای این کار apt، systemd، نبودن کانتینر و غیرفعال بودن Secure Boot لازم است. - میزبان تمیز بهتر کار میکند. عیبیاب آنچه را ممکن است سد راه شود گزارش میکند: پنلهای VPN دیگر و کانتینرهایشان، Xray، رابطهای قدیمی WireGuard، قانونهای NAT در nftables که از Mistgate نیستند، و سیاست drop در زنجیرهٔ FORWARD در Docker (که ارسال بستهٔ AmneziaWG را خراب میکند).
فایلهای اجرایی ریلیز#
هر ریلیز GitHub فایلهای اجرایی ایستای Linux هر دو برنامه را برای amd64 و arm64 دارد (mistgate-linux-amd64، mistgate-linux-arm64، mistgate-node-linux-amd64، mistgate-node-linux-arm64)، با SHA256SUMS و مانیفستهای امضاشدهای که پنل و نودها از روی آنها بهروز میشوند. فایلهای اجرایی کلید ریلیز پروژه را در خود دارند؛ پس پنلی که از آنها نصب شود بستههای امضاشدهٔ نود را از GitHub میگیرد و، روی نصب با systemd، میتواند خودش را بهروز کند (به بهروزرسانیها نگاه کنید). در این حالت ماشین ساخت لازم نیست.
ساخت از روی سورس#
| ابزار | نسخه |
|---|---|
| Go | 1.27. go.mod نسخهٔ toolchain را مشخص میکند (go1.27.1)؛ با GOTOOLCHAIN=auto (پیشفرض) یک Go قدیمیتر آن را دانلود میکند. |
| Node.js | 22 (چیزی که CI با آن میسازد) یا جدیدتر: SPA پنل مدیریت ساخته میشود و داخل فایل اجرایی پنل جاسازی میشود. |
| pnpm | 10: web/package.json نسخهٔ pnpm@10.33.2 را ثابت کرده که Corepack در صورت روشن بودن از آن استفاده میکند. |
| make و یک پوستهٔ POSIX | روی Windows، Git Bash یا WSL. |
| git | make build نسخه (git describe) و زمان کامیت (git log) را در فایلهای اجرایی ثبت میکند. بدون git نسخه 0.0.0-dev و زمان ساخت 0 است. |
| دسترسی به اینترنت | برای ماژولهای Go و بستههای npm. |
make build فایلهای اجرایی ایستای Linux (CGO_ENABLED=0) را برای هر دو معماری میسازد:
make build
# bin/mistgate-linux-amd64 bin/mistgate-node-linux-amd64
# bin/mistgate-linux-arm64 bin/mistgate-node-linux-arm64فایلهای اجرایی که خودتان میسازید فقط وقتی خودشان را بهروز میکنند که با کلید ریلیز خودتان ساخته شده باشند (RELEASE_KEY=<public key> make build)، و آنوقت هم فقط از بستههایی که شما امضا کردهاید. نودی که از یک بیلد بدون کلید نصب شده باشد یک بار باید دستی بهروز شود. اگر قصد دارید از بهروزرسانی امضاشده استفاده کنید، کلید را پیش از اولین بیلد بسازید: نسخهها و امضا را ببینید.
DNS و گواهیها#
- پنل. نام میزبان پنل را مستقیم به سرور اشاره دهید، بدون CDN یا پروکسی جلوی آن. ایجنتهای نود CA خودِ پنل را pin میکنند و Let's Encrypt روی خود سرور اعتبارسنجی میکند؛ هیچکدام از راه پروکسیای که TLS را خاتمه میدهد کار نمیکند.
- گواهی پنل. یا بگذارید پنل از Let's Encrypt بگیرد (
serve --acme-domain)، یا فایلهای گواهی خودتان را بدهید (serve --tls-certو--tls-key). نصب پنل را ببینید. - میزبان مخفی پنل مدیریت. اگر پنل مدیریت روی نام میزبان مخفی باشد، آن نام رکورد DNS خودش را لازم دارد و باید زیر پوشش یک گواهی باشد. گواهی Let's Encrypt نامهایش را در گزارشهای عمومی Certificate Transparency منتشر میکند؛ گواهی wildcard خودتان نام مخفی را از آنها بیرون نگه میدارد.
- نقطهٔ اتصال ایجنت. رکورد DNS و گواهی عمومی لازم ندارد. ایجنتها آن را روی نشانی پنل با یک نام TLS مخفی (برچسبی تصادفی زیر دامنهٔ پنل) مییابند، و پنل به آن نام با گواهیای از CA خودش پاسخ میدهد.
- نودها. سرور Hysteria2 با گواهی Let's Encrypt دامنهای میخواهد که رکورد A آن به نود اشاره کند: آدرس نود، یا دامنه (SNI) پروفایل. نودی که فقط با IP شناخته میشود بهجای آن از گواهی خودامضا (pinشده) استفاده میکند. AmneziaWG به گواهی نیاز ندارد.
ایجنت روی نود چه چیزهایی را تغییر میدهد#
ایجنت فقط چیزهایی را تغییر میدهد که اینجا فهرست شدهاند، و فقط اشیای خودش را: هرگز جدولهای nftables برنامهٔ دیگری را ویرایش نمیکند، هرگز پورتی زیر 1024 را redirect نمیکند، و هرگز اجازه نمیدهد بازهٔ پرش پورت پورتهای sshd را بپوشاند.
| چه چیزی | کجا | چه وقت |
|---|---|---|
| فایل اجرایی ایجنت | /usr/local/bin/mistgate-node (install --bin مسیر را عوض میکند). بهروزرسانی خودکار <binary>.new و <binary>.prev را کنار آن میگذارد. |
mistgate-node install، بهروزرسانی خودکار |
| سرویس | /etc/systemd/system/mistgate-node.service، فعال و راهاندازیشده. |
mistgate-node install |
| پوشهٔ وضعیت | /var/lib/mistgate-node (حالت 0700، فایلها 0600): کلید و گواهی نود، CA پنل، آدرس پنل، آخرین وضعیت اعمالشده، گواهیهای سرورهایش، نشانگرهای بهروزرسانی. |
enroll، سپس ایجنت |
| sysctl | /etc/sysctl.d/90-mistgate.conf: net.core.default_qdisc = fq، net.ipv4.tcp_congestion_control = bbr، و net.core.rmem_max / net.core.wmem_max دستکم 16 MiB، که روی کرنل در حال اجرا هم اعمال میشود؛ بافرهای بزرگتر سوکت UDP به QUIC کمک میکند زیر بار بسته گم نکند. سوکتهای تازهٔ رلهٔ UDP دستکم 1 MiB از net.core.rmem_default و net.core.wmem_default به ارث میبرند؛ net.ipv4.udp_mem همچنان سقف کل حافظهٔ UDP را تعیین میکند. net.netfilter.nf_conntrack_max دستکم 65,536 و net.netfilter.nf_conntrack_buckets دستکم 16,384 است؛ مقدارهای زندهٔ بزرگتر حفظ میشوند. |
با هر شروع ایجنت |
| journald | /etc/systemd/journald.conf.d/90-mistgate.conf: SystemMaxUse=200M، RuntimeMaxUse=200M. وقتی فایل تغییر کند journald دوباره راهاندازی میشود. |
با هر شروع ایجنت |
| فایروال: نگهبان SSH و پرش پورت | جدول nftables با نام inet mistgate_node. |
با هر شروع ایجنت؛ وقتی بازههای پرش پورت عوض میشوند |
| AmneziaWG | رابطهای mgawg<port>، جدول nftables با نام inet mistgate_awg (NAT برای کلاینتها، MSS clamp، بدون ترافیک بین کلاینتها، و هیچ چیز روی نود از راه تونل در دسترس نیست مگر ping به آدرس تونل). IPv4 forwarding روشن؛ IPv6 forwarding وقتی تونلی IPv6 دارد، پس از اینکه رابطهای دارای accept_ra=1 به accept_ra=2 منتقل شدند تا میزبان IPv6 خودش را نگه دارد. مقدارهای forwarding فقط روی سیستم زنده تنظیم میشوند. |
تا وقتی نود یک سرور AmneziaWG اجرا میکند |
| WARP | رابط mgwarp، جدول مسیریابی 51820 با قاعدههایی در اولویتهای 90 و 110، و جدول nftables با نام inet mistgate_warp. |
تا وقتی نود WARP دارد |
| بررسی تحویل UDP | جدول موقت nftables با نام inet mistgate_udpcheck فقط datagramهایی را که برچسب 8 بایتی بررسی را دارند میشمارد و دور میاندازد، در prerouting با اولویت -500؛ بعد از بررسی یا پایان مهلتش حذف میشود. |
تا وقتی بررسی تحویل اجرا میشود |
| محافظت در برابر تورنت | جدول nftables با نام inet mistgate_torrentguard: بستههای اول جریانهایی را که کلاینتهای AmneziaWG شروع میکنند به ایجنت میدهد، و اتصالی را که ایجنت BitTorrent تشخیص داده در کرنل drop میکند. اگر ایجنت پاسخ ندهد هیچ چیز خراب نمیشود (صف دور زده میشود). Hysteria2 داخل موتور خودش بررسی میشود و چیزی روی میزبان نمیگذارد. |
تا وقتی مسدود کردن ترافیک BitTorrent شناساییشده روشن است و یک سرور AmneziaWG اجرا میشود |
| فایروال میزبان (UFW) | قانونهای allow برای پورت UDP هر سرور و بازهٔ پرش یک سرور Hysteria2، با کامنت mistgate-node-managed-udp-v1-<port>، و برای پورت TCP هر سرور VLESS، با برچسب mistgate-node-managed-tcp-v1-<port>. ایجنت هرگز روی قانونی که مال خودش نیست برای همان پورت قانون نمیافزاید و هرگز قانون بدون برچسب خودش را حذف نمیکند. ufw بهصورت یک unit موقت systemd بیرون از sandbox ایجنت اجرا میشود. firewalld فقط بررسی میشود و هرگز تغییر نمیکند. |
تا وقتی UFW فعال است |
| resolver | /etc/systemd/resolved.conf.d/90-mistgate.conf (با systemd-resolved)، یا بازنویسی /etc/resolv.conf با نگه داشتن اصلی بهنام /etc/resolv.conf.mistgate.bak. |
فقط وقتی راهحل resolver عیبیاب را اعمال میکنید |
| اندازهٔ journal | journalctl --vacuum-size=200M --vacuum-time=7d. |
فقط وقتی راهحل عیبیاب را اعمال میکنید |
| ماژول کرنل AmneziaWG | بستههای apt، PPA شرکت Amnezia روی Ubuntu یا ساخت از روی سورس روی Debian، و /etc/modules-load.d/amneziawg.conf. بهصورت unit موقت mistgate-awg-prepare اجرا میشود. |
فقط وقتی درخواستش کنید |
نگهبان SSH اتصالهای تازه به پورتهای sshd را برای هر آدرس مبدأ (برای IPv6 هر /64) محدود میکند: یک انفجار 10 تایی، سپس 6 در دقیقه. نشستهای باز هرگز دست نمیخورند، کسی مسدود نمیشود، loopback معاف است، و وقتی جدولش پر شود نگهبان بهجای قفل کردن شما از تطبیق دست میکشد. ابزارهایی که از یک آدرس همزمان اتصالهای SSH زیادی باز میکنند ممکن است باز هم آن را حس کنند. ایجنت پورتهای sshd را با sshd -T، فایلهای پیکربندی sshd و ssh.socket پیدا میکند و اگر چیزی نیابد 22 را به کار میبرد.
unit سرویس#
mistgate-node install خودش unit را مینویسد، متناسب با حافظهٔ میزبان. تنظیمهای اصلیاش:
| تنظیم | مقدار |
|---|---|
| شروع | mistgate-node run --state-dir /var/lib/mistgate-node |
| پیش از شروع | نگهبان حلقهٔ crash: بعد از بهروزرسانیای که سه بار پشتسرهم crash کند، فایل اجرایی قبلی را برمیگرداند |
| بعد از هر توقف | mistgate-node cleanup-net: رابطهای AmneziaWG و WARP، مسیرها و قاعدههای WARP و جدولهای nftablesشان را حذف میکند، تا ایجنتِ crashکرده مسیریابی خراب باقی نگذارد (ایجنت هنگام شروع دوباره آنها را میگذارد) |
| راهاندازی دوباره | Restart=on-failure بعد از 5 ثانیه؛ کد خروج 78 (ثبتنشده یا از رده خارج) دوباره راهاندازی نمیشود |
| حافظه | GOMEMLIMIT حدود 60% رم (دستکم 64 MiB)، MemoryHigh حدود 70%، MemoryMax حدود 85%؛ LimitNOFILE=65536 |
| دسترسیها | با root و فقط با CAP_NET_ADMIN و CAP_NET_BIND_SERVICE اجرا میشود، NoNewPrivileges=yes |
| فایلها | ProtectSystem=strict: فقط پوشهٔ وضعیت، پوشهٔ فایل اجرایی، /etc/sysctl.d و /etc/systemd/journald.conf.d قابل نوشتناند |
| دستگاهها | جز شبهدستگاههای استاندارد فقط /dev/net/tun |
| بقیه | ProtectHome، PrivateTmp، SystemCallFilter=@system-service، UMask=0077 و بقیهٔ sandbox معمول systemd |
اینکه از رده خارج کردن یک نود چه چیزهایی را پاک میکند، و چطور میزبان را دستی پاک کنید، زیر «حذف نود» در افزودن نود آمده است.