Manpage de ss
diz:
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
Por favor, dê uma olhada na documentação oficial (pacote Debian iproute-doc) para detalhes sobre filtros.
O que isso significa? Não consigo encontrar nada em /usr/share/doc/iproute2-doc/
.
$ ls /usr/share/doc/iproute2-doc/ss.html
ls: cannot access '/usr/share/doc/iproute2-doc/ss.html': No such file or directory
$ ls /usr/share/doc/iproute2-doc/
actions changelog.Debian.gz copyright examples README README.decnet README.devel README.distribution.gz README.iproute2+tc README.lnstat
O documento também está online em algum lugar para navegação?
Obrigado.
A documentação está disponível no pacote Debian 9, mas foi removida em versões posteriores porque estava desatualizada. A página de manual deve ser a documentação completa agora. (Mas não tem muito a dizer sobre os detalhes dos filtros.)
Então
pode ser expandido para
onde estão as opções
FILTRO DE ESTADO é um dos
e podemos deduzir dos exemplos que EXPRESSION é uma lista de ip-rule SELECTOR s.
Eu estava me perguntando a mesma coisa e as outras respostas e comentários fornecendo um link para a fonte foram incrivelmente úteis.
A
FILTER
sintaxe geral ainda é um pouco confusa, mas com base em um exemplo do Linode mostrando como verificar portas acima do intervalo seguro (raiz necessária) e a fonte, consegui montar um filtro "complexo" para verificar portas abertas em um intervalo específico.Todos esses três exemplos são funcionalmente equivalentes:
Neste caso, a(s) porta(s) que estou procurando estão relacionadas ao VNC, porque as ferramentas Vagrant e Packer da Hashicorp (e as ferramentas de virtualização com as quais interagem como Virtualbox/VMware/libvirt) alocarão automaticamente portas nesse intervalo para máquinas iniciadas "sem cabeça" para que você possa interagir com o console da VM sem apenas enviar pressionamentos de tecla brutos.
A parte que me surpreendeu por um segundo foi que no código-fonte ele tem
GEQ
e ,LEQ
mas a sintaxe do filtro real exige que eles sejam minúsculos ou a representação simbólica>=
ou<=
, enquanto no código-fonte você pode ver queeq
é definido como minúsculo.A outra coisa sorrateira/confusa é que e
=
todos trabalham para a igualdade.eq
==
Isso pode ajudar
https://www.apt-browse.org/browse/ubuntu/trusty/main/all/iproute2-doc/3.12.0-2/file/usr/share/doc/iproute2-doc/ss.html
Utilitário SS: introdução rápida
Alexey Kuznetosv,
some_negative_number, 20 de setembro de 2001[email protected]
ss
é um outro utilitário para investigar sockets. Funcionalmente, NÃO é melhor do quenetstat
combinado com alguns scripts perl/awk e, embora seja certamente mais rápido, não é suficiente para torná-lo muito melhor. :-) Então, pare de ler isso agora e não perca seu tempo. Bem, certamente, ele propõe algumas funcionalidades, que o netstat atual ainda não é capaz de fazer, mas certamente o fará em breve.1. Por quê?
/proc
interface é inadequada, infelizmente. Quando a quantidade de soquetes é grande o suficiente,netstat
ou mesmo simples,cat /proc/net/tcp/
não causa nada além de dores e maldições. No linux-2.4 a doença piorou: mesmo que a quantidade de soquetes seja pequena, a leitura/proc/net/tcp/
é lenta o suficiente.Este utilitário apresenta uma nova abordagem, que deve ser bem dimensionada. Não vou descrever detalhes técnicos aqui e vou me concentrar na descrição do comando. A única coisa importante a dizer é que não é uma má ideia carregar o módulo
tcp_diag
, que pode ser encontrado no diretórioModules
deiproute2
. Se você não fizer issoss
funcionará, mas voltará/proc
e ficará lento comonetstat
, bem, um pouco mais rápido ainda (consulte a seção "Alguns números").2. Notícias antigas
Na forma mais simples
ss
é equivalente ao netstat com alguns pequenos desvios.ss -t -a
despeja todos os soquetes TCPss -u -a
despeja todos os soquetes UDPss -w -a
despeja todos os soquetes RAWss -x -a
despeja todos os soquetes UNIXA opção
-o
mostra o estado dos temporizadores TCP. A opção-e
mostra algumas informações estendidas. Etc. etc. etc. Parece que todas as opções do netstat relacionadas a sockets são suportadas. Embora não AX.25 e outros bizarros. :-) Se alguém quiser, pode fazer suporte para decnet e ipx. Algum suporte rudimentar para eles já está presente no iproute2 libutils, e ficarei feliz em ver esses novos membros.No entanto, a funcionalidade padrão é um pouco diferente:
O primeiro: sem soquetes opcionais
-a
nos estadosTIME-WAIT
eSYN-RECV
também são ignorados. É um padrão mais razoável, eu acho.A segunda: o formato dos soquetes UNIX é diferente. Coincide com tcp/udp. Embora o kernel padrão ainda não permita ver as filas de gravação/leitura e o endereço de peer dos soquetes UNIX conectados, o patch que faz isso existe.
O terceiro: o padrão é despejar apenas soquetes TCP, em vez de todos os tipos.
O próximo: por padrão, ele não resolve endereços de host numéricos (como
ip
)! A resolução é habilitada com a opção-r
. Os nomes de serviço, geralmente armazenados em arquivos locais, são resolvidos por padrão. Além disso, se o banco de dados de serviço não contiver referências a uma porta,ss
consultará systemrpcbind
. Os serviços RPC são prefixados com Arpc.
resolução de serviços pode ser suprimida com a opção-n
.Não aceita opções "longas" (não gosto delas, desculpe). Assim, a família de endereços é fornecida com o identificador da família seguindo a opção
-f
de ser alginada às convenções iproute2. Principalmente, é para permitir que o analisador de opções analise os endereços corretamente, mas como efeito colateral, ele realmente limita o despejo em soquetes que suportam apenas uma determinada família. A opção-A
seguida pela lista de tabelas de soquete para despejar também é suportada. Logicamente, o id da tabela de soquetes é diferente da família _address_, que é outro ponto de incompatibilidade. Então, id é um dosall
,tcp
,udp
,raw
,inet
,unix
,packet
,netlink
. Ver? Bem,inet
é apenas a abreviação detcp|udp|raw
e não é difícil adivinhar quepacket
permite ver sockets de pacotes. Na verdade, existem também algumas outras abreviações, feunix_dgram
seleciona apenas soquetes UNIX de datagrama.O próximo: bem, eu ainda não sei. :-)
3. Hora de falar sobre novas funcionalidades.
É uma filtragem interna de listas de soquetes.
3.1 Filtrando por estado.
ss
permite filtrar estados de soquete, usando palavras-chavestate
eexclude
, seguido por algum identificador de estado.Identificador de estado são nomes de estado TCP padrão (não listados, eles são inúteis para você se você ainda não os conhece) ou abreviações:
all
- para todos os estadosbucket
- para minisockets TCP (TIME-WAIT|SYN-RECV
)big
- todos, exceto minisocketsconnected
- não fechado e não ouvindosynchronized
- conectado e nãoSYN-SENT
Fe para despejar todos os soquetes tcp, exceto
SYN-RECV
:Se nem
state
nemexclude
diretivas estiverem presentes, o filtro de estado assume como padrãoall
com opção-a
ou paraall
, excluindo escuta, syn-recv, time-wait e sockets fechados.3.2 Filtrando por endereços e portas.
A lista de opções pode conter filtro de endereço/porta. É uma expressão booleana que consiste na operação booleana
or
,and
,not
e predicados. Na verdade, todos os tipos de nomes para operações booleanas são consumidos:&
,&&
,|
,||
,!
, mas não se esqueça do sentido especial dado a esses símbolos por shells unix e escape deles corretamente, quando usados a partir da linha de comando.Os predicados podem ser dos seguintes tipos:
Tanto o prefixo quanto a porta podem estar ausentes ou substituídos por
*
, o que significa curinga. O soquete UNIX usa uma correspondência de esquema mais poderosa para nomes de soquete por curingas de shell. Além disso, os prefixos unix: e link: podem ser omitidos, se a família de endereços for evidente no contexto (com opção-x
ou com-f unix
ou com palavra-unix
chave)Fe
são equivalentes e soquete médio conectado a qualquer porta no host 10.0.0.1
soquetes conectados à porta 22 na rede 10.0.0.0...255.
Observe que a porta é separada do endereço por dois pontos, o que cria problemas com endereços IPv6. Geralmente, interpretamos os últimos dois pontos como porta de divisão. Para permitir fornecer endereços IPv6, truques como os usados em URLs HTTP IPv6 podem ser usados:
são soquetes conectados a ::1 em qualquer porta
Outra maneira é
dst ::1
128/. / ajuda a entender que dois pontos fazem parte do endereço IPv6.Agora podemos adicionar outro alias para
dst 10.0.0.1
:dst [10.0.0.1]
. :-)O endereço pode ser um nome DNS. Neste caso todos os endereços são procurados (em todas as famílias de endereços, se não estiver limitado por opção
-f
ou prefixo de endereço especialinet:
,inet6
) e a expressão resultante éor
sobre todos eles.etc.
Todas as relações:
<
,>
,=
,>=
,=
,==
,!=
,eq
,ge
,lt
,ne
... Use a variante que você mais gosta, mas não esqueça de escapar caracteres especiais ao digitá-los na linha de comando. :-)Observe que o número da porta coincide sintaticamente com o caso A! Você pode até adicionar um endereço IP, mas ele não participará da comparação, exceto
==
e!=
, que são equivalentes aos predicados correspondentes do tipo AFedst 10.0.0.1:22
é equivalente adport eq 10.0.0.1:22
enot dst 10.0.0.1:22
é equivalente adport neq 10.0.0.1:22
autobound
. Ele corresponde aos soquetes vinculados automaticamente no sistema local.4. Exemplos
FIN-WAIT-1
para nosso apache na rede 193.233.7/24 e observe seus temporizadores:Ops, esqueci de dizer que a operação lógica ausente é equivalente a
and
.Observe que temos que fazer duas chamadas de ss para fazer isso. A correspondência de estado é sempre ligada à correspondência de endereço/porta. A razão para isso é puramente técnica: ss salta rapidamente de estados não correspondentes antes de analisar endereços e considero a capacidade de pular rapidamente gobs de soquetes time-wait e syn-recv como mais importante do que a generalidade lógica.
Perdão, isso não funciona com o kernel atual, é necessário aplicar patches. Mas ainda podemos olhar para o lado do servidor:
5. Voltando ao solo: manual real
5.1 Argumentos de comando
O formato geral dos argumentos para
ss
é:OPTIONS
OPTIONS
é uma lista de opções de uma única letra, usando convenções unix comuns.-h
- mostrar página de ajuda-?
- o mesmo, claro-v
,-V
- imprimir a versãoss
e sair-s
- imprimir estatísticas de resumo. Esta opção não analisa listas de soquetes obtendo resumos de várias fontes. É útil quando a quantidade de soquetes é tão grande que a análise/proc/net/tcp
é dolorosa.-D FILE
- não exibe nada, apenas despeja informações brutas sobre soquetes TCPFILE
após a aplicação de filtros. SeFILE
é-
stdout
usado.-F FILE
- leia a continuação do filtro deFILE
. Cada linha deFILE
é interpretada como uma única opção de linha de comando. SeFILE
é-
stdin
usado.-r
- tente resolver o endereço/portas numéricos-n
- não tente resolver portas-o
- mostrar algumas informações opcionais, fe temporizadores TCP-i
- mostrar algumas informações específicas para TCP (RTO, janela de congestionamento, limite de início lento etc.)-e
- mostrar ainda mais informações opcionais-m
- show extended information on memory used by the socket. It is available only withtcp_diag
enabled.-p
- show list of processes owning the socket-f FAMILY
- default address family used for parsing addresses. Also this option limits listing to sockets supporting given address family. Currently the following families are supported:unix
,inet
,inet6
,link
,netlink
.-4
- alias for-f inet
-6
- alias for-f inet6
-0
- alias for-f link
-A LIST-OF-TABLES
- list of socket tables to dump, separated by commas. The following identifiers are understood:all
,inet
,tcp
,udp
,raw
,unix
,packet
,netlink
,unix_dgram
,unix_stream
,packet_raw
,packet_dgram
.-x
- alias for-A unix
-t
- alias for-A tcp
-u
- alias for-A udp
-w
- alias for-A raw
-a
- show sockets of all the states. By default sockets in statesLISTEN
,TIME-WAIT
,SYN_RECV
andCLOSE
are skipped.-l
- show only sockets in stateLISTEN
STATE-FILTER
STATE-FILTER
allows to construct arbitrary set of states to match. Its syntax is sequence of keywordsstate
andexclude
followed by identifier of state. Available identifiers are:established
,syn-sent
,syn-recv
,fin-wait-1
,fin-wait-2
,time-wait
,closed
,close-wait
,last-ack
,listen
andclosing
.all
- for all the statesconnected
- all the states except forlisten
andclosed
synchronized
- all theconnected
states except forsyn-sent
bucket
- states, which are maintained as minisockets, i.e.time-wait
andsyn-recv
.big
- opposite tobucket
ADDRESS_FILTER
ADDRESS_FILTER
is boolean expression with operationsand
,or
andnot
, which can be abbreviated in C style f.e. as&
,&&
.Predicates check socket addresses, both local and remote. There are the following kinds of predicates:
dst ADDRESS_PATTERN
- matches remote address and portsrc ADDRESS_PATTERN
- matches local address and portdport RELOP PORT
- compares remote port to a numbersport RELOP PORT
- compares local port to a numberautobound
- checks that socket is bound to an ephemeral portRELOP
is some of<=
,>=
,==
etc. To make this more convinient for use in unix shell, alphabetic FORTRAN-like notationsle
,gt
etc. are accepted as well.The format and semantics of
ADDRESS_PATTERN
depends on address family.inet
-ADDRESS_PATTERN
consists of IP prefix, optionally followed by colon and port. If prefix or port part is absent or replaced with*
, this means wildcard match.inet6
- The same asinet
, only prefix refers to an IPv6 address. Unlikeinet
colon becomes ambiguous, so thatss
allows to use scheme, like used in URLs, where address is suppounded with[
...]
.unix
-ADDRESS_PATTERN
is shell-style wildcard.packet
- format looks likeinet
, only interface index stays instead of port and link layer protocol id instead of address.netlink
- format looks likeinet
, only socket pid stays instead of port and netlink channel instead of address.PORT
is syntacticallyADDRESS_PATTERN
with wildcard address part. Certainly, it is undefined for UNIX sockets.5.2 Environment variables
ss
allows to change source of information using various environment variables:PROC_SLABINFO
to override/proc/slabinfo
PROC_NET_TCP
to override/proc/net/tcp
PROC_NET_UDP
to override/proc/net/udp
Variable
PROC_ROOT
allows to change root of all the/proc/
hierarchy.Variable
TCPDIAG_FILE
prescribes to open a file instead of requesting kernel to dump information about TCP sockets.This option is used mainly to investigate bug reports, when dumps of files usually found in
/proc/
are recevied by e-mail.5.3 Output format
Six columns. The first is
Netid
, it denotes socket type and transport protocol, when it is ambiguous:tcp
,udp
,raw
,u_str
is abbreviation forunix_stream
,u_dgr
for UNIX datagram sockets,nl
for netlink,p_raw
andp_dgr
for raw and datagram packet sockets. This column is optional, it will be hidden, if filter selects an unique netid.The second column is
State
. Socket state is displayed here. The names are standard TCP names, except forUNCONN
, which cannot happen for TCP, but normal for not connected sockets of another types. Again, this column can be hidden.Then two columns (
Recv-Q
andSend-Q
) showing amount of data queued for receive and transmit.And the last two columns display local address and port of the socket and its peer address, if the socket is connected.
If options
-o
,-e
or-p
were given, options are displayed not in fixed positions but separated by spaces pairs:option:value
. If value is not a single number, it is presented as list of values, enclosed to(
...)
and separated with commas. F.e.is typical format for TCP timer (option
-o
).is typical for list of users (option
-p
).6. Some numbers
Well, let us use
pidentd
and a toolibench
to measure its performance. It is 30 requests per second here. Nothing to test, it is too slow. OK, let us patch pidentd with patch from directory Patches. After this it handles about 4300 requests per second and becomes handy tool to pollute socket tables with lots of timewait buckets.So, each test starts from pollution tables with 30000 sockets and then doing full dump of the table piped to wc and measuring timings with time:
Results:
netstat -at
- 15.6 secondsss -atr
, but withouttcp_diag
- 5.4 secondsss -atr
withtcp_diag
- 0.47 secondsNo comments. Though one comment is necessary, most of time without
tcp_diag
is wasted inside kernel with completely blocked networking. More than 10 seconds, yes.tcp_diag
does the same work for 100 milliseconds of system time.