Convert Your VPS to a DNS server

Convert Your VPS to a DNS server

SamNet Tech - Saman




۱. این راهنما چیست؟


وقتی در مرورگر آدرس "google.com" را تایپ می‌کنید، دستگاه شما باید آدرس IP آن سایت را پیدا کند. برای این کار از یک سرور DNS سوال می‌کند. این فرآیند "DNS Resolution" یا "تبدیل نام به آی‌پی" نام دارد.


معمولاً دستگاه‌ها از سرورهای DNS عمومی مثل Google (8.8.8.8) یا کلادفلر (1.1.1.1) استفاده می‌کنند. اما گاهی این سرورها در بعضی شبکه‌ها مانند نت اخوندی مسدود یا غیرقابل دسترس هستند.

این راهنما به شما یاد می‌دهد چطور VPS (سرور مجازی) خودتان را به یک سرور DNS تبدیل کنید. بعد از راه‌اندازی، هر کسی که IP سرور شما را داشته باشد می‌تواند از آن به عنوان DNS استفاده کند — دقیقاً مثل 8.8.8.8 ولی با سرور خودتان.

نرم‌افزاری که استفاده می‌کنیم "Unbound" نام دارد — یک سرور DNS رایگان، متن‌باز و امن که میلیون‌ها نفر در جهان از آن استفاده می‌کنند.



۲. پیش‌نیازها

- یک VPS با سیستم‌عامل Ubuntu 22.04 یا جدیدتر

- دسترسی root (مدیر) به سرور

- آدرس IP سرور (مثال: 107.175.134.148)

- یک برنامه SSH برای اتصال:

  ویندوز: PuTTY یا Windows Terminal یا PowerShell

  مک/لینوکس: Terminal (از قبل نصب است)



۳. مرحله ۱ — اتصال به سرور

ترمینال را باز کنید و با SSH وصل شوید:


 ssh root@YOUR_SERVER_IP

به جای YOUR_SERVER_IP آدرس IP واقعی سرورتان را بگذارید.


مثال:

 ssh root@10.0.0.1

۴. مرحله ۲ — آزادسازی پورت ۵۳


چرا؟ DNS روی پورت 53 کار می‌کند. اوبونتو یک سرویس داخلی به نام "systemd-resolved" دارد که این پورت را اشغال کرده. باید آن را متوقف کنیم تا سرور DNS ما بتواند از پورت 53 استفاده کند.

آیا این کار امن است؟ بله. ما به جای آن DNS گوگل (8.8.8.8) را قرار می‌دهیم تا خود سرور همچنان بتواند دامنه‌ها را پیدا کند.


این ۳ دستور را یکی یکی اجرا کنید:

دستور ۱ — متوقف کردن سرویس:


 systemctl stop systemd-resolved

دستور ۲ — جلوگیری از اجرای خودکار بعد از ریبوت:

 systemctl disable systemd-resolved


دستور ۳ — تنظیم DNS گوگل برای خود سرور:

 echo 'nameserver 8.8.8.8' > /etc/resolv.conf

بررسی: مطمئن شوید پورت 53 آزاد شده:

 ss -ulnp | grep ':53 '


خروجی مورد انتظار: هیچی (خالی) = پورت 53 آزاد است. اگر هنوز چیزی نشان می‌دهد، سرور را ریبوت کنید و دوباره امتحان کنید.


۵. مرحله ۳ — نصب نرم‌افزار Unbound


چرا؟ Unbound نرم‌افزار سرور DNS است. درخواست‌های DNS کاربران را دریافت می‌کند و جواب را مستقیماً از سرورهای ریشه DNS پیدا می‌کند.


این ۲ دستور را اجرا کنید:


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


 apt-get update


دستور ۲ — نصب Unbound:


 apt-get install -y unbound


بررسی: مطمئن شوید Unbound نصب شده:


 unbound -V | head -1


خروجی مورد انتظار (نسخه ممکن است متفاوت باشد):


 Version 1.13.1



۶. مرحله ۴ — نوشتن فایل تنظیمات


چرا؟ Unbound به یک فایل تنظیمات نیاز دارد که بگوید روی چه پورتی گوش بدهد، چه کسی اجازه استفاده دارد، تنظیمات امنیتی چیست و غیره. ما فایل پیش‌فرض را با نسخه بهینه خودمان جایگزین می‌کنیم.


تمام این بلوک را کپی کنید و به عنوان یک دستور پیست کنید:


cat > /etc/unbound/unbound.conf << 'EOF'

server:

  interface: 0.0.0.0

  port: 53

  access-control: 0.0.0.0/0 allow

  do-ip4: yes

  do-ip6: no

  do-udp: yes

  do-tcp: yes

  hide-identity: yes

  hide-version: yes

  harden-glue: yes

  use-caps-for-id: yes

  edns-buffer-size: 1232

  prefetch: yes

  num-threads: 2

  msg-cache-size: 16m

  rrset-cache-size: 32m

  cache-min-ttl: 300

  cache-max-ttl: 86400

  verbosity: 0


remote-control:

  control-enable: no

EOF


بعد از پیست کردن Enter بزنید. هیچ خروجی‌ای نمی‌بینید — عادی است. فایل نوشته شده.



۷. مرحله ۵ — بررسی تنظیمات


چرا؟ قبل از شروع، فایل تنظیمات را برای غلط‌های تایپی بررسی می‌کنیم.


اجرا کنید:


 unbound-checkconf


خروجی مورد انتظار:


 unbound-checkconf: no errors in /etc/unbound/unbound.conf


اگر خطا دیدید، به مرحله ۴ برگردید و تنظیمات را دوباره با دقت پیست کنید.



۸. مرحله ۶ — راه‌اندازی سرور DNS


دستور ۱ — فعال‌سازی خودکار بعد از هر ریبوت:


 systemctl enable unbound


دستور ۲ — شروع (یا ری‌استارت) Unbound:


 systemctl restart unbound


بررسی: آیا در حال اجراست؟


 systemctl is-active unbound


خروجی مورد انتظار:


 active


اگر "failed" یا "inactive" نشان داد، بخش رفع مشکلات (۱۳) را ببینید.



۹. مرحله ۷ — باز کردن فایروال


چرا؟ اگر سرور شما فایروال (UFW) دارد، ممکن است درخواست‌های DNS روی پورت 53 را مسدود کند. باید اجازه عبور بدهیم.


اجرا کنید:


 ufw allow 53/tcp

 ufw allow 53/udp


نکته: اگر خطای "command not found" یا "Status: inactive" دیدید، یعنی UFW نصب نیست یا فعال نیست — مشکلی نیست، این مرحله را رد کنید.


مهم: بعضی ارائه‌دهندگان VPS (مثل AWS، Google Cloud، Oracle Cloud) فایروال خودشان را در پنل وب دارند. اگر تست‌های خارجی بعداً کار نکرد، تنظیمات فایروال ارائه‌دهنده را بررسی کنید و مطمئن شوید پورت 53 (TCP و UDP) برای ترافیک ورودی باز است.



۱۰. مرحله ۸ — تست سرور DNS


۳ تست اجرا می‌کنیم تا مطمئن شویم همه چیز کار می‌کند.


تست ۱: تست محلی (روی خود سرور)


این دستور را روی سرور اجرا کنید:


 dig @127.0.0.1 google.com +short


خروجی مورد انتظار (آی‌پی‌ها ممکن است متفاوت باشند):


 142.251.179.138

 142.251.179.139

 142.251.179.113


اگر آی‌پی می‌بینید = DNS محلی کار می‌کند. اگر خالی است یا خطا دارد = مشکلی وجود دارد (بخش رفع مشکلات را ببینید).


تست ۲: تست خارجی (روی سرور، با IP عمومی)


این دستور را روی سرور اجرا کنید (YOUR_SERVER_IP را عوض کنید):


 dig @YOUR_SERVER_IP google.com +short


مثال:


 dig @107.175.134.148 google.com +short


خروجی مورد انتظار: همان آی‌پی‌های بالا.


تست ۳: تست از راه دور (از کامپیوتر خودتان)


یک ترمینال جدید روی کامپیوتر خودتان باز کنید (نه سرور) و اجرا کنید:


 nslookup google.com YOUR_SERVER_IP


مثال:


 nslookup google.com 10.0.0.1


خروجی مورد انتظار:


 Server: 10.0.0.1

 Address: 10.0.0.1#53

 Non-authoritative answer:

 Name: google.com

 Addresses: 142.251.179.138

    142.251.179.139


اگر آی‌پی می‌بینید = سرور DNS شما از بیرون هم کار می‌کند.


چند دامنه دیگر هم تست کنید:


 nslookup youtube.com YOUR_SERVER_IP

 nslookup telegram.org YOUR_SERVER_IP

 nslookup github.com YOUR_SERVER_IP


همه تست‌ها موفق بودند؟ تبریک! سرور DNS شما آماده است.



۱۱. نحوه استفاده برای کاربران


آدرس IP سرور را با کاربرانتان به اشتراک بگذارید. آنها باید آن را به عنوان DNS در تنظیمات دستگاهشان وارد کنند.


اندروید:

۱. به Settings > Wi-Fi بروید

۲. روی شبکه متصل خود بزنید و نگه دارید > Modify network

۳. Advanced options را باز کنید

۴. IP settings را از DHCP به Static تغییر دهید

۵. در فیلد DNS 1 بنویسید: YOUR_SERVER_IP

۶. ذخیره کنید


آیفون (iOS):

۱. به Settings > Wi-Fi بروید

۲. روی آیکون (i) کنار شبکه متصل بزنید

۳. به پایین بروید و "Configure DNS" را پیدا کنید

۴. به "Manual" تغییر دهید

۵. سرورهای DNS قبلی را حذف کنید

۶. اضافه کنید: YOUR_SERVER_IP

۷. ذخیره کنید


ویندوز:

۱. Control Panel > Network and Sharing Center > Change adapter settings

۲. روی اتصال خود راست‌کلیک > Properties

۳. دوبار کلیک روی "Internet Protocol Version 4 (TCP/IPv4)"

۴. "Use the following DNS server addresses" را انتخاب کنید

۵. Preferred DNS server: YOUR_SERVER_IP

۶. OK > OK


مک:

۱. System Settings > Network > اتصال خود > Details > DNS

۲. + بزنید و اضافه کنید: YOUR_SERVER_IP

۳. OK


لینوکس:

فایل /etc/resolv.conf را ویرایش کنید:


 echo 'nameserver YOUR_SERVER_IP' > /etc/resolv.conf



۱۲. توضیح تنظیمات (هر خط چه کار می‌کند)


server:

این بخش رفتار سرور DNS را تعریف می‌کند.


interface: 0.0.0.0

روی همه آدرس‌های شبکه گوش بده. یعنی از هر IP‌ای که درخواست برسد، قبول کن. (0.0.0.0 = همه آدرس‌های IPv4 این ماشین)


port: 53

پورت استاندارد DNS. تمام ترافیک DNS در جهان از پورت 53 استفاده می‌کند. نمی‌توانید این را تغییر دهید.


access-control: 0.0.0.0/0 allow

به همه اجازه استفاده بده. "0.0.0.0/0" یعنی "تمام آدرس‌های IP دنیا." این سرور را به یک resolver عمومی تبدیل می‌کند.


do-ip4: yes

پشتیبانی از IPv4 (پروتکل استاندارد اینترنت).


do-ip6: no

غیرفعال‌سازی IPv6. بسیاری از VPS‌های ارزان IPv6 ندارند. اگر فعال باشد بدون پشتیبانی IPv6، ممکن است Unbound شروع نشود یا خطا بدهد.


do-udp: yes

فعال‌سازی پروتکل UDP برای DNS. پروتکل اصلی درخواست‌های DNS (سریع‌تر و سبک‌تر).


do-tcp: yes

فعال‌سازی پروتکل TCP برای DNS. برای پاسخ‌های بزرگ که در یک بسته UDP جا نمی‌شوند.


hide-identity: yes

وقتی کسی "id.server" را کوئری بزند، سرور هویتش را فاش نمی‌کند.


hide-version: yes

نسخه Unbound را فاش نکن. جلوی حملاتی که از آسیب‌پذیری نسخه‌های خاص سوءاستفاده می‌کنند را می‌گیرد.


harden-glue: yes

پاسخ‌های DNS مشکوک که حاوی "glue record" خارج از دامنه مورد انتظار هستند را رد کن. از حملات cache poisoning جلوگیری می‌کند.


use-caps-for-id: yes

حروف بزرگ/کوچک را در کوئری‌ها تصادفی کن (مثلاً "GoOgLe.CoM"). جواب واقعی باید با این الگو مطابقت داشته باشد. حملات DNS spoofing را بسیار سخت‌تر می‌کند.


edns-buffer-size: 1232

حداکثر اندازه بسته UDP برای DNS. عدد 1232 مقدار امن پیشنهادی است که در اکثر شبکه‌ها بدون مشکل کار می‌کند.


prefetch: yes

وقتی یک رکورد کش‌شده نزدیک انقضاست، Unbound قبل از منقضی شدن یک کپی تازه می‌آورد. کاربران همیشه پاسخ سریع از کش دریافت می‌کنند.


num-threads: 2

تعداد thread‌های CPU. این را برابر تعداد هسته‌های CPU سرور قرار دهید. (اکثر VPS‌های ارزان ۱ یا ۲ هسته دارند.)


msg-cache-size: 16m

۱۶ مگابایت حافظه برای کش پیام‌های DNS. کش بیشتر = کوئری کمتر به سرورهای بالادست = پاسخ سریع‌تر.


rrset-cache-size: 32m

۳۲ مگابایت حافظه برای کش رکوردهای DNS. باید تقریباً ۲ برابر msg-cache-size باشد.


cache-min-ttl: 300

هر رکورد DNS را حداقل ۳۰۰ ثانیه (۵ دقیقه) کش کن، حتی اگر رکورد اصلی مدت کمتری بگوید.


cache-max-ttl: 86400

هیچ رکوردی را بیش از ۸۶۴۰۰ ثانیه (۲۴ ساعت) کش نکن. مطمئن می‌شود رکوردهای قدیمی بالاخره تازه می‌شوند.


verbosity: 0

لاگ جزئی ننویس. فضای دیسک و CPU را صرفه‌جویی می‌کند. برای عیب‌یابی روی ۱ یا ۲ بگذارید.


remote-control:

control-enable: no

رابط کنترل از راه دور Unbound را غیرفعال کن. این رابط معمولاً روی پورت 8953 برای دستورات مدیریتی گوش می‌دهد، اما سعی می‌کند روی IPv6 (::1) وصل شود که در VPS‌های بدون IPv6 خطا می‌دهد. چون نیازی به کنترل از راه دور نداریم، کلاً غیرفعالش می‌کنیم.



۱۳. رفع مشکلات رایج


مشکل ۱: Unbound شروع نمی‌شود


لاگ خطا را بررسی کنید:


 journalctl -u unbound -n 30 --no-pager


به پیام خطا نگاه کنید و با موارد زیر مطابقت دهید:


خطا: "can't bind socket: Cannot assign requested address for ::1 port 8953"

دلیل: سرور شما IPv6 ندارد.

حل: مطمئن شوید تنظیمات این بخش را دارد:

 remote-control:

   control-enable: no

سپس ری‌استارت: systemctl restart unbound


خطا: "could not open ports" یا "address already in use"

دلیل: برنامه دیگری پورت 53 را اشغال کرده.

حل: ببینید چه چیزی پورت 53 را گرفته:

 ss -ulnp | grep ':53 '

اگر "systemd-resolve" نشان می‌دهد، به مرحله ۲ برگردید.


خطا: "so-rcvbuf 1048576 was not granted"

دلیل: کرنل اندازه بافر سوکت را محدود کرده. این فقط هشدار است نه خطا. Unbound ممکن است همچنان شروع شود.


مشکل ۲: محلی کار می‌کند ولی از بیرون نه


دلیل ۱: فایروال پورت 53 را مسدود کرده.

حل: بررسی فایروال: ufw status

باز کردن پورت: ufw allow 53/tcp && ufw allow 53/udp


دلیل ۲: فایروال ارائه‌دهنده VPS پورت 53 را مسدود کرده.

حل: وارد پنل وب ارائه‌دهنده VPS شوید و تنظیمات فایروال یا security group را بررسی کنید. یک قانون برای اجازه ترافیک ورودی روی پورت 53 (TCP و UDP) اضافه کنید.


مشکل ۳: بعد از ریبوت کار نمی‌کند


دلیل: systemd-resolved ممکن است دوباره فعال شده و پورت 53 را گرفته.

حل: دستورات مرحله ۲ را دوباره اجرا کنید و سپس ری‌استارت:

 systemctl stop systemd-resolved

 systemctl disable systemd-resolved

 echo 'nameserver 8.8.8.8' > /etc/resolv.conf

 systemctl restart unbound


مشکل ۴: دستور "dig" پیدا نمی‌شود


دلیل: dig روی سرور نصب نیست.

حل: نصب کنید:

 apt-get install -y dnsutils

سپس دستورات dig را دوباره امتحان کنید.


مشکل ۵: پاسخ DNS خیلی کند است


دلیل: اولین کوئری برای هر دامنه همیشه کندتر است (Unbound باید آن را از سرورهای ریشه پیدا کند). کوئری‌های بعدی کش شده و سریع هستند.

حل: این عادی است. گزینه prefetch کمک می‌کند دامنه‌های محبوب در کش بمانند. بعد از چند دقیقه استفاده، اکثر کوئری‌ها سریع خواهند بود.



۱۴. دستور تک‌خطی


اگر قبلاً این کار را انجام داده‌اید و فقط می‌خواهید سریع راه‌اندازی کنید، با SSH به سرور وصل شوید و تمام این بلوک را پیست کنید:


systemctl stop systemd-resolved && \

systemctl disable systemd-resolved && \

echo 'nameserver 8.8.8.8' > /etc/resolv.conf && \

apt-get update -qq && \

apt-get install -y -qq unbound && \

cat > /etc/unbound/unbound.conf << 'EOF'

server:

  interface: 0.0.0.0

  port: 53

  access-control: 0.0.0.0/0 allow

  do-ip4: yes

  do-ip6: no

  do-udp: yes

  do-tcp: yes

  hide-identity: yes

  hide-version: yes

  harden-glue: yes

  use-caps-for-id: yes

  edns-buffer-size: 1232

  prefetch: yes

  num-threads: 2

  msg-cache-size: 16m

  rrset-cache-size: 32m

  cache-min-ttl: 300

  cache-max-ttl: 86400

  verbosity: 0


remote-control:

  control-enable: no

EOF

systemctl enable unbound && \

systemctl restart unbound && \

ufw allow 53/tcp 2>/dev/null; \

ufw allow 53/udp 2>/dev/null; \

sleep 1 && \

echo "=== STATUS ===" && \

systemctl is-active unbound && \

echo "=== TEST ===" && \

dig @127.0.0.1 google.com +short


خروجی مورد انتظار: "active" و سپس آدرس‌های IP = موفق.


کانال را دنبال کنید:

https://t.me/SamnetInternet


Report Page