Στο σημερινό άρθρο θα δούμε τα στατιστικά του δικτύου μας με το λογισμικό SS. Σύμφωνα με τους ειδικούς, η διαφορά με το netstat είναι ότι το ss σας επιστρέφει περισσότερες πληροφορίες γύρω από το TCP stack.
Θυμάστε την εντολή netstat; Πάει πέθανε!
Εδώ και αρκετό καιρό σε αρκετές διανομές έχει γίνει deprecated και θεωρείται πλέον obsolete. Προφανώς και εξακολουθεί να χρησιμοποιείται κανονικά ακόμα και σήμερα, (υπάρχει backward compatibility) ωστόσο, ο κόσμος πάει μπροστά και εμείς πρέπει να τον ακολουθούμε. Αντί για netstat λοιπόν το νέο utility λέγεται ‘ss‘ και σημαίνει ‘socket statistics‘.
Σαν νέο εργαλείο λοιπόν, κάντε αυτό που κάνει όλος ο κόσμος: RTFM :)
man ss
ή δείτε στα γρήγορα τις παραμέτρους με τις περιγραφές τους με την –help
Εισαγωγή στα στατιστικά δικτύου με το λογισμικό SS
Το ss, by default σας δείχνει τις συνδέσεις που έχουν γίνει ήδη established (τις οποίες ονομάζει ‘open non-listening sockets‘). Σημ: στα παρακάτω παραδείγματα δεν θα δείξω ολόκληρο το output, αλλά μόνο ότι χρειάζεται για τον εκπαιδευτικό χαρακτήρα του άρθρου. Εκτελούμε λοιπόν την εντολή:
ss Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port ... tcp ESTAB 0 0 10.10.10.1:ssh 10.10.10.2:58242 ...
Όπως βλέπετε, στο σύστημά μου έχω μία σύνδεση (tcp) που βρίσκεται ενεργή αυτή την στιγμή (ESTAB). Η IP μου είναι 10.10.10.1 και το service είναι ssh. Κάποιος έχει συνδεθεί σε μένα λοιπόν, ο οποίος έχει IP 10.10.10.2 και port 58242.
Επίσης δοκιμάστε την εντολή ss με τις παραμέτρους -n και -r για πιο human friendly output. Με το -n μας δείχνει το port number αντί να προσπαθεί να κάνει resolve το όνομά του service. Δηλαδή, στο συγκεκριμένο παράδειγμα μας δείχνει την πορτα 22 αντί της λέξης ‘ssh’.
ss -n Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port ... tcp ESTAB 0 0 10.10.10.1:22 10.10.10.2:58242 ...
Με το -r κάνει resolve το hostname:
ss -r Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port ... tcp ESTAB 0 0 server.fritz.box:22 client.fritz.box:58242 ...
Παραμετροποίηση εξόδου
Κοιτώντας το man page, το πρώτο παράδειγμα που έχει είναι ss -t -a το οποίο μας δείχνει όλα τα open TCP connections που έχουμε στο σύστημά μας (δηλ και τα ESTAB και τα LISTEN). Οπότε περιμένουμε να δούμε κάτι σαν αυτό:
ss -t -a Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port ... LISTEN μπλα μπλα μπλα LISTEN ESTAB ESTAB LISTEN ESTAB ...
καταλαβαίνουμε λοιπόν ότι το -t μας δείχνει τα TCP connections. Με την προσθήκη το -a δεν κάνει κανένα filtering και μας τα δείχνει όλα ανεξαρτήτως του state (ESTAB ή LISTEN). Σημ: Στην αρχή του άρθρου σας είπα ότι by default, το ss δείχνει μόνο τα ESTAB, οπότε αν θέλουμε να πάρουμε όλα τα ESTAB TCP, δεν θα χρησιμοποιήσουμε το -a, και η εντολή θα είναι ss -t.
ss -t Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port ... ESTAB μπλα μπλα ESTAB ...
Αν θέλω να κάνω το ανάποδο, δηλαδή να μου δείξει όλα τα LISTENING TCP, τότε θα χρησιμοποιήσουμε την -l:
ss -l Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port ... LISTEN μπλα μπλα LISTEN ...
Διερεύνηση συνδέσεων
Για να δείτε τους timers και το keepalive, μπορείτε να βάλετε την παράμετρο -ο.
ss -t -o ... tcp ESTAB 0 0 server.fritz.box:22 client.fritz.box:58242 timer:(keepalive,26min,0) ...
Για να καταλάβετε γιατί είναι χρήσιμο αυτό, σκεφτείτε το παρακάτω σενάριο: Όπως είδατε πριν, ο υπολογιστής client.fritz.box είναι συνδεμένος μέσω SSH στον server.fritz.box. Αν πάω εγώ στον server και κλείσω το sshd (πχ systemctl stop sshd) τότε αυτό δεν σημαίνει ότι αυτόματα θα γίνει διακοπή στην σύνδεση του client με το σύστημά μου. Θα εξακολουθεί να είναι ενεργή μέχρι να σταλθεί το επόμενο keepalive message, το οποίο θα γίνει σε 26 λεπτά. Τότε, δεν θα πάρει απάντηση (αφού το service θα είναι κλειστό) και έτσι θα τερματίσει την σύνδεση.
Ένα άλλο σενάριο που χρησιμοποιώ καθημερινά είναι να φιλτράρω συγκεκριμένες ports και να δω αν υπάρχει κάποιο established connection πάνω τους. Για παράδειγμα αν θέλω να δω τι συμβαίνει αποκλειστικά και μόνο στην port 22, τότε δίνω:
ss -tn sport = :22 tcp ESTAB 0 0 10.10.10.1:22 10.10.10.2:58242 tcp ESTAB 0 0 10.10.10.1:22 10.10.10.3:58252 tcp ESTAB 0 0 10.10.10.1:22 10.10.10.4:58268
Σημ: προσέξτε ότι έβαλα το -n για να μπορώ να κάνω στην ουσία grep για την port 22
Στο παραπάνω παράδειγμα βλέπω ότι έχω 3 ενεργές συνδέσεις στην port 22, που είναι το ssh. Για να γίνει αυτό, σημαίνει προφανώς ότι έχω ανοιχτή την port 22 να περιμένει συνδέσεις, σωστά; Για να το επαληθεύσουμε:
ss -t -l | grep ssh LISTEN 0 128 *:ssh *:* LISTEN 0 128 :::ssh :::*
όντως λοιπόν το σύστημά μου δέχεται SSH connections τόσο για IPv4 όσο και για IPv6. Η παραπάνω εντολή μπορεί να εκτελεστεί και με το port number αντί για το ssh string:
ss -tn -l | grep :22 LISTEN 0 128 *:22 *:* LISTEN 0 128 :::22 :::*
γενικά μην κολλάτε σε αυτό, και διαλέξτε όποιον τρόπο θέλετε εσείς.
Επίλογος
Πάνω-κάτω αυτά είναι τα αρκετά βασικά που θα πρέπει να γνωρίζει κανείς γύρω από την ss. Όμως για να πω την αλήθεια το βρίσκω κάπως δύσκολο να πρέπει να θυμάμαι όλες αυτές τις παραμέτρους, οπότε προσπαθήστε να χρησιμοποιείτε όσο λιγότερες παραμέτρους γίνεται και να έχετε μνημονικούς κανόνες.
ss -t
το -t είναι σχετικά εύκολο να το θυμάστε (λόγω TCP). Γιατί έτσι μπορείτε να θυμάστε και το αντίστοιχο -u (για UDP connections). Το όλο τρικ της υπόθεσης είναι να γνωρίζετε εκ των προτέρων ότι η ss σας δείχνει by default μόνο τις ESTABLISHED connections, οπότε αν θέλετε να τις δείτε όλες, απλά προσθέστε το -a (λόγω του all). Όσον αφορά το -l το βρίσκω κάπως περιττό να το θυμάται κανείς, μπορείτε απλά να κάνετε grep ‘LISTEN’ ως pipe στην -a δηλαδή: ‘
ss -t -a | grep LISTEN
Αυτό που δεν μπορώ με τίποτα να θυμάμαι είναι η σύνταξη της τελευταίας εντολής (ss -tn sport = :22). Έναντι αυτής χρησιμοποιώ πάλι το grep με τις εξής παραλαγές:
ss -t | grep ssh ss -tr | grep ssh (για να μου δείχνει το hostname)
ή αν δεν θυμάμαι το ονομα του service που αναλογεί στην port, αλλά θελω να δω για μία συγκεκριμένη port, χρησιμοποιώ την παράμετρο -n
ss -tn | grep :22 ss -tnr | grep :22
Εγώ αυτό που κάνω συνήθως είναι να θυμάμαι μόνο μία εντολή: ss -tar γιατί θυμάμαι το tar. Εσεις αν θέλετε αλλάξτε το σε ‘-rat’ :P
Πολύ χρήσιμο το άρθρο, ομολογώ ότι δεν είχα ψάξει το θέμα ss (ντροπή μου).
καλά μην φανταστείς…. και εγώ είχα σκαλώσει με το netstat τόσα χρόνια… :P