Quais portas são usadas por um aplicativo [duplicado]

11

Estou testando um aplicativo que abre suas próprias portas (atua como servidor para essas portas e, portanto, escuta nessas portas) e onde o mesmo aplicativo se conecta às portas vinculadas por outros aplicativos (atua como cliente para essas portas).

Gostaria de obter uma visão geral de quais portas o aplicativo cria e a quais aplicativos e portas ele se conecta.

Como posso fazer isso?

Baz
fonte

Respostas:

17

Você pode usar netstatpara isso. Veja o exemplo (esperei por ssh):

netstat -putan | grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1725/sshd
tcp        0      0 1.2.3.4:45734           1.2.3.5:22              ESTABLISHED 2491/ssh
tcp6       0      0 :::22                   :::*                    LISTEN      1725/sshd

Explicação:

Costumo usar os parâmetros -putan(porque são simples de lembrar).

  • -p: mostra os PIDs do aplicativo / processo
  • -u: mostre portas / conexões udp
  • -t: mostre portas / conexões tcp
  • -a: mostra soquetes de escuta e não escuta
  • -n: saída numérica (não faça pesquisas de DNS para nomes de host etc.)

Na saída acima, você vê que existe um processo ssh daemon ( sshd) com o PID 1725escutando na porta 22em todas as interfaces de rede ( 0.0.0.0). Também existe um processo de cliente ssh (PID 2491) conectado ao endereço IP 1.2.3.5no número da porta 22, meu endereço IP é 1.2.3.4e minha porta externa 45734. Você vê que a conexão está estabelecida. Portanto, eu estou logado via ssh.

caos
fonte
Uma conexão TCP estabelecida na porta 22 não indica autenticação bem-sucedida. O TCP deve ser estabelecido antes que a autenticação em qualquer direção possa ocorrer.
jamesbtate
@Puddingfox yes true, poderíamos dizer melhor "Estou conectado a essa porta", mas, para compreensão, eu disse "estou logado", porque é mais ilustrativo.
caos
1
hehe ... `` -putan '' Estou tão tentado a corrigir esse pequeno erro de ortografia;)
James Mertz
Por que usar utilitários obsoletos quando os modernos estão disponíveis? ss -lntp é o utilitário fornecido pelo pacote iproute2 .
MariusMatutiae
7

Outra ferramenta que pode fazer isso é lsof:

# lsof -i -a -p 1981
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1981 root    3u  IPv4    917      0t0  TCP host.example.com:ssh (LISTEN)
# lsof -i -a -p 1981 -n
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1981 root    3u  IPv4    917      0t0  TCP 10.1.2.3:ssh (LISTEN)
# lsof -i -a -p 1981 -n -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1981 root    3u  IPv4    917      0t0  TCP 10.1.2.3:22 (LISTEN)
#

As opções usadas são as seguintes:

  • -i imprimir portas da Internet abertas por um processo
  • -a para fazer com que todas as opções sejam AND
  • -p 1981 mostrar saída para o processo 1981
  • -n inibir a pesquisa de nome de host e mostrar o IP
  • -P inibir a pesquisa de serviço e mostrar o número da porta

lsoftem a vantagem de poder especificar o processo a ser verificado, em vez de precisar cumpri-lo com uma saída maior. netstatestá disponível de forma mais confiável nos sistemas, embora lsofesteja se tornando mais padrão do que costumava ser.

gowenfawr
fonte
Gostaria de executar este comando antes de iniciar o aplicativo que desejo monitorar, mas posso estabelecer qual o pid que um aplicativo receberá antes de iniciá-lo?
Baz
@Az, se você deseja monitorar um aplicativo quando ele inicia (por exemplo, antes que você saiba que é o PID), tente a stracesolução sugerida pelo @olivecoder.
gowenfawr
3

ssutilitário do pacote iproute para Linux

Serge Chirik
fonte
3

Já temos boas respostas, mas elas listam apenas as portas que estão abertas no momento em que o comando é executado.

strace é a ferramenta certa para monitorar as conexões abertas durante a vida útil do aplicativo:

strace -e socket,connect,close -f -o hipchat.strace.txt hipchat

A saída mostraria informações adicionais, como solicitações UDP e conexões abertas, mas fechadas.

olivecoder
fonte
0

ss -a4 | less

Suponho que você esteja falando sobre IPv4 ... Se não, você pode substituir o 4 no comando anterior por 6. O parâmetro -a é mostrar todas as portas (ouvindo e não). Você pode adicionar -n aos parâmetros se não quiser resolver os nomes na exibição.

rotten777
fonte