despejar conexões tcp sem tcpdump

17

Em uma caixa de centos, gosto de despejar conexões tcp - gostaria de ver se um servidor tenta enviar solicitações para um determinado IP. Normalmente, o tcpdump faria o truque - mas o tcpdump não está instalado e a instalação de software não é uma opção (devido à política da empresa). Receio que o netstat não me mostre uma única solicitação.

Então, eu queria saber quais outras opções eu tenho. Eu tenho acesso root no servidor.

Isaac
fonte
Você tem acesso root no servidor?
user9517
Sim, eu tenho acesso root.
Isaac
11
Você também deve trabalhar para corrigir a política da empresa. Quando o impede de fazer seu trabalho, a política é quebrada.
Michael Hampton
11
Bem, a mudança controlar seu basicamente um requisito FDA - para que nada do que eu vai mudar nesta vida :)
Isaac

Respostas:

15

Certamente você tem python?

from socket import * 
from struct import unpack 
import sys 

INTERFACE = "eth0"
TARGET = "8.8.8.8" 

if __name__ == "__main__": 
  sock = socket(AF_PACKET, SOCK_DGRAM, 0x0800) 
  sock.bind((INTERFACE, 0x0800)) 
  while True: 
    data = sock.recvfrom(1500, 0)[0] 
    ip = inet_ntop(AF_INET, data[12:16]) 
    if ip == TARGET: 
      print "GOT TARGET" 
      sys.exit(1)

Isso sairá com "GOT TARGET", fornecendo o endereço IP retornando correspondências. Como o TCP precisa enviar algo de volta durante um aperto de mão, isso deve capturar qualquer coisa de um endereço de destino específico. Não importa se o protocolo é TCP ou UDP (nem eu verifico).

Não se esqueça de alterar o TARGET e o INTERFACE.

Matthew Ife
fonte
Como você modificaria isso para também capturar um pacote tcp syn? Porque se o destino não for alcançável, uma conexão tentada mas com falha não será exibida.
Isaac
3
Esse script não é um novo software (não deve ser instalado no sistema)?
Vi.
@ Vi com essa lógica, você pode argumentar que qualquer script de shell é 'novo software'. Depende de como você define 'software'.
Matthew Ife
11
-1 Desculpe, esta é uma solução terrível. Não apenas está matando um frango com uma metralhadora (escrevendo um programa para fazer o que já existe uma solução), mas também um loop infinito - consumindo desnecessariamente recursos da CPU (execute uma trilha no processo python ... mas aguarde a tecla Control-C!), falha ao resolver adequadamente a pergunta do usuário: Ele responderá "OBTER TARGET" às conexões TCP de entrada e de saída (o usuário solicitou "tenta enviar solicitações ..."). Finalmente, ele sai com 1 (indicando falha no shell) após o sucesso.
Mike S
11
muito legal, mas você ainda precisa de permissões elevadas para isso. Eu tenhosocket.error: (1, 'Operation not permitted')
Grant Bowman
17

Eu realmente tentaria obter o tcpdump. Dito isto, algumas alternativas para verificar se existe uma certa conexão para um IP são:

strace:

[kbrandt@ny-kbrandt01: ~] strace -e trace=network nc 1.2.3.4 1234
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress)

lsof:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11434
[kbrandt@ny-kbrandt01: ~] lsof -p 11434
....
nc      11434 kbrandt    3u  IPv4 4543149      0t0     TCP 10.7.0.78:58886->1.2.3.4:search-agent (SYN_SENT)

netstat:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11486
[kbrandt@ny-kbrandt01: ~] sudo netstat -a -p | grep 11486
tcp        0      1 10.7.0.78:58891             1.2.3.4:search-agent        SYN_SENT    11486/nc
Kyle Brandt
fonte
11
Esse era o tipo de resposta que eu esperava. Infelizmente, o strace também não está instalado: /
Isaac
Vou tentar lsof
Isaac
11
Eu acho que o pôster original gostou da resposta, mas, estranhamente, ele realmente não responde à sua pergunta ("... conexões tcp - eu gostaria de ver se um servidor tenta enviar solicitações para um determinado IP ...). fornecer informações de conexão de rede para um processo específico ... talvez ele queira isso? Para aqueles como eu, que vêm aqui procurando informações sobre conexões TCP de uma máquina para a seguinte, isso pode não ser o suficiente. diferentes exemplos de comando shell que lhe permitem reunir informações sobre suas conexões de rede.
Mike S
15

O Iptables possui um recurso de depuração e também pode ser usado para análise de tráfego.

A solução está descrita no URL abaixo.

Regras de depuração no Iptables

Também vale a pena ler o seguinte URL para configurar o log da saída de rastreio em um arquivo de sua escolha.

http://backreference.org/2010/06/11/iptables-debugging/

Eu não consideraria esta solução igual ao tcpdump, mas isso pode ser feito usando uma instalação mínima do Centos. Você precisa ter cuidado para não encher o disco com os logs, porque o tcpdump é muito mais eficiente no uso do disco. Desative o log quando não for necessário.

Você pode usar o seguinte como um modelo básico em seu script.

# Logging
log(){
SOURCE=a.b.c.d (IP address)
$IPT -A INPUT   -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "In: "
$IPT -A OUTPUT  -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Out: "
$IPT -A FORWARD -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Fw: "
$IPT -t nat -A POSTROUTING -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Nat: "
}
#log  (remove comment to enable)

trace(){
iptables -t raw -A PREROUTING -p tcp  -j TRACE
iptables -t raw -A OUTPUT     -p tcp  -j TRACE
}
#trace (remove comment to enable)
John Auld
fonte
8

Se você precisa de um software específico para o seu trabalho e não tem permissão, não está fazendo um bom negócio ou vendendo suas idéias para as pessoas certas ... ou não está no controle desse sistema. .

Se eu tivesse a tarefa de fazer algo e precisasse do tipo de informações de depuração / solução de problemas necessárias nesse caso, eu usaria a ferramenta certa. Isso é provável tcpdumpou tshark. Sim, esses são pedaços de software, mas eu os consideraria utilitários mais essenciais . Na verdade, são utilitários que podem ser instalados ou carregados temporariamente no sistema e removidos sem incidentes (a mídia removível é uma opção? ... dica )

Mas o ponto é que uma solução alternativa irregular para a política da empresa provavelmente exige mais esforço do que obter aprovação para este caso de uso.

ewwhite
fonte
Concordo plenamente em usar a ferramenta certa para o trabalho certo. Na verdade, eu posso instalar o software, mas precisamos usar o controle de alterações, para que o processo demore alguns dias - eu precisava do despejo agora, então a instalação não era uma opção. Eu só estava me perguntando se eu esqueci algumas opções que ainda não pensei.
Isaac
:( sobre-gestão da mudança Existe alguma maneira de jogar um jogo político e obter as pessoas / partes que iria beneficiar com o despejo de fast-track no processo de gestão da mudança.?
ewwhite
11
Receio que não - mas, como é o cliente que exige gerenciamento de mudanças e também tcpdump, ele terá que aceitar os fatos. Eu esperava poder fazê-lo feliz de qualquer maneira.
Isaac
3
@ewwhite: Qualquer boa política de gerenciamento de alterações deve ter a capacidade de isentar alterações específicas ou classes de alterações no processo completo. Se este não ....
Scott pacote
2
Você não pode compilar um link estaticamente em tcpdumpoutro lugar e apenas copiá-lo para / tmp e executar a partir daí?
che
5

Kyle ofereceu ótimas opções. Mais um seria usar iptables:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32
...
[james@server ~]$ sudo iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 105 packets, 35602 bytes)
 pkts bytes target  prot opt in  out  source      destination
   87 33484 LOG     all  --  *   *    0.0.0.0/0   1.2.3.4     LOG flags 0 level 4

Esta é essencialmente uma regra contábil. Ele não permite ou nega explicitamente o tráfego, portanto, a política padrão da cadeia OUTPUT é usada (o padrão é ACEITAR). No entanto, qualquer pacote correspondente aumentará os contadores da regra.

Opcionalmente, você pode registrar detalhes sobre o pacote, com a -j LOGopção:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG
...
[james@server ~]@ dmesg | grep 1.2.3.4 | tail -1
IN= OUT=eth0 SRC=192.168.1.1 DST=1.2.3.4 LEN=100 TOS=0x10 PREC=0x00 TTL=64 ...

Os logs irão para o recurso de registro do kernel, portanto devem aparecer em / var / log / messages nos derivados da Red Hat e /var/log/kern.log nos derivados da Debian. Também seria visível na saída de dmesg, como mostrado. Ao contrário tcpdump, no entanto, ele não registrará o conteúdo completo do pacote, apenas o conteúdo do cabeçalho do pacote.

James Sneeringer
fonte
Eu estava pensando no iptables, mas também não estava instalado: /. Enfim, boa solução.
Isaac
3

Como o servidor está se conectando a um determinado IP, presumo que seja para uma porta que você também conhece?

De qualquer forma, netstatou ssforam projetados para fazer o que você deseja. Você pode fazer o mesmo com qualquer um dos comandos:

netstat -n -t | awk '{print $5}' | grep A.B.C.D:n
ss      -n -t | awk '{print $5}' | grep A.B.C.D:n

onde A.B.C.Drepresenta um endereço IPv4 e n representa um número de porta à qual seu servidor está se conectando no lado remoto. Por exemplo:

ss      -n -t | awk '{print $5}' | grep 10.137.54.22:3389

Ou, se você gostaria de saber que a conexão é feita:

ss      -n -t | awk '{print $5}' | grep -q 10.137.54.22:3389 && echo "CONNECTION MADE"

Se você não souber o número da porta à qual está tentando se conectar, o trabalho será mais difícil, pois o TCP abrirá uma porta nos dois lados da conversa para os pacotes de dados e ACK. Nesse caso, você pode simplesmente fazer uma saudação para o endereço IP para mostrar que qualquer conexão foi feita, seja para / de.

Por fim, você pode fazer um loop disso no conteúdo do seu coração para usar como sua ferramenta de monitoramento:

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done
Mike S
fonte
Ótima maneira de monitorar sem a necessidade de privilégios elevados de kernel.
Grant Bowman