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.


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.


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

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)

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.


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.


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

Ótima maneira de monitorar sem a necessidade de privilégios elevados de kernel.
Grant Bowman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.