ساخت سرویس DNS شخصی
برای عبور از محدودیتها
با VPS اوبونتو
مقدمه
سرویسهای DNS ایرانی مانند شکن (Shecan)، ۴۰۳، بگذر (Begzar)، رادار گیم (Radar.game)، شلتر (Shelter) و بشکن (Beshkan) با هدف تسهیل دسترسی کاربران ایرانی به برخی وبسایتها و سرویسهایی که به دلایل مختلف (اغلب تحریمها یا فیلترینگ DNS) با DNSهای معمول قابل دسترس نیستند، ایجاد شدهاند. این سرویسها با تغییر نحوه پاسخدهی به درخواستهای DNS برای دامنههای خاص، کاربران را به سمت سرورها یا IPهایی هدایت میکنند که محتوای مورد نظر از طریق آنها قابل دریافت است.
اگر شما یک سرور مجازی خصوصی (VPS) در خارج از ایران دارید و میخواهید کنترل بیشتری روی فرآیند تفکیک نام دامنه (DNS Resolution) داشته باشید و یا سرویس مشابهی را به صورت خصوصی برای خود یا گروه کوچکی ایجاد کنید، این مقاله شما را گام به گام راهنمایی میکند.
پیشنیازها:
- VPS: یک سرور مجازی با سیستمعامل اوبونتو (ترجیحاً نسخه LTS اخیر مانند 20.04 یا 22.04) واقع در خارج از ایران (ترجیحا هلند یا آلمان)
- دسترسی روت (Root): برای نصب نرمافزار و ویرایش فایلهای پیکربندی.
- IP ثابت: VPS شما باید یک آدرس IP عمومی ثابت داشته باشد.
- دانش پایه لینوکس: آشنایی با خط فرمان لینوکس و ویرایش فایلهای متنی.
مفهوم اصلی: چگونه کار میکند؟
ایده اصلی پشت این سرویسها، ایجاد یک DNS Resolver سفارشی است. این Resolver:
- دریافت درخواست DNS: درخواستهای DNS از دستگاه شما (یا هر دستگاهی که از این DNS استفاده کند) را دریافت میکند.
- بررسی لیست سفارشی: بررسی میکند که آیا دامنه درخواست شده در لیست دامنههایی است که نیاز به پاسخ خاصی دارند (دامنههای تحریم شده یا فیلتر شده در سطح DNS).
- پاسخ سفارشی: اگر دامنه در لیست بود، به جای IP واقعی سرور اصلی، یک IP دیگر را برمیگرداند. این IP معمولاً متعلق به یک پراکسی معکوس (Reverse Proxy)، یک CDN Edge یا سروری است که میتواند محتوای دامنه اصلی را دریافت و به کاربر تحویل دهد و از محدودیتها عبور کند.
- تفکیک عادی (Forwarding): اگر دامنه در لیست سفارشی نبود، درخواست را به یک DNS Resolver عمومی معتبر (مانند Google DNS، Cloudflare DNS یا ...) ارسال میکند و پاسخ عادی را برمیگرداند.
انتخاب نرمافزار DNS Server
چندین نرمافزار متنباز برای این کار وجود دارد. دو گزینه محبوب و مناسب برای این هدف عبارتند از:
- Unbound: یک DNS Resolver بسیار امن، سریع و با کارایی بالا که به طور خاص برای تفکیک نام طراحی شده است. پیکربندی آن برای بازنویسی (Override) دامنههای خاص نسبتاً ساده است. (توصیه شده)
- dnsmasq: یک سرور DNS سبکتر که قابلیتهای Forwarding و Caching و همچنین DHCP را ارائه میدهد. برای سناریوهای سادهتر و بازنویسی آدرسها بسیار مناسب است، اما شاید به اندازه Unbound برای یک Resolver عمومی قوی نباشد.
در این راهنما از Unbound استفاده خواهیم کرد.
مراحل راهاندازی با Unbound
۱. بهروزرسانی سیستم:
ابتدا سیستمعامل VPS خود را بهروز کنید:
sudo apt update && sudo apt upgrade -y
۲. نصب Unbound:
بسته Unbound را نصب کنید:
sudo apt install unbound -y
۳. پیکربندی Unbound:
فایل پیکربندی اصلی Unbound معمولاً در مسیر /etc/unbound/unbound.conf یا در فایلی داخل /etc/unbound/unbound.conf.d/ قرار دارد (مثلاً pi-hole.conf اگر Pi-hole نصب باشد، یا میتوانید فایل خودتان را بسازید).
یک فایل پیکربندی جدید برای تنظیمات سفارشی خود ایجاد کنید (این کار مدیریت را آسانتر میکند):
sudo nano /etc/unbound/unbound.conf.d/my-custom-dns.conf
محتویات زیر را در این فایل قرار دهید و مطابق نیاز خود تغییر دهید:
server: # آدرس IP سرور و پورتهایی که Unbound به آنها گوش میدهد # 0.0.0.0 یعنی به تمام IP های سرور گوش بده (عمومی و محلی) interface: 0.0.0.0@53 interface: ::0@53 # برای IPv6 اگر نیاز دارید، در غیر این صورت حذف کنید # مهم: کنترل دسترسی - چه کسانی میتوانند از این DNS استفاده کنند # برای امنیت، فقط به IP های مورد نظر خود اجازه دهید. # مثال: فقط به IP خانه شما (فرض کنید 1.2.3.4) # access-control: 1.2.3.4/32 allow # مثال: اجازه به یک رنج IP # access-control: 192.168.1.0/24 allow # ****** هشدار: استفاده از 0.0.0.0/0 به همه اجازه میدهد و سرور شما را به یک Open Resolver تبدیل میکند ****** # ****** این کار خطرناک است و میتواند برای حملات DDoS Amplification استفاده شود. ****** # ****** فقط در صورتی استفاده کنید که دقیقا میدانید چه میکنید یا با فایروال محدود میکنید. ****** # access-control: 0.0.0.0/0 allow # بسیار با احتیاط استفاده شود! access-control: 127.0.0.1/32 allow # اجازه به خود سرور (برای تست) # اینجا IP یا رنج IP های مجاز خود را اضافه کنید: # access-control: YOUR_HOME_IP/32 allow # فعال کردن IPv4, IPv6 (اگر نیاز دارید), UDP, TCP do-ip4: yes # do-ip6: yes # اگر IPv6 نیاز دارید فعال کنید do-udp: yes do-tcp: yes # تنظیمات امنیتی پایه hide-identity: yes hide-version: yes harden-glue: yes harden-dnssec-stripped: yes # امنیت DNSSEC use-caps-for-id: yes # افزایش امنیت در برابر Spoofing # تنظیمات کش (Cache) cache-min-ttl: 3600 # حداقل زمان نگهداری در کش (ثانیه) cache-max-ttl: 86400 # حداکثر زمان نگهداری در کش (ثانیه) # پیشواکشی رکوردهای محبوب برای افزایش سرعت prefetch: yes prefetch-key: yes # تعداد رشتههای پردازشی (معمولاً برابر با تعداد هستههای CPU) # با دستور nproc میتوانید تعداد هستهها را ببینید num-threads: 1 # یا بیشتر، بسته به منابع VPS # فعال کردن لاگ (اختیاری - برای اشکالزدایی) # verbosity: 1 # سطح لاگ (0 تا 5) # logfile: /var/log/unbound.log # مسیر فایل لاگ # use-syslog: yes # استفاده از syslog سیستم # ****** بخش مهم: بازنویسی دامنههای خاص ****** # از local-zone و local-data برای تعریف پاسخهای سفارشی استفاده میکنیم. # برای هر دامنهای که میخواهید بازنویسی کنید، یک بلاک تعریف کنید. # مثال: بازنویسی a-blocked-domain.com به IP 192.0.2.1 (این IP فقط مثال است!) local-zone: "a-blocked-domain.com." static local-data: "a-blocked-domain.com. A 192.0.2.1" local-data: "www.a-blocked-domain.com. A 192.0.2.1" # برای سابدامین www # مثال: بازنویسی another-domain.net به IP 198.51.100.5 (این IP فقط مثال است!) local-zone: "another-domain.net." static local-data: "another-domain.net. A 198.51.100.5" local-data: "*.another-domain.net. A 198.51.100.5" # برای تمام سابدامینها (Wildcard) # ... دامنههای بیشتری را به همین شکل اضافه کنید ... # شما باید IP های "تمیز" یا IP های پراکسی مناسب را برای هر دامنه پیدا کنید. # ****** بخش مهم: ارسالکننده (Forwarder) ****** # برای دامنههایی که در لیست بازنویسی شما نیستند، درخواستها به اینجا ارسال میشوند. # استفاده از DNS-over-TLS (DoT) برای امنیت بیشتر توصیه میشود. forward-zone: name: "." # ارسال تمام درخواستهای دیگر # استفاده از سرورهای DNS عمومی معتبر (مانند Cloudflare, Google) forward-addr: 1.1.1.1@853#cloudflare-dns.com forward-addr: 1.0.0.1@853#cloudflare-dns.com forward-addr: 8.8.8.8@853#dns.google forward-addr: 8.8.4.4@853#dns.google # فعال کردن DNS-over-TLS برای ارسال امن forward-tls-upstream: yes
نکات مهم در پیکربندی:
- interface:: مطمئن شوید Unbound به IP عمومی VPS شما گوش میدهد (0.0.0.0).
- access-control:: این بخش بسیار حیاتی است. برای جلوگیری از سوءاستفاده از سرور شما، حتماً دسترسی را به IP های مشخص خودتان محدود کنید (access-control: YOUR_IP/32 allow). باز گذاشتن آن برای همه (0.0.0.0/0) بسیار خطرناک است.
- local-zone و local-data: قلب تپنده سیستم شما اینجاست. شما باید لیست دامنههایی که میخواهید رفتارشان را تغییر دهید و IP های جایگزین مناسب برای آنها را پیدا کنید. این سختترین و زمانبرترین بخش کار است.
- forward-zone: برای دامنههای عادی، Unbound درخواستها را به DNSهای معتبر جهانی (اینجا Cloudflare و Google با استفاده از DNS-over-TLS امن) ارسال میکند.
پیدا کردن IP های "تمیز" یا جایگزین:
این بخش نیازمند تحقیق و آزمون و خطا است. روشهای ممکن:
- استفاده از ابزارهای dig یا nslookup: از یک سیستم خارج از ایران یا با استفاده از یک VPN، IP واقعی یا IP های CDN مرتبط با دامنه مورد نظر را پیدا کنید.
dig a-blocked-domain.com @1.1.1.1
- جستجو در اینترنت: گاهی IP های مناسب برای دامنههای خاص در انجمنها یا منابع آنلاین به اشتراک گذاشته میشوند.
- استفاده از IP های سرویسهای CDN: برخی دامنهها روی CDN هایی مانند Cloudflare, Akamai و ... میزبانی میشوند. پیدا کردن یک IP تمیز از همان CDN که از ایران قابل دسترس باشد، میتواند راه حل باشد.
- پراکسی معکوس: میتوانید یک پراکسی معکوس (مانند Nginx) روی همین VPS یا VPS دیگری تنظیم کنید که ترافیک را برای دامنه مسدود شده دریافت و به سرور اصلی ارسال کند. سپس IP این پراکسی را در local-data قرار دهید. (این روش پیچیدهتر است).
مهم: این IP ها ممکن است تغییر کنند و لیست دامنههای مسدود شده نیز ثابت نیست. بنابراین، این سیستم نیاز به نگهداری و بهروزرسانی مداوم دارد.
۴. تنظیم فایروال:
باید پورت 53 (برای DNS) را روی فایروال سرور باز کنید (هم UDP و هم TCP). اگر از UFW استفاده میکنید:
sudo ufw allow 53/tcp sudo ufw allow 53/udp sudo ufw enable # اگر فایروال فعال نیست sudo ufw reload # برای اعمال تغییرات
۵. بررسی پیکربندی و راهاندازی سرویس:
قبل از راهاندازی، پیکربندی Unbound را بررسی کنید:
unbound-checkconf
اگر خروجی unbound-checkconf: no errors in /etc/unbound/unbound.conf (یا فایل اصلی شما) بود، یعنی مشکلی در سینتکس فایل نیست.
حالا سرویس Unbound را ریاستارت کنید و آن را فعال کنید تا پس از ریبوت سرور هم اجرا شود:
sudo systemctl restart unbound sudo systemctl enable unbound sudo systemctl status unbound # بررسی وضعیت سرویس
۶. تست سرویس DNS:
از سیستم دیگری (مثلاً کامپیوتر شخصی خودتان)، DNS سیستم خود را روی آدرس IP عمومی VPS خود تنظیم کنید. سپس با استفاده از دستور dig یا nslookup تست کنید:
- تست دامنه بازنویسی شده:
dig a-blocked-domain.com @YOUR_VPS_IP
باید IP ای که در local-data تنظیم کردید را برگرداند.
- تست دامنه عادی:
dig google.com @YOUR_VPS_IP
باید IP های واقعی گوگل را برگرداند.
- تست از داخل سرور:
dig a-blocked-domain.com @127.0.0.1 dig google.com @127.0.0.1
اگر همه چیز درست کار کند، شما با موفقیت DNS Resolver شخصی خود را راهاندازی کردهاید!
ملاحظات امنیتی مهم:
- Open Resolver: مجدداً تأکید میشود، هرگز سرور خود را به صورت یک Open Resolver رها نکنید (access-control: 0.0.0.0/0). حتماً دسترسی را به IP های مورد اعتماد خود محدود کنید.
- بهروزرسانی: سیستمعامل و نرمافزار Unbound را همیشه بهروز نگه دارید تا از آسیبپذیریهای امنیتی در امان باشید.
- لاگها: مراقب حجم لاگها باشید و اطلاعات حساس را در آنها ذخیره نکنید.
محدودیتها:
- فقط سطح DNS: این روش تنها محدودیتهای اعمال شده در سطح DNS را دور میزند. اگر دسترسی به یک IP خاص مسدود شده باشد (فیلترینگ IP) یا از طریق بازرسی عمیق بسته (DPI) محدودیت اعمال شود، این روش کارساز نخواهد بود.
- عدم رمزنگاری ترافیک: این سرویس ترافیک اینترنت شما را مانند VPN رمزنگاری نمیکند. فقط درخواستهای DNS شما به سرور خودتان میرود.
- عدم پنهانسازی IP: آدرس IP شما همچنان برای وبسایت مقصد قابل مشاهده است.
- نیاز به نگهداری: لیست دامنهها و IP های جایگزین نیاز به بررسی و بهروزرسانی دورهای دارد.
نتیجهگیری:
ساخت یک سرویس DNS شخصی روی VPS خارجی راهی قدرتمند برای کنترل بیشتر بر تجربه اینترنت و عبور از برخی محدودیتهای مبتنی بر DNS است. با استفاده از Unbound و پیکربندی دقیق local-data و access-control، میتوانید سرویسی مشابه شکن و موارد مشابه را برای استفاده شخصی یا گروهی کوچک ایجاد کنید. با این حال، به یاد داشته باشید که این روش محدودیتهای خود را دارد و نیازمند دانش فنی، نگهداری مداوم و توجه جدی به مسائل امنیتی است.
سلب مسئولیت: این راهنما صرفاً برای اهداف آموزشی ارائه شده است. مسئولیت استفاده از این روش و تبعات قانونی یا فنی آن بر عهده کاربر است.