Terminal pogryzł człowieka: ss

Po co nam ss skoro nadal mamy polecenie netstat? Ano po to, by w pewnym momencie w przyszłości nie obudzić z krzykiem z sennego koszmaru w którym Netstat odszedł na zapowiadaną emeryturę. Netstat wchodzący w skład pakietu net-tools już od jakiegoś czasu jest na cenzurowanym. Nie to, żeby nie działał. Ale w zasadzie wszystkie narzędzia wchodzące w skład wspomnianego pakietu wykazują śladowe ślady rozwój. Dlatego – wszyscy uczymy się posługiwać ss.

Ss to nic innego jak skrót od socket statistics. W przeciwieństwie do netstata obrabiającego dane z /dev oraz /proc, ss pozyskuje informacje na temat połączeń prosto z kernela. A uściślając – przez interfejs Netlinka. Dzięki temu ma działać szybciej (ale chyba tylko w przypadku ogromnej ilości połączeń) i wyświetlać więcej informacji. Ta druga teza nie jest przypadkowa i istnieją odpowiednie dowody na jej podtrzymanie. Do tego wszystkiego ss wydaje się mieć nieco lepiej przemyślaną składnię. Ale od początku.

Netstat jak wszystkim wiadomo wyświetla informacje na temat połączeń nawiązanych przez nasz komputer z internetem, internetu z naszym komputerem. Tak oględnie mówiąc, bowiem dociekliwi mogą dopominać się o uzupełnienie tej definicji o informacje dotyczące programów utrzymujących połączenie (procesów), portów na których nasłuchują usługi aż po stan wewnętrznych socketów. Polecenie ss wyświetla dokładnie takie same dane. Może w nieco innej formie, może nieco lepiej opisane, ale zasadniczo to nadal to samo. Elementem wiodącym są informacje na temat połączeń TCP, UDP oraz Unix (sockety) – odpowiednio parametry t, u, x.

$ ss -t
State      Recv-Q Send-Q             Local Address:Port                              Peer Address:Port                
ESTAB      0      0                  192.168.43.60:32856                            34.235.211.27:https                            
ESTAB      0      0                  192.168.43.60:52874                           192.150.83.105:https                
ESTAB      0      0                  192.168.43.60:52872                           192.150.83.105:https                                  
ESTAB      0      0                  192.168.43.60:38660                           34.215.106.225:https 

Domyślnie wyświetlane są połączenia typu ESTABLISHED i CONNECTED. Jeżeli chcemy podejrzeć porty w stanie LISTENING (oczekujące na połączenie), należy użyć opcji l lub a dla wszystkich połączeń.

$ ss -lt
State      Recv-Q Send-Q             Local Address:Port                              Peer Address:Port                
LISTEN     0      128                            *:sunrpc                                       *:*                    
LISTEN     0      5                      127.0.1.1:domain                                       *:*                    
LISTEN     0      5                      127.0.0.1:ipp                                          *:*                    
LISTEN     0      128                           :::sunrpc                                      :::*                    
LISTEN     0      50                            :::1716                                        :::*                    
LISTEN     0      5                            ::1:ipp                                         :::*                    

Parametry r oraz n określają, czy chcemy otrzymać w wyniku rozwiązane nazwy czy też nie:

$ ss -rlu
State      Recv-Q Send-Q             Local Address:Port                              Peer Address:Port                
UNCONN     0      0                              *:35693                                        *:*                    
UNCONN     2688   0                              *:bootpc                                       *:*                    
UNCONN     0      0                              *:rpc.portmapper                               *:*                    
UNCONN     0      0                              *:ipp                                          *:*                    
UNCONN     0      0                              *:755                                          *:*                    
UNCONN     8960   0                              *:mdns                                         *:*                    

Z kolei p wyświetli nazwę procesu utrzymującego dane połączenie, o natomiast informacje o czasu połączenia.

$ ss -port
State      Recv-Q Send-Q             Local Address:Port                              Peer Address:Port                
ESTAB      0      0                          xpees:38732                           trututu.com:imaps                 users:(("claws-mail",pid=11232,fd=19))
ESTAB      0      0                          xpees:52874                           192.150.83.105:https                 users:(("firefox",pid=2686,fd=222)) timer:(keepalive,668ms,0)
ESTAB      0      0                          xpees:52872                           192.150.83.105:https                 users:(("firefox",pid=2686,fd=200)) timer:(keepalive,2min34sec,0)
ESTAB      0      0                          xpees:38660                ec2-34-215-106-225.us-west-2.compute.amazonaws.com:https                 users:(("firefox",pid=2686,fd=65)) timer:(keepalive,4min29sec,0)

Jeżeli interesują nas konkretne porty to wystarczy skorzystać z dst oraz src i numeru portu po dwukropku:

$ ss -t dst :443
State      Recv-Q Send-Q             Local Address:Port                              Peer Address:Port                
ESTAB      0      0                  192.168.43.60:59440                           215.101.201.55:https                

Za pomocą dst oraz src możemy również określić interesujące nas adresy IP (już bez dwukropka).

Co więcej, zapytania można rozbudowywać za pomocą warunków logicznych. W tym przypadku w akcji dport oraz sport:

$ ss -at '( dport = :ssh or sport = :ssh )'
State      Recv-Q Send-Q    Local Address:Port        Peer Address:Port   
LISTEN     0      128                   *:ssh                    *:*       
LISTEN     0      128                  :::ssh                   :::*

Skąd dport i sport? Ano z dokumentacji iproute2-doc. Najlepiej zainstalować i przekonać się samemu, jak zgrabnie można formułować regułki.

Na tym oczywiście nie koniec. Ss potrafi wyświetlić informacje o połączenia IPV4 (-4) lub IPV6 (-6), statystyki (-s), a wespół z poleceniem watch uzyskamy wiarygodny monitor sieci:

$ watch ss -tp

Co należy zrobić, aby cieszyć się z oferowanych przez ss możliwości? To proste. Zainstalować pakiet iproute2, który w większości przypadków jest „w zestawie” w każdej popularnej dystrybucji (tzn. jest instalowany domyślnie).