Как да използвате командата ss в Linux

Командата ss е модерен заместител на класическия netstat. Можете да го използвате в Linux, за да получите статистически данни за вашите мрежови връзки. Ето как да работите с този удобен инструмент.

Командата ss срещу netstat

Заместител на остарелите netstat команда, ss ви дава подробна информация за това как вашият компютър комуникира с други компютри, мрежи и услуги.

ss показва статистически данни за Протокол за управление на предаването (TCP), Протокол за потребителска дейтаграма (UDP), Unix (междупроцес)и необработени гнезда. Необработени контакти оперират при мрежово ниво на OSI, което означава, че TCP и UDP заглавките трябва да се обработват от приложния софтуер, а не от транспортния слой. Протокол за интернет контролни съобщения (ICMP) съобщения и пинг и двете помощни програми използват необработени сокети.

Използването на ss

Не е нужно да инсталирате ss, тъй като той вече е част от актуална Linux дистрибуция. Изходът му обаче може да бъде много дълъг – имахме резултати, съдържащи над 630 реда. Резултатите също са много широки.

Поради това сме включили текстови представяния на резултатите, които получихме, тъй като те не биха се побрали в екранна снимка. Подрязахме ги, за да ги направим по-управляеми.

Изброяване на мрежови връзки

Използването на ss без опции от командния ред изброява гнезда, които не слушат. Тоест, той изброява гнездата, които не са в състояние на слушане.

За да видите това, въведете следното:

ss

Netid State Recv-Q Send-Q          Local Address:Port Peer Address:Port   Process
u_str ESTAB 0      0                           * 41826           * 41827
u_str ESTAB 0      0 /run/systemd/journal/stdout 35689           * 35688
u_str ESTAB 0      0                           * 35550           * 35551
...
u_str ESTAB 0      0                           * 38127           * 38128
u_str ESTAB 0      0 /run/dbus/system_bus_socket 21243           * 21242
u_str ESTAB 0      0                           * 19039           * 19040
u_str ESTAB 0      0 /run/systemd/journal/stdout 18887           * 18885 
u_str ESTAB 0      0 /run/dbus/system_bus_socket 19273           * 17306
icmp6 UNCONN 0     0                           *:ipv6-icmp       *:*
udp   ESTAB 0      0         192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps

Колоните са както следва:

  6-те най-добри инструмента за управление на снимки за Linux

Netid: Типът на гнездото. В нашия пример имаме „u_str“, Unix поток, „udp“ и „icmp6“, IP версия 6 ICMP сокет. Можете да намерите още описания на Типове сокети за Linux в man страниците на Linux.
Състояние: Състоянието, в което се намира гнездото.
Recv-Q: Броят на получените пакети.
Send-Q: Броят изпратени пакети.
Локален адрес:Порт: Локалният адрес и порт (или еквивалентни стойности за Unix сокети).
Peer Address:Port: Отдалеченият адрес и порт (или еквивалентни стойности за Unix сокети).

За UDP сокети колоната „Състояние“ обикновено е празна. За TCP сокети може да бъде едно от следните:

СЛУШАЙТЕ: Само от страна на сървъра. Сокетът чака заявка за свързване.
SYN-SENT: Само от страна на клиента. Този сокет направи заявка за свързване и чака да види дали е приета.
SYN-RECEIVED: Само от страна на сървъра. Този сокет чака потвърждение на връзката, след като приеме заявка за свързване.
УСТАНОВЕНО: Сървър и клиенти. Установена е работеща връзка между сървъра и клиента, което позволява прехвърляне на данни между двамата.
FIN-WAIT-1: Сървър и клиенти. Този сокет очаква заявка за прекратяване на връзката от отдалеченото гнездо или потвърждение на заявка за прекратяване на връзката, която преди това е била изпратена от този сокет.
FIN-WAIT-2: Сървър и клиенти. Този сокет чака заявка за прекратяване на връзката от отдалечения сокет.
ЗАТВОРИ-ЧАКАЙТЕ: Сървър и клиент. Този сокет очаква заявка за прекратяване на връзката от локалния потребител.
ЗАТВАРЯВАНЕ: Сървър и клиенти. Този сокет чака потвърждение на заявка за прекратяване на връзката от отдалечения сокет.
ПОСЛЕДНО ОТКАЗВАНЕ: Сървър и клиент. Този сокет чака потвърждение на заявката за прекратяване на връзката, която е изпратила към отдалечения сокет.
ВРЕМЕ-ЧАКАЙТЕ: Сървър и клиенти. Този сокет изпрати потвърждение до отдалечения сокет, за да го уведоми, че е получил искането за прекратяване на отдалечения сокет. Сега чака да се увери, че е получено потвърждението.
ЗАТВОРЕНО: Няма връзка, така че гнездото е прекратено.

Изброяване на гнезда за слушане

За да видим гнездата за слушане, ще добавим опцията -l (слушане), така:

ss -l

Netid State  Recv-Q Send-Q               Local Address:Port                  Peer Address:Port Process 
nl    UNCONN 0      0                             rtnl:NetworkManager/535                * 
nl    UNCONN 0      0                             rtnl:evolution-addre/2987              * 
...
u_str LISTEN 0      4096          /run/systemd/private 13349                            * 0 
u_seq LISTEN 0      4096             /run/udev/control 13376                            * 0 
u_str LISTEN 0      4096             /tmp/.X11-unix/X0 33071                            * 0 
u_dgr UNCONN 0      0      /run/systemd/journal/syslog 13360                            * 0 
u_str LISTEN 0      4096    /run/systemd/fsck.progress 13362                            * 0 
u_dgr UNCONN 0      0    /run/user/1000/systemd/notify 32303                            * 0

Всички тези контакти не са свързани и слушат. „rtnl“ означава маршрутизираща мрежова връзка, която се използва за прехвърляне на информация между процесите на ядрото и потребителското пространство.

  Как да инсталирате Graylog на вашия Linux сървър

Изброяване на всички гнезда

За да изброите всички гнезда, можете да използвате опцията -a (всички):

ss -a

Netid State  Recv-Q Send-Q    Local Address:Port                 Peer Address:Port    Process 
nl    UNCONN 0      0                  rtnl:NetworkManager/535               * 
nl    UNCONN 0      0                  rtnl:evolution-addre/2987 * 
...
u_str LISTEN 0      100       public/showq 23222                            * 0 
u_str LISTEN 0      100      private/error 23225                            * 0 
u_str LISTEN 0      100      private/retry 23228                            * 0 
...
udp   UNCONN 0      0             0.0.0.0:631                         0.0.0.0:* 
udp   UNCONN 0      0             0.0.0.0:mdns                        0.0.0.0:* 
...
tcp   LISTEN 0      128              [::]:ssh                            [::]:* 
tcp   LISTEN 0      5               [::1]:ipp                            [::]:* 
tcp   LISTEN 0      100             [::1]:smtp                           [::]:*

Изходът съдържа всички гнезда, независимо от състоянието.

Изброяване на TCP сокети

Можете също да приложите филтър, така че да се показват само съвпадащи гнезда. Ще използваме опцията -t (TCP), така че ще бъдат изброени само TCP сокети:

ss -a -t

Изброяване на UDP сокети

Опцията -u (UDP) изпълнява същия тип филтриране. Този път ще видим само UDP сокети:

ss -a -u

State  Recv-Q Send-Q    Local Address:Port Peer   Address:Port Process 
UNCONN 0      0               0.0.0.0:631         0.0.0.0:* 
UNCONN 0      0               0.0.0.0:mdns        0.0.0.0:* 
UNCONN 0      0               0.0.0.0:60734       0.0.0.0:* 
UNCONN 0      0         127.0.0.53%lo:domain      0.0.0.0:* 
ESTAB 0       0    192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps 
UNCONN 0      0                   [::]:mdns          [::]:* 
UNCONN 0      0                   [::]:51193         [::]:*

Изброяване на Unix сокети

За да видите само Unix сокети, можете да включите опцията -x (Unix), както е показано по-долу:

ss -a -x

Netid State Recv-Q Send-Q               Local Address:Port  Peer Address:Port    Process 
u_str ESTAB 0      0                                * 41826            * 41827 
u_str ESTAB 0      0                                * 23183            * 23184 
u_str ESTAB 28     0               @/tmp/.X11-unix/X0 52640            * 52639 
...
u_str ESTAB 0      0      /run/systemd/journal/stdout 18887            * 18885 
u_str ESTAB 0      0      /run/dbus/system_bus_socket 19273            * 17306

Изброяване на необработени сокети

Филтърът за необработени сокети е опцията -w (raw):

ss -a -w

Изброяване на IP версия 4 гнезда

Сокетите, използващи протокола TCP/IP версия 4, могат да бъдат изброени чрез опцията -4 (IPV4):

ss -a -4

Изброяване на IP версия 6 гнезда

Можете да включите съответстващия филтър IP версия 6 с опцията -6 (IPV6), както следва:

ss -a -6

Изброяване на сокети по щат

Можете да изброите сокетите според състоянието, в което се намират с опцията за състояние. Това работи с установени, слушащи или затворени състояния. Ще използваме и опцията за разрешаване (-r), която се опитва да раздели мрежовите адреси към имена и портове към протоколи.

  Как да промените потребителските данни с chfn и usermod в Linux

Следната команда ще търси установени TCP връзки и ss ще се опита да разреши имената:

ss -t -r state established

Изброени са четири връзки, които са в установено състояние. Името на хост, ubuntu20-04, е разрешено и „ssh“ се показва вместо 22 за SSH връзката на втория ред.

Можем да повторим това, за да потърсим гнезда в състояние на слушане:

ss -t -r state listening

Recv-Q Send-Q Local Address:Port   Peer Address:Port Process 
0      128        localhost:5939        0.0.0.0:* 
0      4096    localhost%lo:domain      0.0.0.0:* 
0      128          0.0.0.0:ssh         0.0.0.0:* 
0      5          localhost:ipp         0.0.0.0:* 
0      100        localhost:smtp        0.0.0.0:* 
0      128             [::]:ssh         [::]:* 
0      5      ip6-localhost:ipp         [::]:* 
0      100    ip6-localhost:smtp        [::]:*

Изброяване на сокети по протокол

Можете да изброите гнездата, като използвате конкретен протокол с опциите dport и sport, които представляват портовете на дестинацията и източника, съответно.

Пишем следното, за да изброим сокети, използващи протокола HTTPS при установена връзка (обърнете внимание на пространството след отварящата скоба и преди затварящата):

ss -a state established ‘( dport = :https or sport = :https )’

Можем да използваме името на протокола или порта, обикновено асоцииран с този протокол. Портът по подразбиране за Сигурна обвивка (SSH) е порт 22.

Ще използваме името на протокола в една команда и след това ще го повторим, използвайки номера на порта:

ss -a ‘( dport = :ssh or sport = :ssh )’
ss -a ‘( dport = :22 or sport = :22 )’

Както се очакваше, получаваме същите резултати.

Изброяване на връзки към конкретен IP адрес

С опцията dst (дестинация) можем да изброим връзки към конкретен IP адрес на местоназначение.

Пишем следното:

ss -a dst 192.168.4.25

Идентифициращи процеси

За да видите кои процеси използват сокетите, можете да използвате опцията за процеси (-p), както е показано по-долу (обърнете внимание, че трябва да използвате sudo):

sudo ss -t -p

State Recv-Q Send-Q  Local Address:Port   Peer Address:Port  Process 
ESTAB 0      0       192.168.4.28:57650  54.218.19.119:https users:(("firefox",pid=3378,fd=151)) 
ESTAB 0      0       192.168.4.28:ssh     192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))

Това ни показва, че двете установени връзки на TCP сокети се използват от SSH демона и Firefox.

Достоен наследник

Командата ss предоставя същата информация, предоставена преди от netstat, но по по-опростен и достъпен начин. Можете да разгледате man страница за повече опции и съвети.