هاست و سرور

تشخیص خطای Connection timed out: شبکه یا سرور؟

خطای connection timed out می‌تواند از فایروال، DNS یا خود سرور باشد. با ترتیب درست ping، traceroute و تست پورت، منبع قطعی را پیدا کنید.

هاست و سرور

سایت بالا نمی‌آید و مرورگر بعد از چند ثانیه می‌گوید ERR_CONNECTION_TIMED_OUT. یا SSH می‌زنید و بعد از مدتی انتظار، پیام ssh: connect to host x.x.x.x port 22: Connection timed out را می‌بینید. این خطا با «Connection refused» فرق دارد و همین تفاوت، کل مسیر عیب‌یابی را تعیین می‌کند. در refused، سرور مقصد پاسخ می‌دهد و می‌گوید این پورت باز نیست؛ یعنی بسته به مقصد رسیده. در timed out، هیچ پاسخی برنمی‌گردد و شما نمی‌دانید بسته کجا گم شده. پس اولین کار، پیدا کردن نقطه گم شدن است، نه تغییر کانفیگ سرور.

ترتیب درست تست: از لایه پایین به بالا

اکثر مدیرها مستقیم می‌روند سراغ ری‌استارت سرویس یا بررسی لاگ‌ها. این کار وقت تلف کردن است وقتی هنوز نمی‌دانید مشکل در مسیر شبکه است یا روی خود ماشین. ترتیب زیر را رعایت کنید؛ هر مرحله فقط وقتی معنا دارد که مرحله قبلی جواب داده باشد.

  1. حل نام دامنه (DNS) درست انجام می‌شود؟
  2. آیا بسته تا مقصد می‌رسد؟ (ping و traceroute)
  3. آیا پورت مشخص باز است؟ (nc یا telnet)
  4. آیا سرویس روی آن پورت گوش می‌دهد؟ (ss و لاگ سرویس)
  5. آیا فایروال یا میزبان مجازی جلوی درخواست را گرفته؟

مرحله اول: DNS را قبل از هر چیز چک کنید

اگر نام دامنه به IP اشتباه resolve شود، همه تست‌های بعدی بی‌معنی‌اند. اول ببینید چه IP برمی‌گردد:

dig +short example.com A
dig +short example.com AAAA

اگر IP برگشتی با IP واقعی سرور شما فرق دارد، مشکل شبکه نیست؛ مشکل رکورد DNS است. رکورد A باید دقیقاً به IP سرور اشاره کند و اگر IPv6 فعال نیست، رکورد AAAA را حذف کنید. یک AAAA اشتباه باعث می‌شود مرورگر اول سراغ IPv6 برود، پاسخی نگیرد و بعد از timeout به IPv4 برگردد. برای بررسی رکوردها و انتشار DNS از ابزار بررسی DNS و شبکه استفاده کنید.

مرحله دوم: ping و traceroute چه چیزی را ثابت می‌کنند

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

ping -c 4 185.10.20.30
traceroute -T -p 443 example.com
mtr -rwzc 20 example.com

در traceroute، جایی که ستاره‌ها شروع می‌شوند مهم است. اگر تا هاپ آخر ستاره می‌بینید و بعد از آن هیچ، احتمالاً فایروال مقصد ICMP را drop می‌کند. اگر وسط مسیر ستاره می‌شود و بعد ادامه پیدا می‌کند، آن روتر فقط به ICMP جواب نمی‌دهد و مشکلی نیست. mtr بهتر از traceroute است چون در طول زمان packet loss را نشان می‌دهد؛ loss پایدار روی یک هاپ میانی معمولاً یعنی مشکل واقعی در مسیر.

مرحله سوم: تست پورت، جایی که اکثر تشخیص‌ها اشتباه می‌شود

اینجا نقطه‌ای است که باید بین ICMP و TCP فرق بگذارید. فایروال می‌تواند ICMP را باز بگذارد ولی پورت 443 را ببندد. برعکسش هم ممکن است. پس تست پورت را جدا انجام دهید:

nc -vz -w 5 example.com 443
nc -vz -w 5 example.com 22
curl -v --connect-timeout 5 https://example.com

اگر nc روی پورت 443 هم timeout می‌دهد ولی پورت 22 باز است، مشکل تقریباً قطعاً فایروال یا Security Group است، نه سرویس وب. اگر هر دو پورت timeout می‌دهند ولی ping جواب می‌دهد، یک قانون drop در فایروال یا ACL بالادست دارید. اگر هر دو پورت refused می‌دهند، فایروال باز است و سرویس گوش نمی‌دهد؛ اینجا مشکل داخلی سرور است.

این‌جا اشتباه می‌کنند

رایج‌ترین اشتباهی که دیده‌ام: مدیر پورت را در فایروال سرور باز می‌کند، ufw status هم می‌گوید allow، ولی همچنان timeout می‌گیرد. علتش این است که فایروال بالادست (Security Group ابری یا ACL دیتاسنتر) هنوز بسته است و ترافیک اصلاً به ماشین نمی‌رسد. نشانه‌اش این است که در tcpdump روی سرور هیچ بسته‌ای برای آن پورت نمی‌بینید. اگر بسته‌ای نمی‌رسد، هر تغییری در کانفیگ داخل سرور بی‌فایده است.

tcpdump -ni eth0 'tcp port 443 and tcp[tcpflags] & tcp-syn != 0'

اگر این دستور خروجی خالی بدهد در حالی که از بیرون درخواست می‌فرستید، ترافیک قبل از رسیدن به سرور drop شده. برعکس، اگر SYN می‌بینید ولی SYN-ACK برنمی‌گردد، مشکل داخل ماشین است: یا سرویس گوش نمی‌دهد یا فایروال محلی drop می‌کند.

مرحله چهارم: آیا سرویس واقعاً روی پورت گوش می‌دهد

ss -tlnp | grep -E ':80|:443'
systemctl status nginx
journalctl -u nginx --since "10 min ago"

به ستون Local Address دقت کنید. اگر 127.0.0.1:443 نوشته شده باشد، سرویس فقط روی loopback گوش می‌دهد و از بیرون قابل دسترسی نیست. باید 0.0.0.0:443 یا [::]:443 باشد. این مورد را زیاد می‌بینم روی کانفیگ‌هایی که بعد از نصب مجدد یا تغییر فایل nginx.conf پیش می‌آید.

مقایسه علائم: کدام تست چه چیزی را رد می‌کند

علامتاحتمال اصلیقدم بعدی
ping جواب می‌دهد، پورت timeoutفایروال یا ACL بالادستبررسی Security Group و tcpdump
ping جواب نمی‌دهد، پورت باز استICMP بسته است، مشکلی نیستتست پورت را جدی بگیرید
هر دو پورت refusedسرویس بالا نیستsystemctl و لاگ سرویس
DNS به IP اشتباه می‌رودرکورد A یا AAAA غلطاصلاح رکورد و انتظار TTL
فقط از یک شبکه timeoutمسیر یا فیلتر سمت کاربرتست از شبکه دیگر با mtr

وقتی مشکل از سمت شما نیست

اگر تست‌ها نشان می‌دهد ترافیک به سرور می‌رسد، سرویس گوش می‌دهد و فایروال هم باز است، ولی همچنان از بیرون timeout می‌گیرید، مسئله در مسیر بین‌الملل یا فیلتر سمت مقصد است. اینجا تغییر کانفیگ سرور هیچ کمکی نمی‌کند. تست را از چند نقطه جغرافیایی مختلف انجام دهید و نتیجه را به پشتیبانی ارائه‌دهنده زیرساخت بدهید؛ خروجی mtr با ذکر هاپ دقیق، بیشترین کمک را می‌کند.

یک نکته درباره هزینه: باز گذاشتن پورت برای تست از همه IPها راحت‌ترین راه است، ولی موقتی باید باشد. اگر پورت مدیریتی مثل 22 یا 3306 را برای عیب‌یابی به 0.0.0.0/0 باز کنید و فراموش کنید ببندید، در لاگ احراز هویت هجوم خودکار می‌بینید. برای تست، IP خودتان را با ماسک /32 محدود کنید.

اگر سرور شما روی یک هاست لینوکس مدیریت‌شده اجرا می‌شود، بخشی از این مسیر (فایروال بالادست و ACL) در کنترل شما نیست و باید از پشتیبانی بخواهید وضعیت پورت را از بیرون تأیید کند. روی سرور اختصاصی معمولاً دسترسی کامل‌تری به این لایه‌ها دارید و می‌توانید خودتان tcpdump بگیرید.

پرسش‌های پرتکرار

تفاوت Connection timed out و Connection refused چیست؟

در refused، سرور مقصد فعالانه پاسخ می‌دهد که این پورت بسته است؛ یعنی بسته به مقصد رسیده و مشکل داخلی است. در timed out هیچ پاسخی نمی‌آید و بسته در مسیر یا روی فایروال drop شده. این تفاوت تعیین می‌کند که سراغ سرویس بروید یا سراغ شبکه.

چرا ping جواب می‌دهد ولی سایت باز نمی‌شود؟

چون ping از پروتکل ICMP استفاده می‌کند و سایت از TCP روی پورت 443. فایروال می‌تواند ICMP را باز و پورت 443 را بسته نگه دارد. پس ping موفق فقط می‌گوید مسیر شبکه تا مقصد باز است، نه اینکه سرویس وب در دسترس است.

چطور بفهمم فایروال سرور مقصر است یا فایروال بالادست؟

روی سرور tcpdump بگیرید و همزمان از بیرون درخواست بفرستید. اگر هیچ بسته SYN نرسید، فایروال بالادست ترافیک را drop کرده. اگر SYN رسید ولی SYN-ACK برنگشت، فایروال محلی یا سرویس مشکل دارد.

آیا رکورد AAAA می‌تواند باعث timeout شود؟

بله. اگر رکورد AAAA وجود داشته باشد ولی سرور روی IPv6 گوش ندهد، مرورگر اول سراغ IPv6 می‌رود، پاسخی نمی‌گیرد و بعد از timeout به IPv4 برمی‌گردد. اگر IPv6 راه‌اندازی نکرده‌اید، رکورد AAAA را حذف کنید.

قدم بعدی مشخص است: اول dig بزنید، بعد mtr، بعد nc روی پورت. تا وقتی این سه جواب نداده‌اند، دست به کانفیگ سرور نزنید.

پشتیبانی سرورنت

تیم فنی و تحریریه‌ی سرورنت — تخصص در زیرساخت، شبکه و میزبانی وب.

هاست لینوکس
اشتراک‌گذاری:

دیدگاه‌ها ۰

هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!

دیدگاه خود را بنویسید

سرویس مرتبط

هاست لینوکس

میزبانی PHP و MySQL روی NVMe RAID-10 با LiteSpeed — پایه‌ی مطمئن هر وب‌سایتی، از وبلاگ شخصی تا پروژه‌های لاراول سازمانی. با قیمتی که رقبا توضیحی برایش ندارند.