مجله ایرانیکاسرور آموزش سرور، هاست، وردپرس و شبکه پنل کاربری

رفع هنگ apt، Docker یا curl به‌دلیل IPv6 در Ubuntu

اگر apt update، دانلود با curl یا بعضی عملیات Docker روی Ubuntu مدت زیادی روی اتصال به یک آدرس می‌مانند، یکی از علت‌های محتمل IPv6 ناقص است؛ یعنی سرور رکورد IPv6 مقصد را پیدا…

✍ Amir Jabbari 📅 12 مهر 1405 ⏱ 10 دقیقه مطالعه 👁 9 بازدید 💬 0 دیدگاه

اگر apt update، دانلود با curl یا بعضی عملیات Docker روی Ubuntu مدت زیادی روی اتصال به یک آدرس می‌مانند، یکی از علت‌های محتمل IPv6 ناقص است؛ یعنی سرور رکورد IPv6 مقصد را پیدا می‌کند، اما مسیر واقعی IPv6 تا اینترنت درست کار نمی‌کند. در این شرایط برنامه ممکن است ابتدا اتصال IPv6 را امتحان کند و تا Timeout منتظر بماند.

راه‌حل سریع: قبل از اینکه IPv6 کل سرور را خاموش کنید، مشکل را با IPv4 آزمایش کنید. برای APT می‌توان از Acquire::ForceIPv4 و برای curl از گزینه -4 استفاده کرد. اگر همان عملیات با IPv4 سریع انجام شد، احتمال خرابی مسیر IPv6 بسیار بیشتر می‌شود.

چرا IPv6 باعث هنگ apt، curl یا Docker می‌شود؟

وجود یک آدرس IPv6 روی سرور الزاماً به معنی سالم‌بودن دسترسی IPv6 به اینترنت نیست. ممکن است سیستم IPv6 داشته باشد و DNS نیز رکورد AAAA مقصد را برگرداند، اما Default Route، Gateway، فایروال یا مسیر شبکه دیتاسنتر برای IPv6 درست نباشد.

در چنین وضعیتی یک برنامه ممکن است آدرس IPv6 مقصد را دریافت کند و اتصال به آن را امتحان کند. اگر مسیر عملاً Blackhole باشد و پاسخ رد سریع دریافت نشود، برنامه باید منتظر Timeout بماند. نتیجه از دید مدیر سرور شبیه «هنگ‌کردن» است.

🔹 apt update روی پیام Connecting یا دریافت یک Repository مکث می‌کند.

🔹 curl روی Connecting می‌ماند، ولی همان URL با curl -4 سریع باز می‌شود.

🔹 Pull کردن Image یا دسترسی یک Container به اینترنت با تأخیر یا Timeout روبه‌رو می‌شود.

🔹 DNS ظاهراً سالم است و نام دامنه Resolve می‌شود، اما اتصال واقعی برقرار نمی‌شود.

مرحله ۱: قبل از هر تغییری IPv4 و IPv6 را مقایسه کنید

این مرحله فقط تشخیصی است و تنظیمات شبکه را تغییر نمی‌دهد. ابتدا آدرس‌های فعلی سرور را ببینید:

ip -br addr

حالا Routeهای IPv6 را بررسی کنید:

ip -6 route

اگر قرار است سرور از IPv6 عمومی استفاده کند، معمولاً باید مسیر مناسب برای خروج ترافیک IPv6 وجود داشته باشد. صرف مشاهده یک آدرس IPv6 برای نتیجه‌گیری کافی نیست.

برای مقایسه عملی curl، این دو فرمان را اجرا کنید:

curl -4 -I --connect-timeout 10 https://example.com
curl -6 -I --connect-timeout 10 https://example.com

گزینه -4 curl را مجبور می‌کند فقط IPv4 را درخواست کند و -6 همین کار را برای IPv6 انجام می‌دهد. اگر دستور اول فوراً پاسخ می‌دهد اما دستور دوم Timeout می‌شود، شواهد خوبی از مشکل مسیر IPv6 دارید.

مرحله ۲: بررسی DNS و رکوردهای A و AAAA

گاهی مشکل با IPv6 اشتباه گرفته می‌شود، در حالی که DNS عامل اصلی است. برای مشاهده پاسخ Resolver سیستم می‌توانید از دستور زیر استفاده کنید:

getent ahosts example.com

اگر بسته dnsutils روی سرور نصب است، رکوردهای IPv4 و IPv6 را نیز جداگانه ببینید:

dig A example.com
dig AAAA example.com

وجود رکورد AAAA طبیعی است. مشکل زمانی مطرح می‌شود که سرور آن آدرس را دریافت کند اما نتواند از مسیر IPv6 به آن متصل شود.

مرحله ۳: رفع هنگ apt بدون خاموش‌کردن IPv6

APT امکان اجبار دانلودها به IPv4 را دارد. ابتدا آن را فقط برای یک اجرا آزمایش کنید:

sudo apt -o Acquire::ForceIPv4=true update

اگر APT قبلاً چندین ثانیه یا دقیقه متوقف می‌شد ولی با این فرمان Repositoryها بلافاصله پاسخ دادند، IPv6 یکی از مظنون‌های اصلی است.

اجبار دائمی APT به IPv4

اگر فعلاً نمی‌خواهید مشکل IPv6 کل سیستم را اصلاح کنید، می‌توانید فقط APT را روی IPv4 قرار دهید:

echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

سپس دوباره آزمایش کنید:

sudo apt update

این روش IPv6 سیستم را خاموش نمی‌کند؛ فقط دانلودهای APT را مجبور به استفاده از IPv4 می‌کند.

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

بعد از اصلاح IPv6 می‌توانید فایل ایجادشده را حذف کنید:

sudo rm /etc/apt/apt.conf.d/99force-ipv4
sudo apt update

مرحله ۴: رفع هنگ curl به‌دلیل IPv6

برای curl ساده‌ترین آزمایش استفاده از گزینه -4 است:

curl -4 https://example.com

برای مشاهده جزئیات اتصال نیز می‌توانید حالت Verbose را فعال کنید:

curl -4 -v --connect-timeout 10 https://example.com

اگر فرمان عادی مشکل دارد ولی نسخه -4 سریع اجرا می‌شود، مسئله را در مسیر IPv6، Route یا فایروال بررسی کنید؛ صرف این تفاوت هنوز مشخص نمی‌کند مشکل دقیقاً در کدام بخش شبکه است.

مرحله ۵: وقتی Docker Pull یا اتصال Containerها کند است

در Docker باید بین دو موضوع تفاوت بگذارید: شبکه خود میزبان و شبکه Container. اگر خود Ubuntu در اتصال IPv6 مشکل دارد، ابتدا Host را بررسی کنید. از طرف دیگر Docker می‌تواند برای Bridgeهای خود تنظیمات IPv6 جداگانه داشته باشد.

وضعیت شبکه‌های Docker را ببینید:

docker network ls
docker network inspect bridge

همچنین DNS و دسترسی شبکه را از داخل یک Container بررسی کنید. اگر Image موردنظر از قبل روی سرور موجود است، می‌توانید آزمایش را بدون وابستگی به Pull جدید انجام دهید.

⚠️ فایل /etc/docker/daemon.json را بدون مشاهده محتوای فعلی آن بازنویسی نکنید. این فایل ممکن است تنظیمات دیگری مانند DNS، Registry، Log Driver، Address Pool یا گزینه‌های شبکه داشته باشد و جایگزینی کامل آن می‌تواند Docker را از کار بیندازد.

قبل از تغییر، اگر فایل وجود دارد از آن نسخه پشتیبان بگیرید:

sudo cp -a /etc/docker/daemon.json /etc/docker/daemon.json.backup

اگر فایل وجود ندارد، دستور بالا طبیعتاً خطای نبود فایل می‌دهد و نیازی به ساخت Backup خالی نیست.

بعد از هر تغییر در تنظیمات Docker، قبل از Restart می‌توانید اعتبار JSON و تنظیمات daemon را بررسی کنید:

sudo dockerd --validate --config-file=/etc/docker/daemon.json

در صورت معتبر بودن تنظیمات و نیاز واقعی به اعمال تغییر، Docker باید Restart شود. توجه کنید که Restart کردن daemon ممکن است روی Containerهای در حال اجرا اثر بگذارد؛ بنابراین این کار را در زمان مناسب انجام دهید.

sudo systemctl restart docker
sudo systemctl --no-pager --full status docker

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

برای اجرای Docker، API، وب‌سرور و سرویس‌های لینوکسی می‌توانید پلن‌های سرور مجازی ایران ایرانیکاسرور یا سایر سرورهای مجازی ایرانیکاسرور را بررسی کنید. قبل از انتخاب پلن، RAM، CPU، فضای ذخیره‌سازی و نیاز شبکه برنامه خود را در نظر بگیرید.

مرحله ۶: IPv6 را موقتاً غیرفعال کنیم؟

اگر آزمایش‌ها نشان دادند IPv6 واقعاً مشکل دارد و فعلاً امکان اصلاح Route یا Gateway وجود ندارد، می‌توانید برای عیب‌یابی IPv6 را موقتاً در سطح سیستم غیرفعال کنید.

⚠️ اگر از طریق IPv6 به SSH سرور متصل هستید، این کار می‌تواند اتصال شما را قطع کند. قبل از تغییر مطمئن شوید دسترسی IPv4 یا کنسول مدیریتی جایگزین دارید.

مقادیر فعلی را ابتدا مشاهده کنید:

sysctl net.ipv6.conf.all.disable_ipv6
sysctl net.ipv6.conf.default.disable_ipv6

مقدار 0 به معنی فعال‌بودن IPv6 در آن تنظیم و مقدار 1 به معنی غیرفعال‌بودن آن است.

برای آزمایش موقت:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

حالا دوباره عملیات مشکل‌دار را اجرا کنید:

sudo apt update
curl -I https://example.com

اگر مشکل ناپدید شد، این نتیجه از فرضیه خرابی IPv6 پشتیبانی می‌کند؛ با این حال بهتر است Route، Gateway و تنظیمات شبکه را اصلاح کنید تا مجبور به حذف دائمی IPv6 نباشید.

فعال‌کردن دوباره IPv6

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0

مرحله ۷: غیرفعال‌سازی دائمی IPv6؛ فقط در صورت نیاز واقعی

اگر سرویس شما هیچ وابستگی به IPv6 ندارد و تصمیم گرفته‌اید تا زمان اصلاح شبکه آن را در سیستم غیرفعال نگه دارید، بهتر است تنظیم را در یک فایل مستقل داخل /etc/sysctl.d/ قرار دهید تا مدیریت و بازگردانی آن ساده باشد.

فایل زیر را ایجاد کنید:

sudo nano /etc/sysctl.d/99-disable-ipv6.conf

این مقادیر را داخل آن قرار دهید:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

سپس تنظیمات sysctl را بارگذاری کنید:

sudo sysctl --system

و نتیجه را بررسی کنید:

sysctl net.ipv6.conf.all.disable_ipv6
sysctl net.ipv6.conf.default.disable_ipv6

روش بازگشت

برای حذف این تغییر، فایل ایجادشده را پاک کنید و تنظیمات را دوباره اعمال کنید:

sudo rm /etc/sysctl.d/99-disable-ipv6.conf
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0

IPv6 را خاموش کنیم یا مشکل اصلی را برطرف کنیم؟

انتخاب روش مناسب برای رفع هنگ اتصال
شرایط راهکار پیشنهادی
فقط APT مشکل دارد ابتدا Acquire::ForceIPv4 را آزمایش کنید.
فقط curl مشکل دارد با curl -4 و curl -6 مقایسه کنید.
کل سیستم روی IPv6 مشکل دارد Route، Gateway، DNS و فایروال IPv6 را بررسی کنید.
Docker مشکل دارد ولی Host سالم است شبکه، DNS و تنظیمات Docker را جداگانه بررسی کنید.
IPv6 فعلاً کاربردی ندارد و مسیر آن خراب است غیرفعال‌سازی موقت می‌تواند راه‌حل عملی باشد؛ سپس علت شبکه اصلاح شود.

چطور بفهمیم مشکل واقعاً حل شده است؟

بعد از اعمال راه‌حل، همان آزمایشی را که قبل از تغییر انجام دادید تکرار کنید. برای مثال:

curl -4 -I --connect-timeout 10 https://example.com
curl -6 -I --connect-timeout 10 https://example.com
sudo apt update

اگر IPv6 را اصلاح کرده‌اید، هدف این است که اتصال IPv6 نیز بدون Timeout کار کند. اگر فقط APT را روی IPv4 قرار داده‌اید، سریع‌شدن APT به معنی اصلاح IPv6 نیست؛ فقط مسیر مشکل‌دار را برای APT دور زده‌اید.

خطاهای رایج هنگام رفع مشکل

🔹 خاموش‌کردن فوری IPv6: ابتدا با curl و APT اثبات کنید IPv4 رفتار متفاوتی دارد.

🔹 اشتباه‌گرفتن DNS با Routing: Resolve شدن دامنه ثابت نمی‌کند مسیر شبکه سالم است.

🔹 بازنویسی daemon.json: تنظیمات موجود Docker را قبل از ویرایش بررسی و Backup کنید.

🔹 Restart کردن Docker روی سرور Production: ابتدا اثر Restart روی Containerهای فعال را بررسی کنید.

🔹 قطع IPv6 هنگام اتصال SSH از IPv6: قبل از تغییر، مسیر IPv4 یا کنسول جایگزین داشته باشید.

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

آیا IPv6 می‌تواند باعث کندشدن apt update شود؟

بله، اگر سیستم تلاش کند از IPv6 استفاده کند ولی مسیر IPv6 ناقص یا خراب باشد، برقراری اتصال ممکن است تا Timeout طول بکشد. مقایسه اجرای عادی APT با Acquire::ForceIPv4 راه مناسبی برای تشخیص اولیه است.

آیا برای حل مشکل باید IPv6 را کامل خاموش کنم؟

خیر. بهتر است ابتدا همان برنامه مشکل‌دار را با IPv4 آزمایش کنید. برای APT و curl راه‌های مستقیمی برای اجبار IPv4 وجود دارد و ممکن است اصلاً نیازی به تغییر تنظیمات کل سیستم نباشد.

تفاوت curl -4 و curl -6 چیست؟

curl -4 فقط آدرس‌های IPv4 و curl -6 فقط آدرس‌های IPv6 را برای اتصال درخواست می‌کند. مقایسه این دو برای پیدا کردن مشکلات IPv6 بسیار کاربردی است.

اگر Docker Pull هنگ کند، حتماً IPv6 مقصر است؟

خیر. DNS، دسترسی Registry، Proxy، فایروال، Routing و مشکلات شبکه میزبان نیز می‌توانند علائم مشابهی ایجاد کنند. ابتدا وضعیت Host را بررسی کنید و بعد سراغ تنظیمات Docker بروید.

غیرفعال‌کردن IPv6 با sysctl دائمی است؟

اجرای مستقیم sysctl -w یک تغییر Runtime است. برای اعمال تنظیم در Boot معمولاً آن را در فایل تنظیمات مناسب مانند فایل مستقل داخل /etc/sysctl.d/ قرار می‌دهند.

چرا دامنه Resolve می‌شود ولی curl همچنان Timeout می‌دهد؟

DNS فقط آدرس مقصد را مشخص می‌کند. بعد از آن سیستم هنوز به Route، Gateway، فایروال و مسیر سالم شبکه تا مقصد نیاز دارد. بنابراین موفقیت DNS به‌تنهایی سالم‌بودن IPv6 را ثابت نمی‌کند.

منابع رسمی

🔹 مستندات تنظیم APT و گزینه ForceIPv4 در Ubuntu Manpages

🔹 راهنمای گزینه‌های IPv4 و IPv6 در مستندات رسمی curl

🔹 راهنمای پیکربندی Docker daemon

🔹 مستندات IPv6 در Docker Engine

جمع‌بندی: اگر apt، curl یا Docker روی اتصال شبکه مکث می‌کنند، IPv6 را بدون بررسی خاموش نکنید. ابتدا IPv4 و IPv6 را جداگانه آزمایش کنید. برای APT از Acquire::ForceIPv4 و برای curl از -4 استفاده کنید. اگر IPv4 سالم و IPv6 دچار Timeout بود، Route، Gateway، DNS و فایروال IPv6 را بررسی کنید. غیرفعال‌سازی IPv6 زمانی منطقی است که مشکل تأیید شده و فعلاً امکان اصلاح زیرساخت وجود نداشته باشد.

برای عیب‌یابی سرور کمک می‌خواهید؟

اگر apt، Docker، curl، DNS یا شبکه VPS شما دچار Timeout و اختلال شده است، می‌توانید درخواست بررسی و کانفیگ سرور را برای تیم ایرانیکاسرور ارسال کنید.

تماس با پشتیبانی ایرانیکاسرور: 021-91302467

این آموزش برایت مفید بود؟ می‌توانی لینک آن را ذخیره یا برای دیگران ارسال کنی.

Amir Jabbari

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

برای اجرای آموزش به زیرساخت نیاز داری؟

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

ایرانیکاسرور
گفت‌وگو درباره آموزش

دیدگاه‌ها

0 دیدگاه برای این مطلب ثبت شده است.

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

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

ایمیل شما منتشر نمی‌شود. فیلدهای ضروری مشخص شده‌اند.