در برخی سناریوها، قطع دسترسی اینترنت روی سرور میتواند باعث بروز خطا یا کندی در پنل مدیریت وردپرس شود. این موضوع معمولاً زمانی رخ میدهد که برخی افزونهها در داشبورد مدیریت، درخواستهای HTTP به سرویسهای خارجی ارسال میکنند. در صورتی که دامنه مقصد قابل Resolve نباشد، این درخواستها باعث تأخیر و کندی در بارگذاری پنل ادمین خواهند شد.
چرا این مشکل رخ میدهد؟
وردپرس و بسیاری از افزونههای آن از درخواستهای HTTP برای ارتباط با سرویسهای خارجی استفاده میکنند. این درخواستها معمولاً از طریق توابع داخلی وردپرس مانند wp_remote_post یا wp_remote_get انجام میشوند.
در شرایطی که اینترنت سرور قطع باشد یا دسترسی به برخی دامنهها محدود شده باشد، این درخواستها میتوانند باعث:
- کندی در لود پنل مدیریت
- Timeout شدن درخواستها
- ایجاد خطا در افزونهها
روشهای محدودسازی درخواستهای خارجی در وردپرس
یکی از روشهای اولیه، محدود کردن درخواستهای خارجی از طریق تنظیمات وردپرس است:
define('WP_HTTP_BLOCK_EXTERNAL', true);
define('WP_ACCESSIBLE_HOSTS', '*.zarinpal.com');
همچنین میتوان از فیلتر pre_http_request برای کنترل درخواستها استفاده کرد.
محدودیت این روشها
این روشها فقط روی HTTP API داخلی وردپرس تأثیر دارند. در صورتی که یک افزونه بهصورت مستقیم از curl استفاده کند، این محدودیتها بیاثر خواهند بود.
مشکل افزونههای غیرشفاف (Obfuscated Plugins)
در شرایطی که افزونهها به صورت کد شده (مثلاً با ionCube یا SourceGuardian) منتشر شده باشند:
- امکان بررسی دقیق درخواستهای خروجی وجود ندارد
- نمیتوان دامنههای هدف را بهسادگی شناسایی کرد
- کنترل دستی روی رفتار شبکهای آنها بسیار محدود میشود
راهحل سطح سیستم: قطع DNS خارجی
برای کنترل کامل ارتباطات شبکهای، میتوان سطح DNS سیستم را محدود یا قطع کرد. این روش در Ubuntu تست شده است.
مرحله 1: تغییر تنظیمات NSS
فایل زیر را ویرایش کنید:
sudo nano /etc/nsswitch.conf
مقدار زیر:
hosts: files dns
به شکل زیر تغییر داده شود:
hosts: files
مرحله 2: غیرفعال کردن systemd-resolved
sudo systemctl disable --now systemd-resolved
مرحله 3: بازسازی resolv.conf
sudo rm /etc/resolv.conf
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
مدیریت دستی دامنهها
در صورتی که نیاز باشد برخی سرویسها همچنان در دسترس باشند (مثلاً درگاه پرداخت)، باید آنها را به صورت دستی در فایل hosts تعریف کنید:
/etc/hosts
مثال:
185.143.234.1 payment.zarinpal.com
استفاده در Docker Compose
اگر از Docker استفاده میکنید، میتوانید از extra_hosts استفاده کنید:
extra_hosts:
- "payment.zarinpal.com:185.143.234.1"
اگر روش بالا جواب نداد داخل کانتینری که ودپرس رو ران میکنه این رو بزنید
echo "46.245.77.196 api.payamak-panel.com" >> /etc/hosts
جمعبندی
محدود کردن درخواستهای خارجی در وردپرس در سطح اپلیکیشن معمولاً کافی نیست، زیرا:
- برخی افزونهها از روشهای مستقیم (مثل curl) استفاده میکنند
- برخی افزونهها کد شده و غیرقابل بررسی هستند
در چنین شرایطی، کنترل در سطح سیستمعامل (DNS و شبکه) تنها روش قابل اتکا برای جلوگیری از ارتباطات ناخواسته است.