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).