
گاهی وقتها یک مشکل کوچک در سرور، آنقدر پیچیده و اعصابخُردکن میشود که ناگهان میفهمی شبکه و DNS در ایران یک موجود زندهٔ عجیبوغریب است. موجودی که گاهی حال دارد و گاهی هم نه، بدون اینکه دلیلش را بدانی.
این داستان تجربه چند روزه من است، از یک مشکل عجیب در ارتباط Nextcloud با فضای ذخیرهسازی S3 تا کشفکردن یک راز جالب درباره بهترین DNSهایی که در ایران میتوان استفاده کرد.
نکته: همونطور که میدونید ارتباط سرور با DNS ممکن از در شبکهها و دیتاسنترهای مختلف متفاوت باشه، اتفاقی که برای من افتاد در سروری بود که روی شبکه شرکت سینداد قرار داشت.
شروع ماجرا: وقتی S3 قفل میکند و هیچکس نمیداند چرا
من همیشه سعی میکنم از Nextcloud بهعنوان یک ابزار همهفنحریف روی سرورم استفاده کنم. اما در همین روزهای جنگی ایران در اولین روزهای بهار 1405 که دچار قطعیهای سراسری در اینترنت بینالمللی هم بودیم، متوجه شدم External Storage S3 گاهی قفل میکند و هیچ فایل یا پوشهای باز نمیشود. در لاگها هم فقط این خطای تکراری را میدیدم:
cURL error 28: Resolving timed out
یعنی سرور دامنهی S3 رو resolve نمیکرد. هرچه جلوتر رفتم، دیدم:
- روی Host همه چیز خوب کار میکند. (منظورم تست دستورات اتصال به DNS با کاربر root در ترمینال ssh سرور هست)
- داخل کانتینر Nextcloud دستور curl حتی DNS را resolve نمیکند
- شبکه مربوط به کانتینر نکست کلود ظاهراً سالم است
- و عجیبتر اینکه اگر کانتینر را به شبکه bridge وصل میکردم، مشکل کاملاً موقتاً حل میشد! (شبکه bridge هم یک شبکه پایه برای کانتینرهای داکری در سرور من بود)
دقت داشته باشید: «مشکل موقتا حل میشد» و همین نشان میداد مشکل واقعی جای دیگری است. چون گاهی دایرکتوری S3 در NextCloud باز میشد و گاهی قفل بود.
اولین مورد مشکوک: DNSهای زیرساخت
این روزها که اختلالات سراسری در اینترنت ایران وجود داره توصیه میشه برای بهتر شدن وضعیت ارتباطات سرور از DNS های ارائه شده توسط شرکت ارتباطات زیرساخت استفاده کنیم. فرقی نداره از کجا سرور تهیه میکنید، من دیدم که آروان، سینداد، پارس پک، ابر ایرانسل و چند جای دیگه میگن برای بهبود ارتباط سرور در شبکه داخلی از دی ان اس های زیرساخت استفاده کنید.
فایل resolv.conf را نگاه کردم و تصمیم گرفتم DNSهای داخلی ایران را تست کنم. معروفترینشان
/etc/resolv.conf
2.189.44.44
217.218.155.155
217.218.127.127
اینها در واقع باید از همه بهتر باشند. ولی نتیجه تستها… واقعاً ناامیدکننده بود. و تازه در حالت معمول اگر از 2.189.44.44 استفاده میکردم به عنوان اولین گزینه با سایت های وردپرسی روی سرور میشد کار کرد ولی همچنان کانتینر داکری نکست کلود نمیتونست با استوریج S3 ارتباط بگیره.
خیلی وقتها این خطا را میدیدم:
communications error... timed out
no servers could be reached
یعنی DNS زیرساخت بعضی وقتها جواب میدهد، بعضی وقتها نه. دقیقاً همان رفتاری که از شبکه داخل ایران انتظار داریم. رفتاری معتدل، نه کاملاً خوب، نه کاملاً بد.
کشف اتفاقی: DNSهای پارسپک
اینجای داستان دقیقاً همانجایی است که ورق برگشت.
در داشبورد پارسپک دیدم یک سری DNS معرفی کردهاند که قبلا هم دیده بودم اینا رو ولی همیشه فکر میکردم این DNS ها برای سرورهای میزبانی شده توسط پارس پک ارائه شده. (ولی سرور من در شرکت دیگه ای بود) با این حال کنجکاوی کردم و گفتم بگذار امتحان کنم:
tehran2: 45.159.149.19, 185.164.72.97
tehran3: 185.8.174.140, 130.185.77.69
tehran11: 195.177.255.170, 178.239.151.228
اینها DNS های شرکت پارس پک بود که من هم روی اینترنت ADSL مخابرات و هم TD-Lte ایرانسل و هم 4G همراه اول در سیستم خودم تستشون کردم و هم در سرور لینوکس اوبونتو (که از شرکت سینداد گرفته بودم برای میزبانی چند تا سایت) در resolv.conf و هم برای DNS های کانتینرهای داکری سرورم در فایل:
/etc/docker/daemon.json
------------
{
"insecure-registries": [
"https://docker.mobinhost.com"
],
"registry-mirrors": [
"https://docker.mobinhost.com"
],
"dns": [
"185.164.72.97",
"130.185.77.69"
],
}
البته همونطور که در کدهای تنظیمات داکر هم میبینید برای مخازن نصب کانتینرها از سرورهای داخلی هم از مخازن شرکت مبین هاست (docker.mobinhost.com) استفاده کردم. و از این مخازن هم میتونید برای داکر استفاده کنید:
docker.arvancloud.ir
mirror-docker.runflare.com
docker.mobinhost.com
نتیجه این کار: (که فقط DNS های سرور و داکر رو به دی ان اس های پارس پک تغییر دادم)
کاملا شوکه کننده بود و از این به بعد هر چی تست dig و nslookup و curl که روی هر دامنه ای انجام میدادم: سریع، پایدار، بدون Timeout، و بدون حتی یک خطا انجام میشد.
همانجایی که DNSهای زیرساخت یا کند بودند یا اصلاً جواب نمیدادند، DNSهای پارسپک مثل آب خوردن query را resolve میکردند.
انگار شبکه ایران با DNS های پارس پک بهتر کار میکند. میدونم شبکه اینترنت داخلی ایران (یا به قول دوستان فیلترچی شبکه ملی اطلاعات) اختلالات عجیبی داره و ممکنه تا فردا که از خواب پا میشم ببینم همین دی ان اس ها هم دچار مشکل شدن ولی الان خوب کار میکنن.
نمیدونم شبکه زیرساخت که انتظار میره بهترین سروی رو ارائه کنه چرا اینطوریه، ولی امیدوارم این اختلال به خاطر بار زیاد روی سرورهاشون باشه و عمدی نباشه که همین بلا رو سر دی ان اس های پارس پک هم بیارن.
نکته عجیب تر: بدون دستکاری شبکه کانتینر مشکل اتصال nextcloud به فضای s3 حل شد
اگر چه در عیب یابی ابتدایی و کلی چت با هوش مصنوعی فکر میکردم مشکل از تنظیمات کانتینر باشه یا شبکه داخلی داکر، ولی وقتی dns پایدار روی سرور تنظیم شد، بدون دستکاری شبکه Docker یا فایل Compose یا Bridge ها مشکل اتصال برطرف شد.
این یعنی مشکل نه از Docker بود، نه از کانتینر، نه از Nextcloud. مشکل دقیقاً و فقط از DNSهای زیرساخت بود.
پیکربندی نهایی که سیستم من را نجات داد:
احتمالا برای شما هم کار میکنه.
/etc/resolv.conf:
nameserver 185.164.72.97 # ParsPack
nameserver 2.189.44.44 # Infrastructure
nameserver 217.218.155.155 # Infrastructure
nameserver 130.185.77.69 # ParsPack
/etc/docker/daemon.json:
{
"insecure-registries": [
"https://docker.mobinhost.com"
],
"registry-mirrors": [
"https://docker.mobinhost.com"
],
"dns": [
"185.164.72.97",
"130.185.77.69"
]
}
و بعد از این تغییرات، Nextcloud با S3 بدون حتی یک ارور شروع به کار کرد.
نکات نهایی
در نهایت این دو سه روز از نوروز 1405 در شرایط جنگی و قطعی اینترنت برای من اینطوری گذشت که شاید بتونم حداقل از سرور ایران استفاده کنم. بماند که به دلیل قطعی اینترنت، دستاوردهای بیش از 17 سال فعالیت در زمینه وب که در سرورهای خارجی میزبانی میشد از دست رفت.
نکاتی که در ادامه مینویسم چکیده چیزهایی هست که طی 3 روز جستجو در منابع محدود داخلی تونستم کار با سرور و سایتهای وردپرس و جوملا و همچنین استفاده از NextCloud رو با شبکه داخلی و بدون اینترنت جهانی ممکن کنم.
- DNSهای زیرساخت همیشه پایدار نیستند.
- DNSهای پارسپک بهطرز عجیبی پایدار، سریع و قابلاعتمادند. (امتحان کنید، ضرر نمیکنید)
- فهمیدم که Docker یک مصرفکننده مستقل DNS است (اگر daemon.json را درست تنظیم نکنید، حتی resolv.conf خوب هم برای عملکرد صحیح کانتینرهای داکری کمکی نمیکند.)
- صبوری کنید، صبر و تحلیل دقیق خیلی مهم است. این کارها واقعاً کلافه کننده است، یک شبکه نرمال اصلا نیازی به این دنگ و فنگها نداره ولی اینجا ایران است و ما یا باید کلا از اکوسیستم فناوری خارج بشیم یا متناسب با آنچه که در اختیار داریم کارمون رو پیش ببریم. (چون گاهی راهحل جایی است که فکرش را نمیکنی.)
- در شرایط بحرانی اینترنت ایران، بهترین چیدمان DNS که برای سرورهای من خوب کار میکنه این است:
- یک DNS سریع و پایدار از یک دیتاسنتر معتبر داخلی (مثل ParsPack)
- یک DNS fallback از زیرساخت (چون این شرکت به هر حال مسئول ارائه شبکه پایدار هست و اگر چه الان خوب نیست ولی شاید در زمان قطعی سایر شبکه ها، DNS های این شرکت تنها مواردی باشن که کار میکنن.)
- یک DNS داخلی دیگر فقط برای redundancy (البته من فعلا برای سومین مورد هم از DNS های پارس پک استفاده کردم)
- اگر از داکر و کانتینرها استفاده میکنید حتماً DNS را در daemon.json هم تنظیم کنید.
در نهایت فهمیدم که در شبکه ایران، گاهی بهترین راهحلها آنهایی نیستند که رسمیترین نام را دارند، بلکه آنهاییاند که در عمل و در میدان دوام میآورند. حقیقتاً اگر بخوام منصفانه نظر بدم پشتیبانی فنی شرکت پارس پک که از سالها قبل تجربه کردم خیلی خوبه. ولی خیلی از شرکتها در شرایط بحران، کاری براتون انجام نمیدن و حواله میکنن به مشکلات زیرساختی و …
