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 = موفق.
کانال را دنبال کنید: