حل قطعی خطای Let’s Encrypt با تنظیم صحیح BIND و DNS
اگر سرور شما داخل ایران است، احتمالاً با مشکلات متعدد در تمدید یا صدور گواهی Let’s Encrypt در DirectAdmin روبهرو شدهاید.
در بسیاری از موارد، با خطایی شبیه به این مواجه میشوید:
text
lookup acme-v02.api.letsencrypt.org on 8.8.8.8:53: i/o timeout
یا:
text
Could not create client: dial tcp: lookup ... i/o timeout
این خطا معمولاً به اشتباه به «قطع اینترنت ایران» یا «مشکل در Let’s Encrypt» نسبت داده میشود، اما ریشهٔ اصلی آن در اکثر سرورهای ایران، تنظیمات نادرست BIND و DNS داخلی است.
در این مقاله، دقیقاً توضیح میدهم مشکل از کجاست و چطور در کمتر از ۵ دقیقه آن را برای همیشه حل کنید.
مشکل از کجاست؟
در سرورهای DirectAdmin، سرویس BIND (یا همان named) معمولاً به صورت DNS Authoritative نصب میشود.
اما DirectAdmin برای ارتباط با Let’s Encrypt، نیاز دارد که خودش بتواند DNS دامنههای خارجی را resolve کند.
مشکل اینجاست:
BIND روی سرورهای ایران معمولاً اینگونه تنظیم شده:
recursion غیرفعال →سرور قادر به resolve کردن دامنههای خارجی نیست.
forwarder تعریف نشده →درخواستها به هیچ DNS خارجی ارسال نمیشوند.
DNSSEC فعال است →در بسیاری از مسیرهای اینترنت ایران، DNSSEC fail میشود و نتیجه میشود: SERVFAIL.
بنابراین DirectAdmin وقتی میخواهد دامنهٔ Let’s Encrypt را resolve کند، با خطا روبهرو میشود.
علائم واضح مشکل
اگر این دستور را بزنید:
text
dig acme-v02.api.letsencrypt.org @127.0.0.1
معمولاً خروجی شبیه زیر است:
text
status: SERVFAIL
این یعنی BIND نمیتواند دامنهٔ Let’s Encrypt را resolve کند، و کل پروسهٔ صدور SSL شکست میخورد.
راهحل قطعی (بدون دردسر)
با سه تغییر کوچک در فایل named.conf مشکل کاملاً حل میشود.
مرحله ۱: فعال کردن recursion
فایل را باز کنید:
text
nano /etc/named.conf
این خط را پیدا کنید:
text
recursion no;
و به این تغییر دهید:
text
recursion yes;
مرحله ۲: تعریف forwarders مناسب برای ایران
در بلوک options این بخش را اضافه کنید:
text
forwarders {
178.22.122.100; // Shecan
185.51.200.2; // Shecan
};
(یا Cloudflare اگر ارتباطتان خوب است)
text
forwarders {
1.1.1.1;
1.0.0.1;
};
مرحله ۳: غیرفعال کردن DNSSEC validation
در ایران، مسیرهای بینالمللی باعث شکست DNSSEC میشوند.
این خط را:
text
dnssec-validation yes;
به این تغییر دهید:
text
dnssec-validation no;
این تغییر مهمترین بخش حل مشکل است.
فایل کامل تنظیمشده (نسخه پیشنهادی)
این نسخه تستشده و کاملاً سازگار با سرورهای داخل ایران است:
text
options {
allow-transfer { none; };
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory "/var/named";
allow-query { any; };
recursion yes;
allow-recursion { localhost; localnets; };
forwarders {
178.22.122.100;
185.51.200.2;
};
dnssec-enable yes;
dnssec-validation no;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
include "/etc/crypto-policies/back-ends/bind.config";
};
مرحله ۴: ریاستارت سرویس
text
systemctl restart named
مرحله ۵: تست نهایی
دوباره تست کنید:
text
dig acme-v02.api.letsencrypt.org @127.0.0.1
اگر خروجی شبیه این باشد:
text
status: NOERROR
A 172.65.32.248
یعنی BIND اکنون درست عمل میکند و DirectAdmin میتواند SSL را صادر یا تمدید کند.
پس از انجام این مراحل
به DirectAdmin بروید:
User Level → SSL Certificates → Free & automatic certificate from Let's Encrypt
و درخواست را دوباره ارسال کنید.
این بار:
✔ گواهی بدون خطا صادر میشود
✔ تمدید خودکار هم کاملاً پایدار میشود
✔ wildcard هم بدون مشکل کار میکند
نتیجهگیری
مشکل صدور SSL روی سرورهای ایران تقریباً همیشه به دلیل:
recursion غیرفعال
نبود forwarder
و خرابی DNSSEC در مسیرهای بینالملل
است.
با فقط سه خط تغییر، سرویس DNS سرور شما درست کار میکند و DirectAdmin بدون خطا SSL صادر میکند.