رفع مشکل

رفع خطای 403 و Timeout در docker pull و apt update روی سرور ایران

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۵ دقیقه

403Timeoutdockerرفع مشکلرفع خطای 403 و Timeoutدر docker pull و aptupdate روی سرور ایرانمجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

خطای 403 در docker pull و apt update روی سرورهای ایران معمولاً به‌خاطر مسدود شدن آی‌پی‌های ایران توسط سرویس‌دهندهٔ خارجی (تحریم) یا اختلال مسیر بین‌الملل است. راه‌حل: استفاده از میرورهای داخلی برای apt (مثل mirror.arvancloud.ir یا mirror.iranserver.com) و تنظیم registry-mirrors در داکر. اگر میرور داخلی کافی نبود، ایمیج را روی سرور خارج بسازید و منتقل کنید.

آخرین بررسی در دسترس بودن میرورها: ۱۱ آبان ۱۴۰۵. میرورها توسط شرکت‌ها و دانشگاه‌های مختلف ارائه می‌شوند و ممکن است تغییر کنند؛ پیش از استفادهٔ دائمی، از سالم بودن و به‌روز بودن آن‌ها مطمئن شوید.

علت خطا

  • تحریم سمت سرویس‌دهنده: Docker Hub و برخی مخازن، درخواست‌های آی‌پی ایران را با 403 پاسخ می‌دهند.
  • اختلال اینترنت بین‌الملل: در زمان اختلال، اتصال به مخازن خارجی کند یا قطع می‌شود (Timeout).
  • DNS: گاهی DNS پیش‌فرض نام مخازن را درست برنمی‌گرداند.

بعضی کاربران برای رفع 403 از DNS ضد تحریم استفاده می‌کنند؛ تفاوت آن با میرور داخلی و روش موقت و قابل برگشت تنظیمش روی سرور در DNS شکن چیست آمده است.

درخواستجایگزینسرور ایرانمخزن رسمیپاسخ 403میرور داخلیهمان بسته‌هادرخواستجایگزینسرور ایرانمخزن رسمیپاسخ 403میرور داخلیهمان بسته‌ها
شکل ۱ برخی مخزن‌ها درخواست آی‌پی ایران را با 403 رد می‌کنند؛ میرور، همان بسته‌ها را از مسیر دیگری می‌رساند.

تنظیم میرور apt در Ubuntu 24.04

در Ubuntu 24.04 منابع در فایل /etc/apt/sources.list.d/ubuntu.sources هستند. ابتدا بکاپ بگیرید:

sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
sudo sed -i 's|http://[a-z.]*archive.ubuntu.com/ubuntu|https://mirror.arvancloud.ir/ubuntu|g; s|http://security.ubuntu.com/ubuntu|https://mirror.arvancloud.ir/ubuntu|g' /etc/apt/sources.list.d/ubuntu.sources
sudo apt update

تنظیم میرور apt در Ubuntu 22.04 و قدیمی‌تر

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's|http://[a-z.]*archive.ubuntu.com/ubuntu|https://mirror.arvancloud.ir/ubuntu|g; s|http://security.ubuntu.com/ubuntu|https://mirror.arvancloud.ir/ubuntu|g' /etc/apt/sources.list
sudo apt update

میرورهای جایگزین Ubuntu: https://mirror.iranserver.com/ubuntu و https://repo.iut.ac.ir/repo/ubuntu (دانشگاه صنعتی اصفهان).

میرور apt در Debian 12

در فایل /etc/apt/sources.list (یا /etc/apt/sources.list.d/debian.sources) آدرس deb.debian.org را با mirror.arvancloud.ir جایگزین کنید و سپس apt update بزنید. بخش امنیتی (security.debian.org) را هم در صورت وجود میرور معادل تغییر دهید.

تنظیم registry-mirrors داکر

فایل /etc/docker/daemon.json را بسازید یا ویرایش کنید:

{
  "registry-mirrors": [
    "https://docker.arvancloud.ir",
    "https://docker.iranserver.com",
    "https://focker.ir"
  ]
}

سپس:

sudo systemctl restart docker
docker info | grep -A3 "Registry Mirrors"
docker pull nginx:alpine

برخی میرورها به‌جای registry-mirrors، استفاده با پیشوند را پشتیبانی می‌کنند؛ مثلاً docker pull docker.arvancloud.ir/nginx:alpine. راهنمای همان میرور را بخوانید.

میرور pip و npm

pip (موقت برای یک دستور):

pip install --index-url https://MIRROR/simple package-name

npm:

npm config set registry https://MIRROR/

به‌جای MIRROR آدرس یک میرور داخلی معتبر و فعال PyPI یا npm را قرار دهید؛ میرورهای این دو اکوسیستم زیاد تغییر می‌کنند، پس پیش از استفاده سلامت آن‌ها را بسنجید.

راه جایگزین: build روی سرور خارج

اگر میرور داخلی ایمیج یا بستهٔ موردنظر را ندارد:

  1. یک سرور خارج ساعتی بسازید.
  2. ایمیج را آنجا build یا pull کنید و ذخیره کنید:
docker pull myimage:tag
docker save myimage:tag | gzip > myimage.tar.gz
  1. فایل را به سرور ایران منتقل و بارگذاری کنید:
scp myimage.tar.gz root@IRAN_SERVER_IP:/root/
ssh root@IRAN_SERVER_IP "gunzip -c /root/myimage.tar.gz | docker load"
  1. سرور خارج را حذف کنید تا هزینه متوقف شود.

بازگرداندن تنظیمات

sudo mv /etc/apt/sources.list.d/ubuntu.sources.bak /etc/apt/sources.list.d/ubuntu.sources
sudo rm /etc/docker/daemon.json && sudo systemctl restart docker

تشخیص سریع: مشکل از کجاست؟

پیش از تغییر تنظیمات، با چند دستور ساده مطمئن شوید مشکل واقعاً محدودیت دسترسی است، نه DNS یا شبکهٔ سرور:

# آیا DNS کار می‌کند؟
getent hosts archive.ubuntu.com

# پاسخ مخزن چیست؟ (کد 403 یعنی دسترسی رد شده)
curl -sI http://archive.ubuntu.com/ubuntu/ | head -1

# آیا Docker Hub پاسخ می‌دهد؟
curl -sI https://registry-1.docker.io/v2/ | head -1
نتیجه معنی راه‌حل
getent چیزی برنمی‌گرداند مشکل DNS سرور DNS را در /etc/systemd/resolved.conf اصلاح کنید
403 Forbidden دسترسی از آی‌پی ایران مسدود است میرور داخلی یا build روی سرور خارج
Timeout مسیر بین‌الملل کند یا قطع است میرور داخلی؛ بعداً دوباره تلاش کنید
200 یا 401 از Docker Hub دسترسی برقرار است مشکل از جای دیگری است (مثلاً محدودیت تعداد pull)
root@server: ~
$ curl -sI https://download.docker.com | head -1HTTP/2 403$ apt-get update 2>&1 | grep -E 'Err|403'$ 
شکل ۲ اگر curl کد 403 برگرداند مشکل تحریم است، نه DNS یا شبکه.

خطاهای رایج و معنی آن‌ها

  • 403 Forbidden [IP: ...] هنگام apt update: سرور مخزن درخواست از آی‌پی شما را رد کرده است.
  • Error response from daemon: ... 403 هنگام docker pull: Docker Hub یا CDN آن درخواست را رد کرده است.
  • Temporary failure resolving: مشکل DNS؛ ربطی به تحریم ندارد.
  • Hash Sum mismatch پس از تغییر میرور: فهرست بسته‌ها ناقص دانلود شده؛ sudo rm -rf /var/lib/apt/lists/* و دوباره apt update.
  • toomanyrequests در داکر: محدودیت تعداد pull بدون ورود؛ با میرور یا docker login رفع می‌شود.

انتخاب میرور قابل اعتماد

هر میروری که استفاده می‌کنید، این موارد را بررسی کنید:

  1. به‌روز بودن: تاریخ آخرین همگام‌سازی معمولاً در صفحهٔ اصلی میرور درج شده است.
  2. امضای بسته‌ها: apt امضای GPG بسته‌ها را بررسی می‌کند؛ هرگز گزینهٔ [trusted=yes] یا --allow-unauthenticated را برای دور زدن خطای امضا اضافه نکنید.
  3. HTTPS: در صورت امکان از آدرس HTTPS میرور استفاده کنید.
  4. پشتیبان: دو میرور را بشناسید تا اگر یکی از دسترس خارج شد، سریع جایگزین کنید.

الگوی پیشنهادی برای پروژه‌های جدی

برای تیم‌هایی که مرتب روی سرور ایران deploy می‌کنند، به‌جای وابستگی به دسترسی مستقیم:

  1. یک سرور خارج کوچک برای build بسازید (یا از CI خارج از ایران استفاده کنید).
  2. ایمیج داکر را آنجا بسازید و در یک رجیستری خصوصی یا به‌صورت فایل ذخیره کنید.
  3. روی سرور ایران فقط ایمیج آماده را pull یا load کنید.
  4. بسته‌های سیستمی را از میرور داخلی نصب کنید.

نصب کامل داکر در راهنمای Docker روی Ubuntu 24.04 و انتخاب بین سرور ایران و خارج در سرور ایران یا خارج آمده است.

برای آماده شدن تیم فنی پیش از قطع اینترنت بین‌الملل، چک‌لیست کسب‌وکار در زمان اینترنت ملی را ببینید.

سؤالات متداول

چرا docker pull خطای 403 Forbidden می‌دهد؟

Docker Hub درخواست‌های آی‌پی‌های ایران را مسدود می‌کند. با تنظیم registry-mirrors یا استفاده از سرور خارج برطرف می‌شود.

آیا استفاده از میرور داخلی امن است؟

میرورهای apt بسته‌ها را با امضای رسمی توزیع ارائه می‌دهند و apt امضا را بررسی می‌کند. برای ایمیج‌های داکر، از میرورهای شناخته‌شده استفاده کنید و در صورت امکان digest ایمیج را بررسی کنید.

در زمان اختلال اینترنت بین‌الملل هم میرور داخلی کار می‌کند؟

اگر میرور داخل ایران میزبانی شود و محتوا را از قبل همگام کرده باشد، معمولاً بله؛ ولی بسته‌های جدید ممکن است با تأخیر برسند.

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

محدودیت بر اساس آی‌پی مبدأ اعمال می‌شود؛ سرور خارج آی‌پی غیرایرانی دارد و مسیر بین‌الملل آن مستقیم است.

میرور داخلی امنیت بسته‌ها را کاهش می‌دهد؟

تا وقتی بررسی امضای GPG فعال است، apt بسته‌های دست‌کاری‌شده را رد می‌کند. به همین دلیل نباید بررسی امضا را غیرفعال کنید.

آیا pip و npm هم ممکن است 403 بدهند؟

بله؛ در این حالت از میرورهای پیشنهادی همین صفحه یا نصب روی سرور خارج و انتقال بسته‌ها استفاده کنید.

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.