آموزش دستور ss در لینوکس 🔍 ( ۱۰ مثال کاربردی برای مانیتورینگ پورت ها و شبکه )
هر مدیر سروری که تجربه مدیریت یک سرور لینوکسی زیر بار ترافیک سنگین یا حملات شبکه را داشته باشد، لحظه ای را به یاد دارد که با وارد کردن دستور قدیمی netstat -anp، ترمینال SSH برای چندین ثانیه قفل شده و هیچ پاسخی نداده است! دلیل این اتفاق ساده است: ابزار قدیمی netstat برای نمایش لیست اتصالات، مجبور است فایل های متنی داخل دایرکتوری مجازی /proc/net/tcp را خط به خط بخواند و تجزیه کند. وقتی سرور شما همزمان ۳۰ هزار اتصال فعال داشته باشد، خواندن این فایل متنی به یک فاجعه پردازشی تبدیل می شود.
دقیقا برای حل همین گلوگاه فنی در کرنل های مدرن لینوکس، ابزار فوق سریع ss ( مخفف Socket Statistics ) به عنوان بخشی از بسته قدرتمند iproute2 متولد شد. دستور ss به جای خواندن فایل های متنی، مستقیما از طریق پروتکل Netlink و ماژول tcp_diag با هسته ( Kernel Space ) لینوکس صحبت می کند و اطلاعات ده ها هزار سوکت شبکه را در کسری از میلی ثانیه روی صفحه نمایش می دهد! در این مستند جامع و کاملا عملی از مگ نگارنوین، قصد داریم علاوه بر کالبدشکافی خروجی این ابزار، ۱۰ مثال کاربردی دستور ss را که هر مهندس شبکه، برنامه نویس و مدیر سرور لینوکس در کار روزمره خود به آن نیاز دارد، به صورت گام به گام بررسی کنیم.
دستور ss در لینوکس چیست و چرا جایگزین قطعی netstat شد؟ 🧠
در توزیع های مدرن لینوکس مانند آلما لینوکس ( AlmaLinux ۸ و ۹ )، راکی لینوکس، اوبونتو و دبیان، بسته قدیمی net-tools ( که شامل دستوراتی مثل ifconfig و netstat بود ) به طور کامل بازنشسته و منسوخ ( Deprecated ) شده است و به صورت پیش فرض نصب نمی شود. در مقابل، دستور ss به صورت پیش فرض روی تمام سرورهای لینوکسی دنیا حضور دارد.
برتری های فنی دستور ss نسبت به ابزارهای نسل قدیم عبارتند از:
- 📌 سرعت خیره کننده در زمان بحران: در زمان وقوع حملات DDoS یا ترافیک های ناگهانی که جدول اتصالات سرور پر می شود،
ssبدون ایجاد کوچک ترین بار اضافی روی CPU، وضعیت لحظه ای شبکه را گزارش می کند. - 📌 فیلترینگ هوشمند در سطح کرنل: شما می توانید بدون نیاز به پایپ کردن ( Pipe ) خروجی به دستور
grep، مستقیما به خود کرنل بگویید که فقط اتصالات مربوط به یک پورت خاص یا یک وضعیت خاص ( مثلSYN-RECV) را استخراج کند. - 📌 نمایش جزئیات عمیق لایه چهارم ( TCP Internals ): دستور
ssاطلاعاتی مثل الگوریتم کنترل ازدحام ( مثل BBR یا Cubic )، زمان رفت و برگشت بسته ( RTT ) و اندازه پنجره TCP را نشان می دهد که درnetstatاصلا وجود نداشتند!
کالبدشکافی ستون های خروجی دستور ss ( راز ستون های Recv-Q و Send-Q ) ⚙️
قبل از اینکه سراغ مثال های عملی برویم، باید بتوانید خروجی این دستور را مثل یک متخصص عیب یابی بخوانید. وقتی دستور پایه ss -tul را می زنید، با ۶ ستون اصلی روبرو می شوید که دو ستون Recv-Q و Send-Q مهم ترین شاخص ها برای کشف گلوگاه های نرم افزاری ( مثل هنگ کردن PHP-FPM یا دیتابیس MySQL ) هستند:
- ستون Netid: نوع پروتکل سوکت را مشخص می کند ( مثل
tcp،udpیاu_strبرای سوکت های داخلی یونیکس ). - ستون State: وضعیت فعلی اتصال را نشان می دهد ( مثل
LISTENبرای پورت های در حال گوش دادن،ESTABبرای اتصالات برقرار شده وTIME-WAITبرای اتصالاتی که منتظر بسته شدن نهایی هستند ). - ستون Recv-Q و Send-Q ( نکته طلایی مدیران سرور ): معنی این دو عدد بسته به اینکه وضعیت پورت روی
LISTENباشد یاESTAB، کاملا تغییر می کند!- 🔹 در حالت LISTEN: عدد
Send-Qنشان دهنده حداکثر ظرفیت صف انتظار ( Backlog ) آن پورت است ( مثلا عدد ۱۲۸ یا ۵۱۱ ) و عددRecv-Qنشان می دهد در همین لحظه چند درخواست اتصال جدید در صف ایستاده اند که وب سرور هنوز فرصت نکرده آن ها را تحویل بگیرد ( Accept کند ). اگر در حالت LISTEN عدد Recv-Q به عدد Send-Q نزدیک شود، یعنی وب سرور شما زیر بار ترافیک کم آورده و کاربران جدید با خطای Connection Timeout مواجه می شوند! - 🔹 در حالت ESTAB ( اتصال فعال ): عدد
Recv-Qمقدار بایت هایی است که از شبکه دریافت شده و در بافر کرنل نشسته اما برنامه شما ( مثل PHP یا Nginx ) هنوز آن را نخوانده است. عددSend-Qنیز بایت هایی است که سرور ارسال کرده اما هنوز تاییدیه دریافت آن ( ACK ) از سمت مرورگر کاربر نرسیده است.
- 🔹 در حالت LISTEN: عدد
- ستون های Local Address:Port و Peer Address:Port: به ترتیب نشان دهنده آی پی و پورت روی سرور خودتان، و آی پی و پورت سیستم کاربر ( یا سرور مقصد ) هستند.
جدول مرجع سوییچ های پرکاربرد دستور ss در خط فرمان SSH 📋
برای اینکه بتوانید سوییچ ها را به راحتی با هم ترکیب کنید ( مثلا ss -tulpn )، جدول زیر معنی دقیق هر حرف را به صورت خلاصه در اختیار شما قرار می دهد:
| سوییچ ( آپشن ) | عملکرد در دستور ss | کاربرد عملی برای مدیر سرور |
|---|---|---|
-t ( یا --tcp ) | نمایش سوکت های پروتکل TCP | بررسی پورت های وب سرور ( ۸۰/۴۴۳ )، SSH، دیتابیس و ایمیل |
-u ( یا --udp ) | نمایش سوکت های پروتکل UDP | بررسی پورت ۵۳ ( DNS )، پروتکل HTTP/۳ ( QUIC ) و زمان سرور ( NTP ) |
-l ( یا --listening ) | فقط نمایش پورت های در حال گوش دادن | پیدا کردن پورت های باز روی سرور بدون شلوغ شدن صفحه با اتصالات کاربران |
-p ( یا --processes ) | نمایش نام برنامه و شماره پردازش ( PID ) | تشخیص اینکه کدام سرویس یا اسکریپت یک پورت خاص را اشغال کرده است |
-n ( یا --numeric ) | عدم تبدیل شماره پورت و آی پی به نام | افزایش شدید سرعت اجرای دستور ( نمایش عدد :80 به جای :http ) |
-a ( یا --all ) | نمایش تمام سوکت ها ( Listening + غیر آن ) | مشاهده همزمان پورت های باز سرور و تمام کاربران متصل به آن ها |
-x ( یا --unix ) | نمایش سوکت های داخلی سیستم ( Unix ) | عیب یابی اتصال وب سرور به فایل های .sock در PHP-FPM، MySQL و Redis |
-4 و -6 | فیلتر کردن بر اساس IPv4 یا IPv6 | خلوت کردن خروجی و تمرکز صرف بر روی آی پی های نسخه چهار یا شش |
۱۰ مثال کاربردی دستور ss برای مدیران سرور و مهندسان شبکه 💻
حالا بیایید وارد محیط ترمینال SSH شویم و ۱۰ سناریوی واقعی که در مدیریت سرورهای لینوکسی با آن ها روبرو می شوید را با هم اجرا کنیم. ( توجه داشته باشید که برای دیدن نام پردازش ها با سوییچ -p، حتما باید با دسترسی root یا sudo دستور را اجرا نمایید ).
مثال ۱: مشاهده تمام پورت های باز و برنامه های پشت آن ها ( دستور طلایی ss -tulpn )
این ترکیب، پرکاربردترین دستور در کل دنیای مدیریت سرور لینوکس است! هر زمان که می خواهید ببینید چه پورت هایی ( چه TCP و چه UDP ) روی سرور شما باز هستند و دقیقا کدام سرویس ( با چه شماره PID ) پشت هر پورت نشسته است، این دستور را بزنید:
ss -tulpn در تصویر واقعی زیر که از محیط ترمینال SSH سرور لینوکس تهیه شده است، خروجی دقیق دستور ss -tulpn و نمایش پورت های وب سرور، دیتابیس و SSH را مشاهده می کنید:

مثال ۲: دریافت گزارش خلاصه وضعیت کل شبکه در یک نگاه ( ss -s )
وقتی سرور شما ناگهان کند می شود، اولین کاری که باید بکنید اجرای دستور زیر است. این دستور در کمتر از یک هزارم ثانیه، آمار کل سوکت های باز، تعداد اتصالات برقرار شده ( estab )، تعداد سوکت های بسته شده در انتظار ( timewait ) و وضعیت صف های SYN را در ۵ خط به شما گزارش می دهد:
ss -s نمونه خروجی این دستور در یک سرور سالم به شکل زیر است:
Total: 482
TCP: 145 (estab 82, closed 48, orphaned 0, timewait 45)
Transport Total IP IPv6
RAW 1 0 1
UDP 12 8 4
TCP 97 78 19
INET 110 86 24
FRAG 0 0 0 💡 نکته عیب یابی: اگر در خط TCP دیدید که عدد orphaned ( سوکت های یتیم که به هیچ برنامه ای وصل نیستند ) یا synrecv به شدت بالا رفته است، مطمئن باشید سرور شما تحت حمله شبکه قرار دارد!
مثال ۳: مشاهده تمام اتصالات فعال TCP و UDP به صورت مجزا
اگر دستور ss را بدون هیچ سوییچی وارد کنید، فقط اتصالات فعال غیر Listening را نشان می دهد. برای اینکه لیست کاملی از تمام اتصالات برقرار شده و در حال گوش دادن پروتکل TCP یا UDP را با شماره آی پی های عددی ببینید، از دستورات زیر استفاده کنید:
# نمایش تمام اتصالات پروتکل TCP روی IPv4
ss -t4an
# نمایش تمام اتصالات پروتکل UDP
ss -uan مثال ۴: فیلتر کردن اتصالات بر اساس وضعیت خاص ( مثل ESTABLISHED یا TIME-WAIT )
یکی از قدرتمندترین ویژگی های دستور ss، موتور فیلترینگ داخلی آن بر اساس ماشین وضعیت TCP ( State Machine ) است. شما می توانید وضعیت هایی مثل established، syn-sent، syn-recv، time-wait، close-wait و closing را مستقیما فیلتر کنید:
# نمایش فقط اتصالاتی که در حال حاضر به طور کامل برقرار هستند
ss -tn state established
# نمایش اتصالاتی که در وضعیت CLOSE-WAIT گیر کرده اند ( نشانه باگ در کدهای برنامه )
ss -tnp state close-wait
# نمایش تمام سوکت ها به جز آن هایی که در وضعیت LISTEN هستند
ss -tn exclude listening مثال ۵: پیدا کردن سرویس اشغال کننده یک پورت خاص ( بدون نیاز به grep )
فرض کنید می خواهید وب سرور NGINX یا لایت اسپید را استارت کنید اما خطا می گیرید که پورت ۸۰ یا ۴۴۳ از قبل اشغال شده است. به جای استفاده از grep که ممکن است اعداد مشابه در ستون های دیگر را هم به اشتباه بیاورد، از فیلتر دقیق sport ( پورت مبدا سرور ) یا dport ( پورت مقصد ) استفاده کنید:
# بررسی اینکه چه برنامه ای روی پورت 80 یا 443 سرور در حال گوش دادن است
ss -tulpn 'sport = :80 or sport = :443'
# بررسی تمام اتصالات خروجی سرور به سمت پورت 25 ( کشف ارسال ایمیل اسپم از سرور! )
ss -tnp 'dport = :25' ( توجه: رعایت کردن فاصله بین علامت = و دو نقطه :80 در داخل کوتیشن الزامی است ).
مثال ۶: ردیابی تمام اتصالات مربوط به یک آی پی یا رنج شبکه خاص
اگر در فایروال یا لاگ های وب سرور متوجه فعالیت مشکوک یک آی پی خاص ( مثلا 192.0.2.55 ) شده اید و می خواهید ببینید این آی پی در همین لحظه چند اتصال فعال به کدام پورت های سرور شما دارد، از کلیدواژه dst ( آدرس طرف مقابل ) یا src ( آدرس روی سرور خودتان ) استفاده کنید:
# نمایش تمام اتصالات فعال از سمت آی پی 192.0.2.55 به سرور ما
ss -tnp dst 192.0.2.55
# نمایش تمام اتصالات مربوط به یک ساب نت کامل روی پورت SSH
ss -tn dst 192.0.2.0/24 'sport = :22' مثال ۷: استخراج اطلاعات درونی کرنل، تایمرها و الگوریتم ازدحام ( ss -ti )
این مثال مخصوص مهندسان ارشد شبکه و متخصصان بهینه سازی سرعت سرور است! با اضافه کردن سوییچ -i ( اطلاعات داخلی TCP ) و -o ( تایمرهای شبکه )، کرنل لینوکس اطلاعات شگفت انگیزی را زیر هر اتصال چاپ می کند:
ss -tino state established در خط دوم هر اتصال، عباراتی مثل bbr یا cubic ( نوع الگوریتم کنترل ازدحام فعال روی سرور )، عبارت rtt:24.5/12.2 ( پینگ و زمان رفت و برگشت بسته به میلی ثانیه به همراه نوسان یا Jitter ) و cwnd:10 ( پنجره ازدحام ) را خواهید دید که برای عیب یابی کندی دانلود و آپلود روی سرور بی نظیر است.
مثال ۸: بررسی سوکت های داخلی یونیکس ( عیب یابی خطای ۵۰۲ در PHP-FPM و MySQL )
در سرورهای مدرن و پرسرعت، ارتباط بین وب سرور ( LiteSpeed یا Nginx ) با پردازشگر PHP 8.4 یا دیتابیس MySQL / MariaDB و کش Redis از طریق پورت شبکه انجام نمی شود؛ بلکه از طریق فایل های سوکت داخلی لینوکس ( Unix Domain Sockets ) انجام می گیرد که سرعت بسیار بالاتری دارند. برای دیدن لیست تمام فایل های .sock فعال و بررسی پر نشدن صف آن ها، دستور زیر را بزنید:
ss -xlpn | grep -E 'php|mysql|redis' مثال ۹: شناسایی حملات DDoS و SYN-Flood با ترکیب دستور ss و awk 🛡️
وقتی یک هکر حمله SYN-Flood به سمت سایت شما روانه می کند، هزاران بسته نیمه کاره می فرستد تا سرور را در وضعیت SYN-RECV نگه دارد. همچنین در حملات لایه هفت ( HTTP Flood )، یک آی پی صدها اتصال همزمان به پورت ۸۰ یا ۴۴۳ باز می کند.
با اجرای این دو خط کد طلایی در ترمینال SSH، می توانید در ۱ ثانیه مچ آی پی های مهاجم را بگیرید و ببینید کدام آی پی ها بیشترین تعداد اتصال همزمان را به سرور شما زده اند:
# ۱. شمارش تعداد سوکت های نیمه باز SYN-RECV ( تشخیص حمله SYN-Flood )
ss -tn state syn-recv | wc -l
# ۲. لیست کردن ۱۰ آی پی که بیشترین اتصال همزمان به پورت 80 و 443 دارند ( از زیاد به کم )
ss -tn 'sport = :80 or sport = :443' | awk 'NR>1 {print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 10 در تصویر واقعی زیر، نحوه اجرای این اسکریپت ترکیبی در محیط SSH و شناسایی آی پی مهاجمی که صدها اتصال همزمان به وب سرور برقرار کرده است را مشاهده می کنید:

مثال ۱۰: مانیتورینگ زنده و لحظه ای وضعیت سوکت های سرور با دستور watch
اگر در حال اعمال تغییرات روی فایروال هستید یا می خواهید در زمان اوج بازدید سایت، تغییر تعداد اتصالات سرور را مثل یک داشبورد زنده روی مانیتور خود تماشا کنید، دستور ss را با ابزار watch ترکیب نمایید تا هر ۱ ثانیه یک بار صفحه به صورت خودکار رفرش شود:
watch -n 1 "ss -s && echo '--- Active Web Connections ---' && ss -tn 'sport = :443' state established | wc -l" نقش بهینه سازی سوکت های کرنل در سرعت سرورهای نگارنوین 🚀
یادگیری ۱۰ مثال کاربردی دستور ss به شما نشان می دهد که در زیر پوست یک وب سایت، چه ترافیک عظیمی از سوکت های شبکه و یونیکس در جریان است. اگر مقادیر پیش فرض کرنل لینوکس ( در فایل /etc/sysctl.conf ) مثل ظرفیت صف somaxconn یا بازیافت سوکت های tw_reuse به درستی تیونینگ نشده باشند، حتی با داشتن قوی ترین سخت افزار نیز در زمان افزایش بازدید با پر شدن ستون Recv-Q و کندی شدید سایت روبرو خواهید شد.
ما در نگارنوین، تمام سرورهای مجازی، سرورهای اختصاصی و هاست های ابری خود را با تیونینگ سطح کرنل ( Kernel-Level Tuning ) آماده سازی کرده ایم. در زیرساخت میزبانی نگارنوین بر بستر سیستم عامل فوق پایدار آلما لینوکس ( AlmaLinux ) و کنترل پنل cPanel / WHM، الگوریتم کنترل ازدحام TCP BBR به صورت پیش فرض فعال است تا بسته های اطلاعاتی با کمترین تاخیر ممکن به دست کاربران ایرانی برسند.
علاوه بر این، ارتباط بین وب سرور تجاری لایت اسپید ( LiteSpeed Enterprise ) و پردازشگر مدرن PHP 8.4 در سایت های وردپرس ( نسخه ۷.۱ ) از طریق سوکت های فوق سریع LSAPI انجام می شود که هیچ گونه سرباری روی پورت های شبکه ایجاد نمی کند و در کنار آن، فایروال هوش مصنوعی Imunify360 به طور ۲۴ ساعته سوکت های مشکوک را رصد کرده و حملات DDoS را پیش از پر شدن صف کرنل در نطفه خفه می کند.
سوالات متداول درباره دستور ss در لینوکس ( FAQ ) 💡
۱. چرا وقتی دستور ss -tulpn را می زنم، نام برنامه ها و PID نمایش داده نمی شود؟
به دلایل امنیتی در هسته لینوکس، یک کاربر عادی ( Non-root ) اجازه ندارد ببیند کدام پردازش های سیستمی متعلق به کاربران دیگر روی پورت ها گوش می دهند. برای اینکه ستون Process و شماره PID در خروجی نمایش داده شود، حتما باید دستور را با کاربر root یا به صورت sudo ss -tulpn اجرا کنید.
۲. آیا می توانیم با استفاده از دستور ss یک اتصال باز و مزاحم را مستقیما قطع ( Kill ) کنیم؟
بله! یکی از قابلیت های کمتر شناخته شده اما فوق العاده در نسخه های جدید ss، سوییچ -K ( یا --kill ) است. اگر بخواهید بدون ری استارت کردن کل وب سرور یا SSH، فقط اتصال فعال یک آی پی مهاجم ( مثلا 192.0.2.55 ) را در سطح کرنل قطع کنید، می توانید دستور ss -K dst 192.0.2.55 را با دسترسی روت اجرا نمایید.
۳. بالا بودن تعداد سوکت های TIME-WAIT در خروجی دستور ss -s نشانه چیست؟
وضعیت TIME-WAIT زمانی رخ می دهد که اتصال TCP بسته شده است، اما کرنل لینوکس پورت را برای حدود ۶۰ ثانیه رزرو نگه می دارد تا اگر بسته سرگردانی در شبکه جا مانده بود، با اتصال بعدی قاطی نشود. در وب سرورهای پرترافیک، داشتن چند صد یا چند هزار سوکت TIME-WAIT کاملا طبیعی است؛ اما اگر این عدد به ده ها هزار رسید، باید پارامتر net.ipv4.tcp_tw_reuse = 1 را در فایل sysctl.conf فعال کنید.
۴. چگونه دستور ss را در سیستم عامل لینوکس نصب کنیم؟
خبر خوب این است که نیازی به نصب جداگانه ندارید! ابزار ss بخشی از بسته بنیادی iproute2 است که از کرنل های نسخه ۲.۶ به بعد، به صورت پیش فرض روی ۱۰۰ درصد توزیع های لینوکس ( از آلما لینوکس و سنت او اس گرفته تا اوبونتو و دبیان ) نصب و فعال می باشد.
جمع بندی و منبع
در این راهنمای جامع و تجربی، با ساختار درونی ابزار ss آشنا شدیم و دیدیم که چرا این دستور به دلیل ارتباط مستقیم با کرنل از طریق Netlink، جایگزین قطعی دستور قدیمی netstat شده است. با تسلط بر ۱۰ مثال کاربردی دستور ss، از جمله دستور طلایی ss -tulpn برای کشف پورت های باز، دستور ss -s برای ارزیابی سریع سلامت شبکه، خواندن ستون های Recv-Q و اجرای اسکریپت های ترکیبی برای شناسایی آی پی های مهاجم در حملات DDoS، اکنون می توانید شبکه سرور لینوکس خود را با دقتی در سطح مهندسان ارشد دیتاسنتر مدیریت و عیب یابی کنید.
شما در کار روزمره با سرورهای لینوکسی بیشتر از کدام ترکیب سوییچ های ss استفاده می کنید؟ اگر در تحلیل خروجی سوکت های سرور خود با وضعیت غیرعادی یا اعداد بالای Recv-Q روبرو شده اید، خروجی دستور خود را در بخش نظرات همین مقاله قرار دهید تا کارشناسان لینوکس نگارنوین به سرعت آن را برای شما تحلیل و عیب یابی کنند.
منبع آموزشی: نگارنوین ( negarnovin.com )