Como saber se um processo está anexado a uma interface de toque?

9

Às vezes, encontro máquinas com interfaces de toque (por exemplo, quando o KVM está em execução). Como posso saber qual processo está anexado à interface TAP?

user368507
fonte
Suspeito que você possa fazer isso nmap, mas não tenho certeza de como ser honesto.
Alex Chamberlain

Respostas:

2

Isso me fez pensar e eu dei uma olhada na fonte do kernel do Linux (suponho que sua pergunta seja sobre o Linux).

Parece que a resposta é mais difícil do que você esperaria. Esta página de tutorial da API TUN / TAP oferece algumas dicas . Basicamente, seu programa aloca um novo dispositivo TUN / TAP abrindo /dev/net/tune enviando o TUNSETIFF ioctl. Se tudo correr bem, uma interface é criada, o kernel fornece seu nome e um descritor de arquivo, e é assim que você o gerencia.

Existem duas capturas aqui:

  1. O kernel não armazena o PID do processo que enviou o ioctl struct tun_struct(o TUN e o TAP compartilham amplamente as mesmas estruturas de dados).
  2. Um processo pode marcar uma interface como persistente, fechar seu descritor de arquivo e depois usá-la como uma interface de rede normal.

Na prática, suspeito que 2 não aconteça muito. A verificação de um openvpnprocesso com lsofrevela que ele ainda tem seu descritor de arquivo para o dispositivo TAP aberto e obviamente o utiliza, mas como /dev/net/tuné um tipo de dispositivo de multiplexação /dev/ptmx, você pode usar lsofpara descobrir quais processos estão atualmente usando um dispositivo TUN / TAP, mas você não pode saber qual processo está usando qual dispositivo.

Existem maneiras oblíquas de resolver o problema subjacente. Para o OpenVPN, eu uso um script de configuração de encapsulamento que nomeia os tunX/ tapXdevices com um nome mais descritivo que inclui o nome base do arquivo de configuração do OpenVPN. Então, /etc/openvpn/foo.confleva a um vpn-foodispositivo. Então eu posso correlacionar o processo OpenvVPN com a interface que está usando. Ainda não tive que fazer isso com o QEmu / KVM.

Alexios
fonte
Está bem. Eu também suspeitava que a "multiplexação" / dev / net / tun nos impediria de saber qual interface de toque exatamente um processo também está anexado.
user368507
5

Cada descritor de arquivo possui uma entrada / proc / pid / fdinfo / num , como:

# cat /proc/24332/fdinfo/28
pos:    0
flags:  0104002
mnt_id: 18
iff:    tap0123acdc-66

Portanto, com o nome da interface, você pode obter o pid com:

# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3
24332
jjo
fonte
Funciona para mim: % sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3' 4143 % pgrep qemu 4143 Dado o fato de haver um parâmetro de nome mostrado na saída dos ps -efprocessos do qemu, por exemplo qemu-system-x86_64 -enable-kvm -name debian-8, deve ser fácil descobrir a qual VM um pid e uma interface correspondem.
Dmitrii S. #
1

No FreeBSD ou em qualquer outro derivado do BSD:

ifconfig tap0

deve mostrar qual processo está conectado à interface:

tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=80000<LINKSTATE>
    ether 58:9c:fc:10:8f:2b
    groups: tap
    media: Ethernet autoselect
    status: active
    nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
    Opened by PID 2672
kworr
fonte
Em qual SO e versão você está tentando isso? Seria MUITO útil ter essas informações (eu corro uma caixa com dezenas de pontos de extremidade VPN), mas o Debian ifconfignão mostra isso. Veja bem, esses são tapdispositivos criados pelo OpenVPN - embora eu não entenda por que deve haver uma diferença.
Alexios16:
É sobre o FreeBSD ou qualquer outro derivado do BSD.
kworr