DNS یکی از مهمترین بخشهای ارتباط شبکه در لینوکس است و وظیفه تبدیل نام دامنههایی مانند google.com به آدرس IP را بر عهده دارد.
گاهی اوقات DNS پیشفرض سرور با اختلال، سرعت پایین یا مشکل در Resolve دامنهها مواجه میشود. در چنین شرایطی تغییر DNS میتواند مشکلاتی مانند خطای دانلود پکیجها، عدم دسترسی به Repositoryها یا باز نشدن برخی دامنهها را برطرف کند.
در این آموزش روشهای تغییر DNS در Ubuntu، Debian، AlmaLinux، Rocky Linux و CentOS را بررسی میکنیم.
بررسی DNS فعلی سرور
قبل از تغییر تنظیمات بهتر است DNS فعلی سرور را بررسی کنید.
دستور زیر را اجرا کنید:
cat /etc/resolv.conf
ممکن است خروجی مشابه زیر مشاهده کنید:
nameserver 8.8.8.8
nameserver 1.1.1.1
همچنین اگر سیستم شما از systemd-resolved استفاده میکند، میتوانید دستور زیر را اجرا کنید:
resolvectl status
این دستور DNSهای فعال برای هر Interface شبکه را نمایش میدهد.
روش اول: تغییر DNS از طریق resolv.conf
یکی از سادهترین روشها، ویرایش فایل زیر است:
nano /etc/resolv.conf
سپس DNSهای موردنظر را وارد کنید.
برای مثال:
nameserver 1.1.1.1
nameserver 8.8.8.8
فایل را ذخیره کنید.
حالا میتوانید عملکرد DNS را تست کنید:
ping google.com
یا:
nslookup google.com
نکته مهم درباره resolv.conf
در برخی توزیعهای جدید لینوکس، فایل /etc/resolv.conf توسط NetworkManager یا systemd-resolved مدیریت میشود.
در نتیجه ممکن است پس از Reboot یا Restart شدن شبکه، تغییرات دستی این فایل از بین بروند.
بنابراین برای تنظیم دائمی DNS بهتر است از روشهای بعدی استفاده کنید.
روش دوم: تغییر DNS در Ubuntu و Debian با systemd-resolved
در بسیاری از نسخههای Ubuntu از systemd-resolved برای مدیریت DNS استفاده میشود.
ابتدا فایل تنظیمات را باز کنید:
nano /etc/systemd/resolved.conf
بخش زیر را پیدا کنید:
[Resolve]
سپس DNSهای موردنظر را تنظیم کنید:
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
فایل را ذخیره کرده و سرویس را Restart کنید:
systemctl restart systemd-resolved
سپس وضعیت را بررسی کنید:
resolvectl status
در سیستمهایی که systemd-resolved مدیریت DNS را انجام میدهد، بهتر است DNS از طریق همین سرویس یا ابزار مدیریت شبکه تنظیم شود و صرفاً فایل /etc/resolv.conf بهصورت دستی ویرایش نشود.
روش سوم: تغییر DNS با NetworkManager
در AlmaLinux، Rocky Linux، CentOS و بسیاری از توزیعهای جدید، NetworkManager مسئول تنظیم شبکه است.
ابتدا لیست Connectionها را مشاهده کنید:
nmcli connection show
خروجی ممکن است مشابه زیر باشد:
NAME UUID TYPE DEVICE
System xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ethernet eth0
نام Connection را پیدا کنید.
برای مثال اگر نام Connection برابر System eth0 باشد، دستور زیر را اجرا کنید:
nmcli connection modify "System eth0" ipv4.dns "1.1.1.1 8.8.8.8"
برای جلوگیری از دریافت DNS از DHCP میتوانید دستور زیر را نیز اجرا کنید:
nmcli connection modify "System eth0" ipv4.ignore-auto-dns yes
سپس Connection را مجدداً فعال کنید:
nmcli connection down "System eth0"
nmcli connection up "System eth0"
NetworkManager بهصورت رسمی قابلیت تنظیم DNS از طریق گزینه ipv4.dns را پشتیبانی میکند.
توجه: اگر از طریق SSH به سرور متصل هستید، اجرای
connection downممکن است ارتباط شما را موقتاً قطع کند. در سرورهای Production بهتر است قبل از اعمال تغییرات، دسترسی Console داشته باشید.
مشاهده نام Connection فعال
اگر نام Connection را نمیدانید، دستور زیر را اجرا کنید:
nmcli connection show --active
برای مشاهده Interfaceها نیز میتوانید از دستور زیر استفاده کنید:
ip a
یا:
nmcli device status
تنظیم DNS گوگل
برای استفاده از DNS عمومی Google میتوانید مقادیر زیر را تنظیم کنید:
8.8.8.8
8.8.4.4
در NetworkManager:
nmcli connection modify "CONNECTION_NAME" ipv4.dns "8.8.8.8 8.8.4.4"
تنظیم DNS کلادفلر
DNS عمومی Cloudflare:
1.1.1.1
1.0.0.1
برای تنظیم آن:
nmcli connection modify "CONNECTION_NAME" ipv4.dns "1.1.1.1 1.0.0.1"
استفاده همزمان از چند DNS
میتوانید بیش از یک DNS برای سرور مشخص کنید.
برای مثال:
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 9.9.9.9
یا در NetworkManager:
nmcli connection modify "CONNECTION_NAME" ipv4.dns "1.1.1.1 8.8.8.8 9.9.9.9"
تست DNS پس از تغییر
بعد از اعمال تنظیمات، ابتدا دستور زیر را اجرا کنید:
cat /etc/resolv.conf
سپس:
ping google.com
اگر دامنه به IP تبدیل شد، DNS در حال کار است.
برای بررسی دقیقتر میتوانید dig را نصب کنید.
در AlmaLinux:
dnf install bind-utils -y
در Ubuntu و Debian:
apt install dnsutils -y
سپس:
dig google.com
در خروجی میتوانید DNS Server مورد استفاده و IP دریافتشده برای دامنه را مشاهده کنید.
پاک کردن Cache DNS
اگر DNS را تغییر دادهاید اما همچنان پاسخ قبلی دریافت میکنید، ممکن است Cache DNS نیاز به پاک شدن داشته باشد.
در سیستمهایی که از systemd-resolved استفاده میکنند:
resolvectl flush-caches
سپس میتوانید سرویس را Restart کنید:
systemctl restart systemd-resolved
رفع خطای Temporary failure in name resolution
یکی از خطاهای متداول سرورهای لینوکسی عبارت زیر است:
Temporary failure in name resolution
اگر این خطا را مشاهده کردید ابتدا اتصال اینترنت را با IP تست کنید:
ping 8.8.8.8
اگر IP پاسخ میدهد ولی دستور زیر پاسخ نمیدهد:
ping google.com
به احتمال زیاد مشکل مربوط به DNS است.
در این شرایط تنظیم یک DNS سالم میتواند مشکل را برطرف کند.
بررسی مشکل DNS یا اینترنت
برای تشخیص سریع میتوانید دو تست انجام دهید.
ابتدا:
ping 1.1.1.1
سپس:
ping google.com
اگر تست اول موفق و تست دوم ناموفق باشد، معمولاً اتصال شبکه برقرار است اما Name Resolution مشکل دارد.
بازگرداندن DNS خودکار در NetworkManager
اگر قبلاً DNS دستی تنظیم کردهاید و میخواهید مجدداً DNS را از DHCP دریافت کنید، ابتدا DNS دستی را حذف کنید:
nmcli connection modify "CONNECTION_NAME" ipv4.dns ""
سپس دریافت DNS خودکار را فعال کنید:
nmcli connection modify "CONNECTION_NAME" ipv4.ignore-auto-dns no
در نهایت Connection را مجدداً فعال کنید.
کدام روش بهتر است؟
روش مناسب به نحوه مدیریت شبکه در سیستمعامل شما بستگی دارد.
در Ubuntuهای جدید معمولاً systemd-resolved یا ابزار مدیریت شبکه سیستم گزینه مناسبی است.
در AlmaLinux، Rocky Linux و CentOSهای جدید معمولاً NetworkManager و دستور nmcli انتخاب مناسبتری هستند.
ویرایش مستقیم /etc/resolv.conf بیشتر برای تست موقت یا سیستمهایی مناسب است که این فایل توسط سرویس دیگری بازنویسی نمیشود.
جمعبندی
برای تغییر DNS در لینوکس ابتدا مشخص کنید شبکه سرور توسط چه سرویسی مدیریت میشود.
برای تغییر سریع و موقت میتوانید فایل زیر را بررسی کنید:
/etc/resolv.conf
اما برای تنظیم دائمی در سرورهایی که از NetworkManager استفاده میکنند، معمولاً میتوانید از دستور زیر استفاده کنید:
nmcli connection modify "CONNECTION_NAME" ipv4.dns "1.1.1.1 8.8.8.8"
و در سیستمهای مبتنی بر systemd-resolved نیز تنظیم DNS از طریق خود این سرویس روش مناسبتری خواهد بود.
در پایان با دستورهایی مانند ping، dig و resolvectl status عملکرد DNS را بررسی کنید.
