Como descobrir qual serviço está escutando em uma porta específica de um servidor Ubuntu sem ID de processo?

Como descobrir qual serviço está escutando em uma porta específica de um servidor Ubuntu sem ID de processo?

Decidi postar esta pergunta mesmo que haja muitas perguntas semelhantes, mas nenhuma delas respondeu à minha.

  1. Eu verifico periodicamente as portas que meu servidor escuta.
  2. Meu sistema operacional Ubuntu pela saída de lsb_relase -a:
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal
  1. Eu executo o comando netstat -tulpn4e a saída mostra uma porta desconhecida:
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      580/systemd-resolve 
tcp        0      0 0.0.0.0:62176           0.0.0.0:*               LISTEN      900/sshd: /usr/sbin 
tcp        0      0 0.0.0.0:1122            0.0.0.0:*               LISTEN      1158/sshd: username    
tcp        0      0 0.0.0.0:3333            0.0.0.0:*               LISTEN      1158/sshd: username    
udp        0      0 0.0.0.0:51820           0.0.0.0:*                           -                   
udp        0      0 127.0.0.53:53           0.0.0.0:*                           580/systemd-resolve 
udp        0      0 X.X.X.X:1194           0.0.0.0:*                           870/openvpn         
  1. Usei muitas ferramentas e guias para descobrir por que meu servidor está escutando na porta 51820sem encontrar uma resposta.
  2. Eu tentei:
    • sudo lsof -i :51820- e obteve uma saída vazia.
    • sudo netstat -ltnp | grep -w ':51820'- e obteve uma saída vazia.
    • sudo fuser 51820/udp- e obteve uma saída vazia.
    • sudo netstat -peanut | grep ":51820"- a saída é:
udp        0      0 0.0.0.0:51820           0.0.0.0:*                           0          26262      -                   
udp6       0      0 :::51820                :::*                                0          26263      - 
  • sudo ss -nlp | grep 51820a saída é:
udp     UNCONN   0        0                                             0.0.0.0:51820                                             0.0.0.0:*                                                                                                     
udp     UNCONN   0        0                                                [::]:51820                                                [::]:*  
  1. Analisei as seguintes respostas e não encontrei uma solução:

Depois de pesquisar na web sobre a porta, 51820descobri que é o "wireguard" que instalei que está escutando naquela porta, mas a pergunta permanece a mesma, como em qualquer comando que tentei, não consegui descobrir.

Responder1

Você está executando um sistema operacional que implementa o Wireguard como um módulo do kernel. Seu kernel está escutando nesta porta e, como não há nenhum processo que possua esse soquete, nenhum PID é relatado por netstat.

Responder2

Geral:

Depois de uma pesquisa de dois dias sobre o problema, descobri, como Michael Hampton e Peter Zhabin, que não existe uma solução que mostre um ID de processo do kernel por meio de uma porta de escuta.

Além disso, durante esses dois dias procurei também algumas commands combinações que pudessem trazer a resposta desejada, e não encontrei nenhuma maneira simples ou conveniente de fazer isso.

A solução que criei é preliminar e tenho certeza que pode ser melhorada pelos membros da comunidade.

Descontos para localização do processo

  • O processo está rodando no nível do kernel ou em qualquer outro nível que evite que o processo tenha um id (PID).
  • O ID do processo ou o programa do processo não foi encontrado pela saída dos comandos fornecidos: lsof, netstat, ss, fuser.
  • Encontramos uma porta de escuta na saída dos comandos acima - mas não podemos configurar o programa ou o pid que está causando a escuta.

Sobre grep:

Usaremos greppara encontrar mais informações sobre a porta aberta.

grep- imprima linhas que combinem com os padrões.

Da greppágina de manual via man grepcomando.

DESCRIPTION
grep  searches  for  PATTERNS  in  each  FILE.  PATTERNS is one or more
       patterns separated by newline characters, and  grep  prints  each  line
       that  matches a pattern.  Typically PATTERNS should be quoted when grep
       is used in a shell command.
  • Aquié um ótimo tópico sobre como usar o comando de maneira correta e eficaz.

Como localizar o PID ou o programa que usa a porta fornecida por meio de grep:

No meu caso a execução sudo grep --exclude-dir={sys,proc} -rnw / -e 51820 | grep -i portresolveu o problema e mostrou todas as informações sobre o programa que utilizava a porta.

A saída fornecida:

iptables.service:6:ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT
/home/username/wireguard-install.sh:238:    read -p "Port [51820]: " port
/home/username/wireguard-install.sh:241:        read -p "Port [51820]: " port
/home/username/wireguard-install.sh:243:    [[ -z "$port" ]] && port="51820"
/usr/share/doc/netplan/examples/wireguard.yaml:9:      port: 51820
/etc/wireguard/wg0.conf:8:ListenPort = 51820
/etc/systemd/system/wg-iptables.service:6:ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT
/etc/systemd/system/wg-iptables.service:10:ExecStop=/usr/sbin/iptables -D INPUT -p udp --dport 51820 -j ACCEPT

A razão para os muitos sinalizadores é que outras combinações que tentei tiveram uma grande quantidade de resultados indesejados.

grepO que significam os argumentos de comando:

  • --exclude-dir- Ignore qualquer diretório de linha de comando com um sufixo de nome que corresponda ao padrão.

sysE ignorando e procdiretórios específicosno nosso caso específico é evitar resultados indesejados.

Exemplo: grep --exclude-dir={dir1,dir2}evitará dir1 e dir2 durante a pesquisa.

  • -rou -Ré recursivo.
  • -né o número da linha.
  • -wsignifica combinar a palavra inteira.
  • /significa o diretório "mais alto" para iniciar a pesquisa de cima para baixo.
  • -e- é o padrão usado durante a pesquisa.
  • 51820em nosso caso específico é o número da porta que foi encontrado por um dos comandos de monitoramento de rede acima.
  • |- é o canal para redirecionar a saída da primeira parte do comando para a segunda.

No nosso caso: redirecionando sudo grep --exclude-dir={sys,proc} -rnw / -e 51820a saída para o próximo comandogrep -i port

  • -i- Ignore as distinções de maiúsculas e minúsculas em padrões e dados de entrada, para que os caracteres que diferem apenas em maiúsculas e minúsculas correspondam entre si.
  • port- Encontrado para restringir os resultados à finalidade para a qual realizamos a pesquisa, encontrando mais informações sobre a porta específica que foi definida após a -ebandeira.

Pontas:

  • Faça a varredura maior possível nas primeiras etapas, começando no /diretório e usando sinalizadores mínimos para filtrar a saída, para garantir que você não perderá nenhum detalhe que possamos obter.
  • Depois de encontrar a saída desejada ou ter problemas para encontrar a saída desejada causada por uma grande quantidade de saída indesejada, comece a adicionar sinalizadores um por um.
  • Especifique o número da porta como padrão, afinal este é nosso ponto de partida e nosso objetivo final.
  • Utilize grepcomandos duplos redirecionando a primeira varredura para porto filtro de padrão, isso pode nos localizar e agilizar a solução, afinal estamos buscando um número como padrão e isso pode levar a muitos resultados indesejados.
  • Se você não conseguir tirar conclusões com o resultado fornecido, faça uma pesquisa na web com as palavras-chave escolhidas que você encontrou.

informação relacionada