هنگام عیب یابی اتصال شبکه یا مشکلات مخصوص یک برنامه، یکی از اولین مواردی که باید بررسی شود این است که چه پورت‌هایی در واقع در سیستم شما مشغول هستند و کدام برنامه درحال شنود یک پورت خاص است.
در این مقاله نحوه فهمیدن اینکه چه سرویس‌هایی درحال گوش دادن (listen) به کدام پورت‌ها است، با استفاده از دستورات netstat ، ss و lsof توضیح داده می‌شود. این دستورات برای همه سیستم عامل‌های مبتنی بر لینوکس و یونیکس مانند macOS قابل استفاده است.

 

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

پورت شبکه با شماره، آدرس IP اختصاص یافته و نوع پروتکل ارتباطی مانند TCP یا UDP مشخص می‌شود.
پورت در حال شنود یک پورت شبکه است که یک برنامه یا فرآیند به آن گوش می‌دهد و منتظر دریافت اطلاعات از طریق آن پورت است.
هر پورت در حال شنود می‌تواند با استفاده از یک دیوار آتش (Firewall) باز یا بسته (فیلتر شده) باشد. به طور کلی، یک پورت باز یک پورت شبکه است که بسته‌های ورودی (Packet) از مکان‌های دور را می‌پذیرد.
دو سرویس هیچ گاه نمی‌توانند به یک پورت یکسان با یک آدرس IP یکسان شنود کنند؛ به عنوان مثال، اگر یک سرور وب آپاچی در حال اجرا باشد که به پورت‌های 80 و 443 گوش می‌دهد، اگر در همان زمان  Nginx در سیستم خود راه اندازی نمایید، زمانی که بخواهید Nginx را راه اندازی کنید با شکست روبه رو می‌شوید؛ زیرا پورت‌های HTTP و HTTPS در حال استفاده هستند.

 

بررسی پورت در حال شنود با netstat

netstat یک ابزار خط فرمان است که می‌تواند اطلاعات مربوط به اتصالات شبکه را ارائه دهد.
برای لیست کردن کلیه پورت‌های مشغول TCP یا UDP، سرویس‌هایی که از آن پورت‌ها استفاده می‌کنند و وضعیت سوکت از دستور زیر استفاده کنید:

sudo netstat -tunlp

گزینه‌های استفاده شده در این دستور به صورت زیر هستند:
    • -t: نمایش پورت‌های TCP.
    • -u: نمایش پورت‌های UDP.
    • -n: نمایش آدرسهای عددی به جای آدرس میزبان‌ها.
    • -l: تنها نمایش پورت‌های در حال شنود.
    • -p: نمایش PID و نام فرآیند شنونده (این اطلاعات تنها در صورت اجرای دستور به عنوان کاربر root یا sudo نشان داده می‌شود)
در این صورت خروجی چیزی شبیه به خطوط زیر خواهد بود:
 


ستون‌های مهم در این مثال عبارتند از:
    • -Proto: پروتکل استفاده شده توسط سوکت.
    • -Local Address: آدرس IP و شماره پورتی که فرآیند به آن گوش می‌دهد.
    • PID/Program name: PID و نام فرآیند.
اگر می‌خواهید نتایج را فیلتر کنید، از دستور grep استفاده نمایید. به عنوان مثال، برای یافتن اینکه چه فرایندی به TCP 22 گوش می‌کند، می‌توانید از دستور زیر استفاده نمایید:

sudo netstat -tnlp | grep :22

خروجی نشان می‌دهد که در این سیستم، پورت 22 توسط سرور SSH استفاده می‌شود:


اگر خروجی خالی باشد به این معنی است که هیچ چیزی به آن پورت گوش نمی‌دهد.
همچنین می‌توانید لیست را بر اساس ویژگی‌ها، به عنوان مثال، PID، پروتکل، وضعیت و ... فیلتر کنید.
netstat منسوخ شده و با ss و ip جایگزین شده است، اما هنوز هم یکی از پرکاربردترین دستورات برای بررسی اتصالات شبکه است.

بررسی پورت‌های در حال شنود با  ss

ss نسخه جدید netstat بوده و فاقد برخی از ویژگی‌های netstat است، اما وضعیت‌های TCP بیشتری را نشان می‌دهد و کمی سریع تر است. گزینه‌های دستور اکثراً یکسان هستند؛ بنابراین انتقال از netstat به ss دشوار نیست.
برای بدست آوردن لیستی از تمام پورت‌های مشغول با استفاده از  ss، باید دستور زیر را تایپ کنید:

sudo ss -tunlp

در اینصورت خروجی تقریباً مشابه خروجی دستور netstate خواهد بود:

State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port                                                                                        
LISTEN   0        128              0.0.0.0:22             0.0.0.0:*      users:(("sshd",pid=445,fd=3))                                                        
LISTEN   0        100              0.0.0.0:25             0.0.0.0:*      users:(("master",pid=929,fd=13))                                                     
LISTEN   0        128                    *:3306                 *:*      users:(("mysqld",pid=534,fd=30))                                                     
LISTEN   0        128                    *:80                   *:*      users:(("apache2",pid=765,fd=4),("apache2",pid=764,fd=4),("apache2",pid=515,fd=4))   
LISTEN   0        128                 [::]:22                [::]:*      users:(("sshd",pid=445,fd=4))                                                        
LISTEN   0        100                 [::]:25                [::]:*      users:(("master",pid=929,fd=14))                                                     
LISTEN   0        70                     *:33060                *:*      users:(("mysqld",pid=534,fd=33))

 

بررسی پورت‌های مشغول با استفاده از lsof

lsof یک ابزار قدرتمند خط فرمان است که اطلاعات مربوط به باز شده توسط فرایندها را ارائه می‌نماید؛ در لینوکس، همه چیز یک فایل است. شما می‌توانید سوکت را به عنوان فایلی در نظر بگیرید که برای شبکه می‌نویسد.
برای به دست آوردن لیستی از تمام پورت‌های TCP در حال شنود با استفاده از lsof، از دستور زیر استفاده نمایید:

sudo lsof -nP -iTCP -sTCP:LISTEN

گزینه‌های استفاده شده به شرح زیرهستند:
    • -n: شماره پورت‌ها را به نام پورت تبدیل نمی‌کند.
    • -p: به جای نه نیم هاست‌ها آدرسهای عددی را نشان می‌دهد.
    • -iTCP -sTCP:LISTEN: فقط فایل‌های شبکه ای را نشان می‌دهد که وضعیت TCP آن LISTEN است.
 


اکثر نام‌های ستون‌های خروجی کاملاً گویا هستند:
    • COMMAND، PID، USER: نام، pid و کاربری که برنامه مربوط به پورت را اجرا می‌کند.
    • NAME شماره پورت.
برای فهمیدن اینکه چه فرآیندی درحال گوش دادن به یک پورت خاص، به عنوان مثال پورت 3306 است، باید دستور زیر را تایپ نمایید:

sudo lsof -nP -iTCP:3306 -sTCP:LISTEN

خروجی نشان می‌دهد که پورت 3306 توسط سرور MySQL استفاده می‌شود:


برای اطلاعات بیشتر به صفحه lsof man مراجعه کرده و درباره سایر گزینه‌های قدرتمند این ابزار مطالعه کنید.

 

منبع:

How to Check for Listening Ports in Linux (Ports in use)