Eu tenho uma instalação debian, onde o OEM tem um monte de processos que não reconheço em execução e quero descobrir se alguma dessas coisas está ligando para casa.
eu corrisudo tcpdump | grep ^e <ssh_ip>
mas o cano continua quebrando. Estou conectado via ssh, e o grep ^e é omitir o ssh ip do meu cliente. Existe uma maneira de monitorar continuamente a conexão de rede para solicitações de saída? Não sei se essa coisa liga para casa, ou onde especificamente é, apenas suspeito que sim, por outro comportamento não relacionado a essa questão.
cano quebrado geralmente significa que a conexão foi interrompida, mas minha conexão ssh está boa, parece ser outra coisa a ver com tcpdump
Em:
Primeiro, isso
^e
tem significados diferentes dependendo do shell.^
é um alias para|
(^
, originalmente renderizado mais como↑
o operador pipe em seu predecessor, o shell Thompson), então você canalizariagrep
parae
comandar lá.fish
versões até 3.2,^
era redirecionar stderr (abreviação de2>
).rc
e derivados,^
é uma espécie de operador de concatenação, entãogrep ^e
se tornariagrepe
.zsh -o extendedglob
,^
é um operador glob de negação, portanto,^e
expandiria para todos os arquivos não ocultos no diretório atual, exceto aquele chamadoe
.csh
/tcsh
/bash
/zsh
,^
é especial apenas no início da linha e somente quando a expansão do histórico não está desabilitada. Então não aqui.^e
seria passado literalmente paragrep
.Portanto, assumindo um desses últimos shells, esse comando iniciaria
sudo tcpdump
egrep ^e <ssh_ip>
simultaneamente com a saída de um conectado à entrada do outro por meio de um tubo.A sintaxe dos
grep
argumentos égrep [<options>] <regular-expression> [<files>]
([...]
indicando partes opcionais). Se não houver arquivo,grep
greps seu stdin¹. As opções começam com o-
caractere.Então, aqui
^e
está a expressão regular e<ssh_ip>
é o arquivo para procurar linhas que correspondam a esse regexp.Como regexp,
^e
corresponde ao início da linha seguido pore
, de modo que informa as linhas que começam come
.Aqui, provavelmente o
<ssh_ip>
arquivo não existe, entãogrep
retornará imediatamente com um erro.Nesse ponto,
tcpdump
o stdout de 's, herdado desudo
's, se tornará um tubo quebrado; portanto, na primeira veztcpdump
que tentar enviar algo, ele receberá um sinal SIGPIPE e morrerá ou, se ignorar esse sinal,write()
falhará com umEPIPE
erro. Aqui, o tcpdump conseguindo escrever uma mensagem de erro sugere que ele ignora esse sinal e relata sua falhawrite()
ou tem um manipulador nele e relata sua recepção antes de terminar.Se você quiser filtrar as linhas que contêm um endereço IP da saída de
tcpdump
, você precisagrep -Fvw <ssh_ip>
de where-F
,-v
e-w
here agrupados em um único argumento e são, respectivamente, paraF
strings fixas em vez de um regexp (para.
corresponder a um literal.
em vez de qualquer caractere único, como ocorre em regexps).v
erse the match: retorna as linhas que não combinam.w
apenas em ords (para não encontrar<ssh_ip>
==10.10.10.10
em, por exemplo).210.10.10.109
Por padrão, quando o tcpdump detecta que sua saída não vai para um terminal, ele reverte para buffer de bloco, portanto, se você quiser ver a saída assim que chegar, provavelmente desejará adicionar a opção tcpdump para reativar
-l
a linha carregando.Mas, de qualquer forma, o tcpdump pode filtrar os pacotes sozinho. Aqui, para excluir os pacotes de/para um determinado endereço IP, basta:
Ou para filtrar apenas o tráfego ssh desse endereço IP:
(supondo que a conexão ssh esteja na porta padrão 22).
Esses filtros (Berkeley Packet Filters, BPF) são compilados em uma expressão de filtro binário passada para o kernel (
setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, filter)
pelo menos no Linux). A filtragem está acontecendo lá, então é realmente menos trabalhoso para o tcpdump e o sistema em geral do que se o tcpdump pedisse todo o tráfego, decodificasse tudo e passasse para o grep.wireshark
, e sua interface de linha de comandotshark
é um aplicativo de análise de tráfego muito mais avançado que você pode querer considerar aqui também. Eles suportam dois tipos de filtro: o BPF como acima chamado de filtro de captura (passado com-f
) e um filtro de exibição (passado com-Y
) aplicado posteriormente nos pacotes retornados pelo kernel usando a própria sintaxe de filtro do wireshark e recursos mais avançados.¹ ou recursivamente no diretório de trabalho atual se as opções
-r
/-R
forem fornecidas em versões recentes da implementação GNU degrep
.