Gostaria de acompanhar os processos que iniciam as conexões de saída em um desktop Linux. O melhor que posso apresentar é o seguinte:
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 mesmo o pid. Se eu pudesse obter o pid, provavelmente poderia criar um script que puxa o nome do processo quando o log é gravado, mas parece que isso nem é possível.
Idealmente, eu também gostaria de registrar os processos que também aceitam conexões de entrada.
Alguma idéia de como isso pode ser possível com o iptables [ou qualquer outra coisa] em uma caixa Linux?
Respostas:
Você pode escrever um programa para monitorar / proc / net / tcp, cuja saída se parece com isso:
Em seguida, você pode relacionar portas abertas a inodes, que podem ser relacionados a processos e descritores de arquivos, fazendo o readlink nos descritores de arquivos listados para cada processo:
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 de que 0x50 == 80):
Quando o programa do monitor perceber uma alteração em / proc / net / tcp, analise os dados e determine se a alteração é um soquete aberto recentemente. Então você pode apenas enumerar todos os descritores de arquivo para cada processo listado em / proc, fazendo o readlink em cada um deles para encontrar o inode correspondente. Depois de descobrir isso, você tem o pid proprietário, do qual pode obter qualquer outra coisa que desejar, principalmente se tiver contabilidade de processo.
Se você não precisar que sua notificação seja instantânea, o programa do seu monitor poderá usar uma pesquisa lenta (talvez um período de 50ms ou 100ms, ou mesmo 1000ms).
fonte
Você deseja o módulo de correspondência do proprietário, que funciona apenas na cadeia OUTPUT (e talvez PREROUTING ...?). Leia os documentos, mas funcionará mais ou menos assim:
fonte
Nada a ver com iptables ou log; mas aqui está uma interface do tipo "top", que pesquisa o diretório / proc / e exibe largura de banda por programa / pid:
http://sourceforge.net/projects/nethogs
"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, agrupa a largura de banda por processo. O NetHogs não depende de um módulo de kernel especial para ser carregado."
fonte
Como estou procurando uma pergunta semelhante, tentando limitar o skype, descobri
é 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á analisar o resultado e adicionar a regra iptables de acordo com a porta; naturalmente você precisará de algum código de limpeza posteriormente / no desligamento / reinicialização do sistema, etc; salve o número da porta em um arquivo para referência no momento da limpeza
de fato, uma boa resposta para a questão dos números de porta é
pode ser necessário ajustar o elemento grep tcp de acordo com suas necessidades
então, para meus propósitos, era mais simples adicionar filtros tc u32 de acordo com os números de porta, entradas do iptables de acordo com números de porta semelhantes
fonte