DNS + TLS

عیب‌یابی DNS و SSL: چرا سایت باز نمی‌شود؟ چک‌لیست قدم‌به‌قدم

ترتیب درست بررسی وقتی دامنه به سرور نمی‌رسد: رکوردهای A و CNAME و TTL، اتصال به پورت، زنجیره‌ی گواهی TLS، تاریخ انقضا و ریدایرکت‌های HTTP.

«سایت باز نمی‌شود» یک نشانه است، نه یک مشکل. پشت آن می‌تواند DNS، شبکه، گواهی TLS، وب‌سرور یا خود برنامه باشد؛ و اگر ترتیب بررسی را نداشته باشید، ساعت‌ها در لایه‌ی اشتباه می‌گردید. این راهنما یک مسیر ثابت از پایین به بالا می‌دهد: اول DNS، بعد اتصال، بعد TLS و در پایان HTTP.

ترتیب درست بررسی

  1. DNS: نام دامنه به چه IP می‌رسد؟ درست است؟
  2. اتصال: پورت ۸۰/۴۴۳ آن IP از بیرون باز است؟
  3. TLS: گواهی معتبر، منقضی‌نشده و کامل است؟
  4. HTTP: کد وضعیت و ریدایرکت‌ها چیست؟
  5. برنامه: لاگ‌های وب‌سرور و برنامه چه می‌گویند؟

هر مرحله فقط وقتی معنا دارد که قبلی سالم باشد؛ مثلاً قبل از اینکه گواهی را مقصر بدانید، مطمئن شوید دامنه اصلاً به سرور درست می‌رسد.

۱. DNS: دامنه به کجا اشاره می‌کند؟

dig +short A example.com
dig +short AAAA example.com
dig +short NS example.com
dig +short CNAME www.example.com

# از یک resolver مشخص (ببینید مشکل محلی است یا عمومی)
dig @1.1.1.1 +short A example.com

اگر dig در دسترس نیست، nslookup example.com هم همین کار را می‌کند؛ یا از ابزار آنلاین برای دیدن همه‌ی رکوردها و TTL استفاده کنید.

DNSDNS Lookupرکوردهای A، AAAA، MX، TXT، NS، CNAME، SOA و CAA را همراه با TTL ببینید.

چیزهایی که باید دنبالشان باشید

  • IP اشتباه: رکورد A به سرور قدیمی اشاره می‌کند؟ (بعد از مهاجرت رایج است.)
  • AAAA فراموش‌شده: اگر رکورد IPv6 دارید ولی سرور روی IPv6 گوش نمی‌دهد، بعضی کاربران (آن‌ها که IPv6 دارند) خطا می‌گیرند و بقیه نه؛ از دلایل رایج مشکل «فقط برای بعضی کاربران کار نمی‌کند» است.
  • TTL بالا: تغییر رکورد تا پایان TTL دیده نمی‌شود. پیش از مهاجرت TTL را کم کنید.
  • NS ناهمخوان: اگر دامنه را از ثبت‌کننده به سرویس DNS دیگری منتقل کرده‌اید، مطمئن شوید NSهای ثبت‌کننده و NSهای آن سرویس یکی است.
  • CNAME روی دامنه‌ی ریشه (apex): مجاز نیست و باعث خرابی رکوردهای دیگر (مثل MX) می‌شود.
  • رکورد TXT برای ایمیل: SPF، DKIM و DMARC همگی در TXT هستند و یک خطای تایپی می‌تواند ایمیل‌ها را به اسپم بفرستد.

۲. اتصال: آیا به پورت می‌رسیم؟

nc -zv 203.0.113.10 443
curl -v --connect-timeout 5 https://example.com -o /dev/null

اگر اتصال برقرار نمی‌شود: فایروال میزبان (ufw، firewalld)، گروه امنیتی ابر، یا اینکه سرویس اصلاً روی 0.0.0.0 گوش نمی‌دهد. با ss -ltnp روی خود سرور ببینید کدام پورت‌ها باز و روی کدام آدرس‌اند.

۳. TLS: گواهی سالم است؟

از سمت کلاینت، همه‌چیز را یک‌جا با openssl می‌توان دید:

openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

پرچم -servername را فراموش نکنید؛ سرورهایی که چند دامنه دارند بر اساس SNI گواهی را انتخاب می‌کنند و بدون آن گواهی پیش‌فرض را می‌دهند که معمولاً با دامنه‌ی شما نمی‌خواند. ابزار آنلاین همین اطلاعات را همراه با کل زنجیره نشان می‌دهد:

SSLSSL Certificate Checkerانقضا، صادرکننده، SAN و کامل‌بودن زنجیره را بدون خط فرمان ببینید.

خطاهای رایج مرورگر و علت واقعی‌شان

پیامعلت معمول
NET::ERR_CERT_DATE_INVALIDگواهی منقضی شده، یا ساعت دستگاه کاربر اشتباه است
NET::ERR_CERT_COMMON_NAME_INVALIDنام دامنه در SAN گواهی نیست (مثلاً گواهی بدون www)
NET::ERR_CERT_AUTHORITY_INVALIDگواهی خودامضا یا زنجیره‌ی میانی ارسال نشده
ERR_SSL_PROTOCOL_ERRORسرور TLS را درست پیکربندی نکرده یا روی آن پورت اصلاً TLS نیست
ERR_TOO_MANY_REDIRECTSحلقه‌ی ریدایرکت (اغلب بین HTTP و HTTPS پشت یک پروکسی)
DNS_PROBE_FINISHED_NXDOMAINدامنه رکورد ندارد یا هنوز منتشر نشده
tip اگر گواهی در مرورگر دسکتاپ سالم است ولی در curl، یک اپلیکیشن موبایل یا یک سرویس دیگر خطا می‌دهد، تقریباً مطمئن باشید زنجیره‌ی میانی (intermediate) ناقص است. مرورگرها گاهی گواهی میانی را خودشان پیدا و کش می‌کنند؛ کلاینت‌های دیگر نه. فایل fullchain.pem را به‌جای فقط گواهی دامنه به وب‌سرور بدهید.

۴. HTTP: کد وضعیت و ریدایرکت‌ها

curl -sIL https://example.com | grep -iE '^(HTTP|location|server|strict-transport|cache-control)'

پرچم -L ریدایرکت‌ها را دنبال می‌کند و می‌توانید زنجیره را ببینید. چند الگوی پرتکرار:

  • ۳۰۱ به خودش: معمولاً «ریدایرکت به HTTPS» در برنامه و در پروکسی هم‌زمان فعال است و یکدیگر را خنثی می‌کنند. هدر X-Forwarded-Proto را بررسی کنید.
  • ۵۰۲/۵۰۴: وب‌سرور سالم است ولی برنامه‌ی پشتش نه؛ لاگ Nginx یا برنامه را ببینید.
  • ۴۰۳ فقط برای بعضی کاربران: محدودیت جغرافیایی، WAF یا فایروال CDN.
  • پاسخ کهنه: هدر Cache-Control و Age را ببینید؛ شاید CDN نسخه‌ی قبلی را نگه داشته است.
HTTPHTTP Headers Viewerکد وضعیت، مسیر کامل ریدایرکت و تمام هدرهای پاسخ را ببینید.

چک‌لیست یک‌صفحه‌ای

  1. dig +short A دامنه به IP درست می‌رسد؟ (و AAAA هم درست است یا وجود ندارد؟)
  2. NS دامنه نزد ثبت‌کننده با سرویس DNS شما یکی است؟
  3. پورت ۴۴۳ از بیرون باز است؟
  4. گواهی منقضی نشده، SAN شامل دامنه است و زنجیره کامل است؟
  5. ریدایرکت‌ها حلقه نمی‌سازند و کد نهایی ۲۰۰ است؟
  6. لاگ وب‌سرور و برنامه خطایی دارند؟

اگر پشت Nginx هستید، راهنمای پیکربندی Nginx به‌عنوان Reverse Proxy بخش مفصل‌تری درباره‌ی ۵۰۲ و ۵۰۴ دارد.

جمع‌بندی

ترتیب ثابت DNS، اتصال، TLS و HTTP از بررسی‌های تکراری و اتلاف وقت جلوگیری می‌کند. بعد از رفع مشکل، با مانیتورینگ (برای مثال بررسی انقضای گواهی و پاسخ‌گویی HTTP) از تکرار آن جلوگیری کنید؛ هشداردهی اصولی نشان می‌دهد کدام هشدارها ارزش دارند. اگر شبکه‌ی داخلی را طراحی می‌کنید، راهنمای CIDR و زیرشبکه‌بندی را هم ببینید.

پرسش‌های متداول

چرا بعد از تغییر رکورد DNS هنوز آدرس قدیمی را می‌بینم؟
resolverها پاسخ را تا پایان TTL نگه می‌دارند. اگر TTL رکورد قبلی ۸۶۴۰۰ ثانیه (یک روز) بوده، ممکن است تا یک روز طول بکشد. بهترین کار این است که چند ساعت قبل از مهاجرت، TTL را کم (مثلاً ۳۰۰ ثانیه) کنید.
فرق A و CNAME چیست و چرا روی دامنه‌ی ریشه CNAME نمی‌گذارند؟
A یک نام را به IP می‌رساند و CNAME یک نام را به نام دیگری ارجاع می‌دهد. طبق استاندارد، روی نامی که رکوردهای دیگر (SOA و NS) دارد نمی‌توان CNAME گذاشت؛ دامنه‌ی ریشه همیشه این رکوردها را دارد. بعضی ارائه‌دهندگان راه‌حل اختصاصی (ALIAS/ANAME) دارند.
چرا مرورگر می‌گوید گواهی معتبر نیست ولی تاریخش درست است؟
معمولاً زنجیره‌ی گواهی ناقص است (گواهی میانی ارسال نمی‌شود)، نام دامنه در SAN نیست، یا گواهی برای دامنه‌ی دیگری (مثلاً بدون www) صادر شده است.
هر چند وقت یک‌بار باید گواهی را تمدید کرد؟
گواهی‌های Let’s Encrypt ۹۰ روزه‌اند و تمدید خودکار حدود ۳۰ روز مانده به انقضا رایج است. مهم‌تر از تمدید، پایش آن است: هشدار بگذارید که ۲۱ روز مانده به انقضا اگر هنوز تمدید نشده بود به شما خبر بدهد.