Com o iptables do Linux, é possível registrar o nome do processo / comando que inicia uma conexão de saída?

24

Gostaria de acompanhar os processos que iniciam conexões de saída em um desktop Linux. O melhor que posso fazer é isto:

iptables -A OUTPUT -m state --state NEW -j LOG --log-uid

Isso registra o uid / gid que inicia a conexão, mas não o nome do processo / comando ou até mesmo o pid. Se eu pudesse pegar o pid, eu provavelmente poderia criar um script que puxasse o nome do processo quando o log estivesse escrito, mas parece que isso nem é possível.

Idealmente, eu também gostaria de registrar os processos que aceitam conexões de entrada também.

Alguma idéia de como isso pode ser possível com iptables [ou qualquer outra coisa] em uma caixa Linux?

    
por Nack 07.04.2009 / 22:08

4 respostas

7

Você pode escrever um programa para monitorar / proc / net / tcp, cuja saída é assim:

obi-wan ~ # cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847458 1 e6060560 300 0 0 2 -1
   1: 00000000:04D2 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847477 1 f2e64da0 300 0 0 2 -1
   2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7109 1 f2e65ac0 300 0 0 2 -1
   3: 0100007F:177A 00000000:0000 0A 00000000:00000000 00:00000000 00000000  1000        0 4864457 1 d2726540 300 0 0 2 -1
   4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 4847462 1 e60609c0 300 0 0 2 -1
   5: 6B00A8C0:0016 30F4B5CA:C3AB 01 00000044:00000000 01:00000031 00000000     0        0 4982752 3 f2e64940 55 4 0 2 -1
   6: 0100007F:B143 0100007F:BC5E 01 00000000:00000000 00:00000000 00000000  1000        0 2130283 1 d59cce40 21 4 1 2 -1
   7: 0100007F:BC5E 0100007F:B143 01 00000000:00000000 00:00000000 00000000  1000        0 2130285 1 d59cd2a0 21 4 0 2 -1
   8: 6B00A8C0:0016 3276C35B:8E11 01 00000000:00000000 02:000ADAB1 00000000     0        0 4982629 2 d2727260 40 4 8 2 2
   9: 6B00A8C0:0016 6500A8C0:DD5D 01 00000538:00000000 01:00000029 00000000     0        0 4864416 5 e6061b40 42 12 27 3 -1

Você pode relacionar as portas abertas aos inodes, que podem ser relacionados aos processos e aos descritores de arquivos, fazendo o readlink nos descritores de arquivos listados para cada processo:

obi-wan ~ # readlink /proc/28850/fd/3
socket:[4847458]

Veja aqui que o inode 4847458 corresponde ao primeiro soquete tcp na lista acima. A saída do netstat -tapn verifica isso para mim (e lembre-se que 0x50 == 80):

obi-wan ~ # netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     28850/cherokee-work

Quando o programa monitor percebe uma alteração em / proc / net / tcp, analisa os dados e determina se a alteração é um soquete recém-aberto. Então você poderia simplesmente enumerar todos os descritores de arquivo para cada processo listado em / proc, fazendo o readlink em cada um para encontrar o inode correspondente. Uma vez que você encontra isso, você tem o pid de propriedade, a partir do qual você pode obter qualquer outra coisa que você queira, particularmente se você tiver uma contabilidade de processo.

Se você não precisar que sua notificação seja instantânea, seu programa de monitoramento poderá usar uma pesquisa lenta (talvez um período de 50 ms ou 100 ms ou mesmo de 1000 ms).

    
por 08.04.2009 / 17:27
9

Você deseja o módulo de correspondência do proprietário, que funciona somente na cadeia OUTPUT (e talvez PREROUTING ...?). Leia os documentos, mas funcionará algo assim:

iptables --append OUTPUT -m owner --cmd-owner "$app" \
--jump LOG --log-level DEBUG --log-prefix "OUTPUT $app packet died: "
    
por 07.04.2009 / 22:12
5

Nada a ver com iptables ou logging; mas aqui está uma interface "top" que pesquisa o diretório / proc / e exibe a largura de banda por programa / pid:

link

"O NetHogs é uma pequena ferramenta 'net top'. Em vez de quebrar o tráfego por protocolo ou por sub-rede, como a maioria das ferramentas, ele agrupa a largura de banda pelo processo. O NetHogs não depende de um módulo de kernel especial para ser carregado. "

    
por 08.04.2009 / 21:37
1

Como estou analisando uma questão semelhante, tentando limitar o skype à velocidade, descobri

$ netstat -p | grep <mycmdname>

é uma boa maneira de vincular o número da porta ao pid / cmd, agora que o pid-owner / cmd-owner não é mais suportado diretamente no iptables; você precisará então analisar o resultado, depois adicionar a regra iptables de acordo com a porta; naturalmente, você precisará de algum código de limpeza depois / no desligamento / reinício do sistema, etc; salve o número da porta / s em um arquivo para referência no momento da limpeza

na verdade, uma boa resposta para a questão dos números de porta é

$ sudo netstat -p | grep "tcp.*<mycmdname>" | sed -r "s/.*<MYCOMPUTER>:([0-9]+).*//"'

você pode precisar ajustar o elemento grep tcp de acordo com suas necessidades

então, para os meus propósitos, era mais simples adicionar filtros tc u32 de acordo com números de porta, entradas do iptables de acordo com números de portas semelhantes

    
por 04.03.2012 / 04:28