Mostrar conexões de rede de um processo

25

Existe uma maneira de mostrar as conexões de um processo? Algo parecido:

show PID

em que showhá um comando para fazer isso e PIDé o pid do processo. A saída que eu quero é composta por toda a conexão do processo (em tempo real). Por exemplo, se o processo tentar se conectar a 173.194.112.151, a saída será 173.194.112.151.

Um exemplo mais específico com o Firefox:

show `pidof firefox`

e com o firefox eu vou primeiro no google.com , depois no unix.stackexchange.com e finalmente no 192.30.252.129 . A saída, quando fecho o navegador, deve ser:

google.com
stackexchange.com
192.30.252.129

(Obviamente, com o navegador, essa saída não é realista, porque existem muitas outras conexões relacionadas, mas este é apenas um exemplo.)

ᴜsᴇʀ
fonte
Sob qual variante Unix? A maioria tem ferramentas para fazer isso, mas diferentes.
Gilles 'SO- stop be evil'
Então, basicamente, você quer um log de todas as conexões?
Sergiy Kolodyazhnyy 02/10/2015
Acho que o tcpdump ou o Wireshark devem fazer o trabalho então.
Sergiy Kolodyazhnyy 02/10/2015
Algumas possíveis maneiras de fazer isso: askubuntu.com/questions/11709/...
Mark Plotnick
@Gilles Ubuntu 14.04.3 LTS
ᴜsᴇʀ

Respostas:

23

Você está procurando strace! Encontrei esta resposta no askubuntu , mas é válida para o Unix:

Para iniciar e monitorar um novo processo:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Para monitorar um processo existente com um PID conhecido:

strace -p $PID -f -e trace=network -s 10000

Caso contrário, mas isso é específico do Linux, você pode executar o processo em um namespace de rede isolado e usar o wireshark para monitorar o tráfego . Provavelmente será mais conveniente do que ler o stracelog:

  • crie um espaço para nome da rede de teste:

    ip netns add test
    
  • crie um par de interfaces de rede virtual (veth-a e veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • altere o espaço para nome ativo da interface veth-a:

    ip link set veth-a netns test
    
  • configure os endereços IP das interfaces virtuais:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • configure o roteamento no namespace de teste:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • ative ip_forward e estabeleça uma regra NAT para encaminhar o tráfego proveniente do namespace que você criou (você deve ajustar a interface de rede e o endereço IP SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
    

    (Você também pode usar a regra MASQUERADE, se preferir)

  • finalmente, você pode executar o processo que deseja analisar no novo espaço para nome e o wireshark também:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Você terá que monitorar a interface veth-a.

Olivier
fonte
2
straceé realmente específico do kernel do Linux, portanto não é válido para todos os sistemas operacionais do tipo Unix. Pelo que entendi, os sistemas do tipo BSD têm utilitários semelhantes (DTrace e treliça). De qualquer forma, boa resposta (tão votada). Bem-vindo ao Stack Exchange.
Anthony G - justiça para Monica
A resposta parece apontar na direção certa, no entanto, estou tendo problemas para interpretar a stracesaída durante o exame git fetch. Eu esperava ver algum tipo de URL incluído na saída, como também solicitado pelo OP. Alguém pode ajudar?
andreee 5/07
14

Experimentar

lsof -i -a -p `pidof firefox`
alxrem
fonte
Funciona parcialmente: imprime algumas das conexões atuais do processo, mas depois fecha automaticamente. Para alguns programas a saída só é este aviso:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴜsᴇʀ
Você pode adicionar opções -r1para repetir a saída a cada segundo e -wsuprimir avisos.
Alxrem 2/10
2
Isso mostra apenas as conexões em um determinado momento, não lista todas as conexões que um processo faz ao longo de sua vida útil. Mesmo se você colocar esse comando em um loop, ele perderá conexões de curta duração.
Gilles 'SO- stop be evil'
O interlocutor não pediu para ver as conexões ao longo da vida. Pode-se interpretar (in real-time)como from the point in time of tracking and forward.
llua
8

Aqui está outra abordagem:

ss -nap | grep $(pidof firefox)

Saída de amostra:

tcp    ESTAB      0      0          192.168.0.222:49050    216.58.218.164:443    users:(("firefox",3280,69))
tcp    ESTAB      0      0          192.168.0.222:48630    198.252.206.25:443    users:(("firefox",3280,106))
tcp    ESTAB      0      0          192.168.0.222:44220     216.58.217.38:443    users:(("firefox",3280,140))
tcp    ESTAB      0      0          192.168.0.222:52690    54.240.170.181:80     users:(("firefox",3280,107))
tcp    ESTAB      0      0          192.168.0.222:48744    198.252.206.25:443    users:(("firefox",3280,87))
tcp    ESTAB      0      0          192.168.0.222:48811    198.252.206.25:443    users:(("firefox",3280,73))
Sergiy Kolodyazhnyy
fonte
11
Isso mostra apenas as conexões em um determinado momento, não lista todas as conexões que um processo faz ao longo de sua vida útil. Mesmo se você colocar esse comando em um loop, ele perderá conexões de curta duração.
Gilles 'SO- stop be evil'
5

Você pode tentar também com netstat -p. Na página do manual:

netstat - Imprima conexões de rede, tabelas de roteamento, estatísticas de interface, conexões mascaradas e associações multicast

Para mostrar apenas as conexões de rede, use netstat -tup. Observe que, para ver o processo PID, você pode precisar ser root.

Se você não possui netstatem seu sistema, pode ter ss, que possui quase a sintaxe exata. Você pode usar então ss -tup(como root).

abel
fonte
11
Isso mostra apenas as conexões em um determinado momento, não lista todas as conexões que um processo faz ao longo de sua vida útil. Mesmo se você colocar esse comando em um loop, ele perderá conexões de curta duração.
Gilles 'SO- stop be evil'
11
netstat -p | grep firefox | grep tcp
Philip Kirkbride
@Gilles O que significa que é uma ótima resposta para quem deseja ver as conexões em um determinado momento. Como foi o meu caso recentemente.
Jose Antonio Restabelecer Monica