چندی پیش میخواستم برای netstat مطلبی بنویسم که وقتی قرار شد iproute2 را قلم بزنم دیگر نیاز به این کار ندیدم. زیرا فرمان ss نسخه iproute2 همان netstat بسته net-tools میباشد. وقتی ss را نوشتهاند، به این موضوع دقت بسیاری کردهاند که option های قدیمی تغییر نکنند و شخصی که از netstat مهاجرت میکند، ظرف یک ربع یا کمتر همه مسایل آن را یاد بگیرد.
نکته: یکی از قابلیتهای بزرگ این فرمان، استفاده از فیلتر میباشد که در جلوتر با مثال توضیح داده خواهد شد.
نکته: این فرمان یک زیر فرمان از فرمان ip نمیباشد و به صورت تنها به کار میرود:
1 2 3 4 5 6 7 8 |
# ss -tn State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.6:36910 192.230.65.4:443 ESTAB 0 0 192.168.1.6:50924 185.13.228.84:80 ESTAB 0 0 192.168.1.6:58296 108.177.15.100:443 ESTAB 0 0 192.168.1.6:56430 108.177.15.189:443 ESTAB 0 0 192.168.1.6:33094 198.252.206.25:443 ESTAB 0 0 192.168.1.6:58298 108.177.15.100:443 |
نکته: این فرمان مخفف Socket Statistics میباشد.
۱. کار کردن اولیه با ss
۱.۱ option های ضروری فرمان ss
اگر فقط به دنبال اعداد و ارقام در سطح خلاصه باشیم، میتوان به صورت زیر عمل کرد:
1 2 3 4 5 6 7 8 9 10 11 |
# ss -s Total: 641 (kernel 650) TCP: 16 (estab 4, closed 2, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 650 - - RAW 1 0 1 UDP 15 12 3 TCP 14 9 5 INET 30 21 9 FRAG 0 0 0 |
نکته: در سیستمهای یونیکس، فایلی با عنوان etc/services/ وجود دارد که پورتهای UDP و TCP در آن به یک سرویس نسبت داده شدهاند. این فایل در بسته netbase وجود دارد. در بسته netbase میتوان فایلهای مهم دیگری را نیز پیدا کرد:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# dpkg -L netbase /. /etc /etc/rpc /etc/protocols /etc/services /etc/network /usr /usr/share /usr/share/doc /usr/share/doc/netbase /usr/share/doc/netbase/copyright /usr/share/doc/netbase/changelog.gz |
به صورت پیشفرض تمام پورتها از روی این فایل خوانده میشوند، و اگر بخواهید به صورت numeric خوانده شوند، همانند netstat باید از گزینه n- استفاده نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 |
# ss -lnt State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 80 127.0.0.1:3306 *:* LISTEN 0 50 *:139 *:* LISTEN 0 5 127.0.0.1:81 *:* LISTEN 0 128 *:22 *:* LISTEN 0 50 *:445 *:* LISTEN 0 50 :::139 :::* LISTEN 0 128 :::80 :::* LISTEN 0 32 :::21 :::* LISTEN 0 128 :::22 :::* LISTEN 0 50 :::445 :::* |
همانطور که در چند شماره پیشین مطالب قبلیام اشاره کرده بودم، بهتر است از grep و چیزی که به فرمان دوم نیاز داشته باشد استفاده نکنیم. زیرا برای ماشین overhead ایجاد میکند. به عنوان مثال وقتی میخواهیم به پورتهایی که listen دارند چه بهتر که از l- استفاده نماییم.
نکته: همانطور که در تمام فرمانهای iproute2 دیدید، 4- و 6- برای فیلتر کردن نسخه IP بکار میروند که بسیار مفید میباشند. به عنوان مثال همین فرمان بالا را برای نسخه 4 اگر به کار ببریم اینگونه میشود:
1 2 3 4 5 6 7 |
# ss -4lnt State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 80 127.0.0.1:3306 *:* LISTEN 0 50 *:139 *:* LISTEN 0 5 127.0.0.1:81 *:* LISTEN 0 128 *:22 *:* LISTEN 0 50 *:445 *:* |
نکته: اگر به خاطر داشته باشید، در netstat گزینهای داشتیم که هردوی listening و غیر listening را لیست میکرد. همان گزینه عیناً در ss وجود دارد: a-
خوبی این گزینه برای زمانی است که شما بخواهید از یکسری IP ، معدل بگیرید و یا با گزینههای زیر به کار ببرید:
-
UDP : -u
-
TCP : -t
-
RAW Socket : -w
-
UNIX Socket Domain : -x
-
و دیگر انواع پروتکل ها
-
all
-
inet
-
tcp
-
udp
-
raw
-
unix
-
netlink
-
unix_dgram
-
unix_stream
-
unix_seqpacket
-
packet_raw
-
packet_raw
-
فیلتر بر اساس state
-
فیلتر بر اساس port و address
-
state های TCP
-
state های ترکیبی
-
established
-
syn-sent
-
syn-recv
-
fin-wait-1
-
fin-wait-2
-
time-wait
-
closed
-
close-wait
-
closing
-
last-ack
-
listening
-
all : شامل تمام state های مرتبط میشود.
-
state : bucket های time-wait و syn-recv را شامل میشود.
-
big : تمام state ها را به جز time-wait و syn-recv شامل میشود.
-
connected : شامل تمام state ها به جز closed و listening میشود.
-
synchronized : شامل دو state یکی connected و دیگری syn-sent میشود.
-
dst prefix:port
-
src prefix:port
-
src unix:string
-
src link:protocol:ifindex
-
src nl:channel:pid
-
inet4
-
state established
-
پورتهای کوچکتر از ۱۰۲۴
-
source port : sport
-
destination port : dport
-
eq یا ==
-
> یا lt
-
> یا gt
-
=! یا ne
-
=> یا le
-
=< یا ge
نکته: به سادگی موارد بالا با هم قابل ترکیب میباشند. به مثال زیر دقت نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# ss -lntu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:68 *:* udp UNCONN 0 0 192.168.1.255:137 *:* udp UNCONN 0 0 192.168.1.6:137 *:* udp UNCONN 0 0 *:137 *:* udp UNCONN 0 0 192.168.1.255:138 *:* udp UNCONN 0 0 192.168.1.6:138 *:* udp UNCONN 0 0 *:138 *:* udp UNCONN 0 0 *:161 *:* udp UNCONN 0 0 *:33909 *:* udp UNCONN 0 0 *:5353 *:* udp UNCONN 0 0 *:46317 *:* udp UNCONN 0 0 *:1900 *:* udp UNCONN 0 0 :::35707 :::* udp UNCONN 0 0 ::1:161 :::* udp UNCONN 0 0 :::5353 :::* tcp LISTEN 0 80 127.0.0.1:3306 *:* tcp LISTEN 0 50 *:139 *:* tcp LISTEN 0 5 127.0.0.1:81 *:* tcp LISTEN 0 128 *:22 *:* tcp LISTEN 0 50 *:445 *:* tcp LISTEN 0 50 :::139 :::* tcp LISTEN 0 128 :::80 :::* tcp LISTEN 0 32 :::21 :::* tcp LISTEN 0 128 :::22 :::* tcp LISTEN 0 50 :::445 :::* |
نکته: یکی از گزینههایی که از قلم افتاد، p- بود که به همین نام در netstat وجود دارد و نام برنامه و PID مورد نظر را بر میگرداند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ss -apnu State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:68 *:* users:(("dhclient",pid=1809,fd=6)) UNCONN 0 0 192.168.1.255:137 *:* users:(("nmbd",pid=2075,fd=20)) UNCONN 0 0 192.168.1.6:137 *:* users:(("nmbd",pid=2075,fd=19)) UNCONN 0 0 *:137 *:* users:(("nmbd",pid=2075,fd=17)) UNCONN 0 0 192.168.1.255:138 *:* users:(("nmbd",pid=2075,fd=22)) UNCONN 0 0 192.168.1.6:138 *:* users:(("nmbd",pid=2075,fd=21)) UNCONN 0 0 *:138 *:* users:(("nmbd",pid=2075,fd=18)) UNCONN 0 0 *:161 *:* users:(("snmpd",pid=1808,fd=9)) UNCONN 0 0 *:33909 *:* users:(("avahi-daemon",pid=826,fd=14)) UNCONN 0 0 *:5353 *:* users:(("avahi-daemon",pid=826,fd=12)) UNCONN 0 0 *:46317 *:* users:(("snmpd",pid=1808,fd=11)) UNCONN 0 0 *:1900 *:* users:(("minissdpd",pid=959,fd=4)) |
۲.۱ query گرفتن بر اساس socket:
با گزینه socket– میتوان بر مبنای یک نوع socket خاص query گرفت. لیست سوکتها در ذیل آمدهاند:
نکته: ممکن است بگویید بعضی از گزینههای بالا در option ها همانند t- آمدهاند، اما واقعیت این است که بعضی از آنها یاalias هستند همچون tcp و یا اصلاً وجود ندارد.
نکته: هرگاه بخواهید برای یکی از سوکتهای RAW و یا UNIX socket domain فیلتر بگیرید، به هیچ عنوان از گزینه یا گزینه های 4- یا 6- استفاده ننمایید. زیرا آنها معرف inet4 و inet6 میباشند و وقتی هر دوگزینه را به ss بدهیم، دیگر فیلتر ما اثری ندارد و از هردوی unix_stream و inet family برایمان لیست میکند که این با خواسته ما جور در نمیآید.
۲. استفاده از فیلتر:
فیلترها بر دو نوعند:
۱.۲ فیلتر بر اساس state :
میتوان بر دو اساس فیلتر نمود:
state های TCP :
state های ترکیبی:
نکته: فرمان ss state all مترادف a- میباشد.
نکته: به سادگی میتوان چند state را کنار هم OR کرد:
1 2 3 4 5 6 |
$ ss -n4 state time-wait state close --socket=inet Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port raw UNCONN 0 0 *:1 *:* udp UNCONN 0 0 *:46028 *:* udp UNCONN 0 0 *:730 *:* udp UNCONN 0 0 *:111 *:* |
نکته: اگر از query برای inet استفاده میکنید 4- یا 6- یک اجبار است.
زمانی نیاز داریم تا از یک لیست state ،یکسری از آنها را حذف نماییم بدین منظور فرمان ss کلمهای را فراهم نموده است تا این کار را انجام دهد. به مثال روبرو توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ss -4ntu state all exclude time-wait exclude listening exclude established Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:68 *:* udp UNCONN 0 0 192.168.1.255:137 *:* udp UNCONN 0 0 192.168.1.6:137 *:* udp UNCONN 0 0 *:137 *:* udp UNCONN 0 0 192.168.1.255:138 *:* udp UNCONN 0 0 192.168.1.6:138 *:* udp UNCONN 0 0 *:138 *:* udp UNCONN 0 0 *:161 *:* udp UNCONN 0 0 *:33909 *:* udp UNCONN 0 0 *:5353 *:* udp UNCONN 0 0 *:46317 *:* udp UNCONN 0 0 *:1900 *:* |
در ابتدا با state all هر چه state بود لیست کردیم و از میان آنها ۳ state که با کلمه رزرو شده exclude مشخص کردیم را لیست کردیم و آنها از خروجی حذف میشوند. با این کار دیگر نیازی به state های ترکیبی نمیباشد. وقتی دو گزینه u- و t- را مشخص کردیم بدین معنا بود که فقط از inet family میخواهیم گزارش بگیریم.
۲.۲ فیلتر بر اساس port و address :
فیلترها یکسری rule از نوع boolean هستند که میتوان آنها را با هم && و || و خود آن را ! کرد.
سری اول آنها که برای آدرسها بکار میرود در ذیل لیست شدهاند:
به دو مثال زیر دقت نمایید :
1 2 3 |
ss dst 104.16.115.182:80 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.1.6:42532 104.16.115.182:http |
و همچنین:
1 2 3 4 |
ss state listening src 127.0.0.1:* Netid Recv-Q Send-Q Local Address:Port Peer Address:Port tcp 0 80 127.0.0.1:mysql *:* tcp 0 5 127.0.0.1:81 *:* |
به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 |
$ ss -an4 state established dport lt 1024 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.1.6:38292 198.252.206.25:443 tcp ESTAB 0 0 192.168.1.6:56428 185.13.228.84:80 tcp ESTAB 0 0 192.168.1.6:55510 74.125.133.18:443 tcp ESTAB 0 0 192.168.1.6:37312 74.125.133.113:443 tcp ESTAB 0 0 192.168.1.6:55528 185.11.124.4:443 tcp ESTAB 0 0 192.168.1.6:37624 74.125.133.189:443 |
بین سه وجهه AND ایجاد کرده است:
برای پورتها از دو کلمه زیر استفاده میشود:
همچنین عملگرهای زیر موجودند:
همانطور که دید میتوان از عملگرهای شل مانند استفاده نمود.
یک نکته اساسی در مورد state ها : اصولاً از کلمه exclude زیاد استفاده میشود تا کاربر را به آنچه میخواهد برساند.
آفرين، من هميشه netstat نصب ميكردم طبق عادت، ديروز روي يك دستگاه بودم كه نصب نبود و حسشم نبود كه نصب كنم، گفتم همون آپشن هاي netstat رو با ss بزنيم ببينيم چي ميشه، وقتي جواب داد خيلي حال كردم