despejar conexões tcp sem tcpdump

16

Em uma caixa centos, eu gosto de descarregar conexões tcp - Eu gostaria de ver se um servidor tenta enviar pedidos para um determinado IP. Normalmente o tcpdump faz o truque - mas o tcpdump não está instalado e a instalação do software não é uma opção (por causa da política da empresa). Receio que o netstat não me mostrará um único pedido.

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

    
por Isaac 19.06.2014 / 13:58

6 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 handshake, 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 a INTERFACE.

    
por 20.06.2014 / 03:05
16

Eu realmente tentaria obter o tcpdump. Dito isto, algumas alternativas para ver 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
    
por 19.06.2014 / 14:22
15

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

A solução é descrita no URL abaixo.

Regras de depuração em iptables

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

link

Eu não consideraria essa 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. Desligue o registro quando não for necessário.

Você pode usar o seguinte como um modelo básico no 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)
    
por 19.06.2014 / 15:33
8

Se você precisa de um software específico para realizar seu trabalho e não tem permissão para fazê-lo, ou não está fazendo um bom caso de negócios ou vendendo suas ideias para as pessoas certas ... ou você não está no controle deste sistema ...

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

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

    
por 19.06.2014 / 14:16
5

Kyle ofereceu ótimas opções. Mais uma 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

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

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

[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 criação de log do kernel, portanto, ele deve aparecer em / var / log / messages nos derivativos da Red Hat e /var/log/kern.log nos derivados do Debian. Também seria visível na saída de dmesg , conforme mostrado. Ao contrário de tcpdump , no entanto, ele não registrará o conteúdo completo do pacote, apenas o conteúdo do cabeçalho do pacote.

    
por 19.06.2014 / 15:59
3

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

Em qualquer caso, netstat ou ss são projetados para fazer o que você deseja. Você pode fazer o mesmo com qualquer comando:

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

em que A.B.C.D representa um endereço IPv4 e n representa um número de porta ao 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 foi 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 dados e os pacotes ACK. Nesse caso, você poderia simplesmente pedir ao endereço IP para mostrar que qualquer conexão foi feita, seja para ou de.

Por fim, você pode incluir isso no conteúdo do seu coração para usar como 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
    
por 01.08.2016 / 19:23

Tags