WIUNIX ACADEMY
کدوم برنامه این پورت رو در لینوکس اشغال کرده؟
اگه سرویس با خطای «آدرس در حال استفاده است» بالا نمیاد، اول ببین چه برنامهای پورت رو اشغال کرده. با هم از شمارهٔ پورت به سوکت، فرایند و سرویس میرسیم تا معلوم بشه چه چیزی رو باید تغییر بدی.
محیطت رو انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخهٔ سرورت رو انتخاب کن تا مراحل، دستورها و راهحلهای همون محیط رو ببینی.
از اینجا شروع کن
آخر این آموزش چی خواهیم داشت؟
اگه سرویس با خطای «آدرس در حال استفاده است» بالا نمیاد، اول ببین چه برنامهای پورت رو اشغال کرده. با هم از شمارهٔ پورت به سوکت، فرایند و سرویس میرسیم تا معلوم بشه چه چیزی رو باید تغییر بدی.
سیستمعاملها و نسخههای پوششدادهشده
Ubuntu، Debian، RHEL، Rocky Linux، AlmaLinux، Arch Linux و Manjaro رو میتونی در انتخابگر پیدا کنی. مسیرها با مستندات بررسی شدن. این راهنما جدول سوکتهای لینوکس رو میخونه؛ دستورها برای Windows و macOS نیستن.
قبل از شروع
- به ترمینال میزبان، شمارهٔ پورت و پروتکل خطا نیاز داری. فقط اگه باید فرایند کاربر دیگهای رو ببینی، با مجوز مدیر از sudo استفاده کن.
- پورت 8080 مقدار نمونهست. برای بررسی سرویس خودت، شمارهٔ واقعی رو در هر دو دستور جستوجوی سوکت بذار.
اول ببین سرویس کجا گیر کرده
از متن خطا سه چیز رو بردار: پروتکل، آدرس و شمارهٔ پورت. ممکنه یک برنامه روی 8080 با TCP گوش بده و برنامهٔ دیگه همین شماره رو با UDP استفاده کنه. حتی دو سرویس TCP هم گاهی روی آدرسهای محلی متفاوت از یک شماره استفاده میکنن.
بررسی رو همون جایی انجام بده که سرویس میخواست پورت رو باز کنه. سوکتی که روی میزبان میبینی لزوماً داخل کانتینر دیده نمیشه. دیدن سوکت هم فقط یعنی برنامه پورت رو باز کرده؛ هنوز نمیدونیم کاربر از پشت فایروال بهش میرسه یا نه.
قدم بعدی
ببین ss روی میزبان هست یا نه
این چند خط رو روی همون میزبان اجرا کن تا توزیع و ابزار رو بشناسی. اگه ss نصب نبود، با مدیر میزبان هماهنگ کن تا بستهٔ همین توزیع رو از مخزن خودش بگیره.
اسم بسته در Ubuntu و Debian و خانوادهٔ Arch، iproute2 است؛ در RHEL و Rocky و AlmaLinux اسمش iproute است. بررسی پایین فقط نسخهٔ نصبشده رو میخونه.
ترمینال مجاز روی میزبان درگیر
cat /etc/os-release
dpkg-query -W iproute2
command -v ss
ss -Vنام توزیع و نسخهٔ ss رو میبینی. اگه ss پیدا نشد، اول ابزار رو آماده کن تا بتونی پورت رو بررسی کنی.
قدم بعدی
پورت TCP رو توی فهرست شنوندهها پیدا کن
دنبال پورت همین ماشینی، برای همین فیلتر رو روی پورت محلی میذاریم. توی ستون Local Address:Port هم آدرس مهمه هم شماره. مثلاً آدرس loopback فقط از خود میزبان قابل دسترسیه؛ آدرس 0.0.0.0 همهٔ رابطهای IPv4 رو پوشش میده. برای سوکت IPv6، پذیرش IPv4 به تنظیم خود سوکت بستگی داره.
اگه ردیف پورت هست ولی اسم فرایند رو نمیبینی، فقط با مجوز مدیر همین بررسی رو با sudo تکرار کن. اگه ردیفی ندیدی، در همون لحظه هیچ شنوندهٔ TCP مطابقی در این فضای نام دیده نشده. برنامهای که مرتب بالا میاد و میافته ممکنه بین دو بررسی پورت رو آزاد کنه.
ترمینال مجاز روی میزبان درگیر
ss -ltnp 'sport = :8080'ردیفهای LISTEN آدرس و پورت محلی رو نشون میدن. اگه اجازهٔ دیدن فرایند رو داشته باشی، اسم و PID هم میاد.
قدم بعدی
برای UDP جداگانه نگاه کن
UDP مثل TCP اتصال رو با دستدادن شروع نمیکنه. همهٔ سوکتهای UDP با این پورت محلی رو میگیریم. UNCONN معمولاً یعنی سوکت طرف مقابل ثابتی نداره؛ ممکنه سوکت دیگهای هم طرف مقابل مشخصی داشته باشه. برای اینکه بفهمی سرویس جواب میده، باید جداگانه درخواست واقعی بفرستی.
ترمینال مجاز روی میزبان درگیر
ss -uanp 'sport = :8080'اگه فرایندی همین پورت رو با UDP باز کرده باشه، اینجا ردیفش رو جدا از TCP میبینی.
قدم بعدی
حالا معلوم کن پورت دست کدوم سرویسه
بهجای PID نمونه، عددی رو بذار که همین الان از ss گرفتی. برای شناخت فرایند لازم نیست همهٔ آرگومانهاش رو ببینی؛ ممکنه چیزی مثل توکن بینشون باشه. روی میزبان systemd میتونی از روی PID به واحد مربوط برسی. اگه پورت دست PID 1 بود، فهرست سوکتها رو هم ببین: ستون Listen آدرس رو میگه و Activates نشون میده کدوم سرویس با رسیدن درخواست بیدار میشه.
اگه برنامه پرید و برگشت، دوباره سوکت رو نگاه کن؛ PID ممکنه به برنامهٔ دیگهای رسیده باشه. چند worker هم میتونن از یک سوکت مشترک استفاده کنن. برای رفع تداخل، اول تنظیمات سرویس یا کانتینر رو با مسئولش بررسی کن.
ترمینال مجاز روی میزبان درگیر
pid=1234
ps -p "$pid" -o pid,ppid,user,comm
systemctl status "$pid" --no-pager -n 0
systemctl list-sockets --all --no-pagerمیفهمی فرایند از یک واحد systemd اومده، با سوکت فعال میشه یا بیرون از systemd راه افتاده. پیدا نشدن واحد بهتنهایی به معنی نبودن فرایند نیست.
اگه چیزی که از میزبان میبینی با خطا نمیخونه
اگه خطا داخل کانتینر اتفاق افتاده، با راه دسترسی مجاز همون محیط، جستوجوی پورت رو داخل فضای نام کانتینر تکرار کن. برعکسش هم ممکنه: کانتینر یک پورت رو روی میزبان منتشر کرده باشه ولی چون ترافیک با تغییر آدرس بستهها هدایت میشه، ss روی میزبان فرایندی برای اون پورت نشون نده.
تا اینجا تنظیمی عوض نکردیم، پس چیزی برای برگردوندن نیست. اگه بعداً آدرس یا پورت سرویس رو تغییر دادی، تنظیم قبلی رو نگه دار و هماهنگ کن که پراکسی و کلاینتها آدرس درست رو بزنن. هم سوکت محلی رو چک کن هم یک درخواست از سمت کلاینت بفرست. اگه تغییر جواب نداد، تنظیم قبلی رو با روش همون سرویس برگردون.
پورت رو میبینی، ولی اسم فرایند خالیه
با اجازهٔ مدیر، فقط همین پورت رو دوباره بخون؛ اگه سوکت بین دو بررسی ناپدید شد، ممکنه برنامه بسته شده باشه.
sudo ss -ltnp 'sport = :8080'
sudo ss -uanp 'sport = :8080'منابع این آموزش
منابع رسمی
بالای صفحه میبینی که هر محیط چطور بررسی شده. بررسی مستندات به معنی اجرای عملی همهٔ نسخهها نیست.
ادامهٔ مسیر