프로세스 ID 없이 Ubuntu 서버의 특정 포트에서 어떤 서비스가 수신 대기하는지 확인하는 방법은 무엇입니까?

프로세스 ID 없이 Ubuntu 서버의 특정 포트에서 어떤 서비스가 수신 대기하는지 확인하는 방법은 무엇입니까?

비슷한 질문이 많은데도 이 질문을 올리기로 결정했는데, 어느 누구도 내 답변에 답해 주지 않았습니다.

  1. 나는 주기적으로 내 서버가 수신하는 포트를 확인합니다.
  2. 내 우분투 OS는 다음과 같이 출력됩니다 lsb_relase -a.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal
  1. 명령을 실행했는데 netstat -tulpn4출력에 알 수 없는 포트가 표시됩니다.
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. 51820나는 내 서버가 대답을 찾지 못한 채 포트에서 수신 대기하는 이유를 알아내기 위해 많은 도구와 가이드를 사용해 왔습니다 .
  2. 나는 시도했다:
    • sudo lsof -i :51820- 그리고 빈 출력을 얻었습니다.
    • sudo netstat -ltnp | grep -w ':51820'- 그리고 빈 출력을 얻었습니다.
    • sudo fuser 51820/udp- 그리고 빈 출력을 얻었습니다.
    • sudo netstat -peanut | grep ":51820"- 출력은 다음과 같습니다:
udp        0      0 0.0.0.0:51820           0.0.0.0:*                           0          26262      -                   
udp6       0      0 :::51820                :::*                                0          26263      - 
  • sudo ss -nlp | grep 51820출력은 다음과 같습니다
udp     UNCONN   0        0                                             0.0.0.0:51820                                             0.0.0.0:*                                                                                                     
udp     UNCONN   0        0                                                [::]:51820                                                [::]:*  
  1. 다음 답변을 살펴봤지만 해결책을 찾지 못했습니다.

포트에 대해 웹을 검색한 후 51820내가 설치한 것이 해당 포트에서 수신 대기하는 "wireguard"라는 것을 알았지만 질문은 내가 시도한 모든 명령에서와 동일하게 남아 있으며 이를 찾을 수 없습니다.

답변1

Wireguard를 커널 모듈로 구현하는 운영 체제를 실행 중입니다. 커널이 이 포트를 수신하고 있으며 해당 소켓을 소유한 프로세스가 없으므로 에서 PID를 보고하지 않습니다 netstat.

답변2

일반:

이 문제를 이틀 동안 검색한 후 Michael Hampton 및 Peter Zhabin과 같이 수신 포트를 통해 커널 프로세스 ID를 표시하는 기존 솔루션이 없다는 사실을 발견했습니다.

게다가 그 이틀 동안 나는 commands 원하는 답을 얻을 수 있는 몇 가지 조합을 검색했지만 이를 수행하는 간단하거나 편리한 방법을 찾지 못했습니다.

제가 만든 솔루션은 예비적인 것이며 커뮤니티 구성원에 의해 개선될 수 있다고 확신합니다.

프로세스 찾기에 대한 할인

  • 프로세스는 커널 수준이나 프로세스에서 ID(PID)를 갖지 않는 다른 수준에서 실행됩니다.
  • 주어진 명령의 출력에서 ​​프로세스 ID 또는 프로세스 프로그램을 찾을 수 없습니다: lsof, netstat, ss, fuser.
  • 위 명령의 출력에서 ​​수신 포트를 찾았습니다. 그러나 수신을 유발하는 프로그램이나 PID를 구성할 수는 없습니다.

에 대한 grep:

grep오픈포트에 대한 자세한 정보를 알아보는데 활용하겠습니다 .

grep- 패턴과 일치하는 라인을 인쇄합니다.

grep명령을 통해 매뉴얼 페이지 에서 man grep.

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.
  • 여기명령을 정확하고 효과적으로 사용하는 방법에 대한 훌륭한 주제입니다.

PID 또는 주어진 포트를 사용하는 프로그램을 찾는 방법 grep:

제 경우에는 실행하면 sudo grep --exclude-dir={sys,proc} -rnw / -e 51820 | grep -i port문제가 해결되었고 포트를 사용하는 프로그램에 대한 할당 정보가 표시되었습니다.

주어진 출력:

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

플래그가 많은 이유는 내가 시도한 다른 조합에서 원치 않는 출력이 많이 발생했기 때문입니다.

명령 의 주장이 grep의미하는 것:

  • --exclude-dir- 패턴과 일치하는 이름 접미사가 있는 명령줄 디렉터리를 건너뜁니다.

그리고 특정 무시 sysproc디렉토리우리의 특별한 경우에는 원치 않는 출력을 방지하는 것입니다.

예: grep --exclude-dir={dir1,dir2}검색 중에 dir1 및 dir2를 피합니다.

  • -r또는 -R재귀적입니다.
  • -n줄 번호입니다.
  • -w전체 단어 일치를 의미합니다.
  • /위에서 아래로 검색을 시작하는 "가장 높은" 디렉토리를 나타냅니다.
  • -e- 검색 중에 사용되는 패턴입니다.
  • 51820특정한 경우에는 위의 네트워크 모니터링 명령 중 하나에서 찾은 포트 번호입니다.
  • |- 첫 번째 명령 부분의 출력을 두 번째 명령 부분으로 리디렉션하는 파이프입니다.

우리의 경우: sudo grep --exclude-dir={sys,proc} -rnw / -e 51820출력을 다음 명령으로 리디렉션grep -i port

  • -i- 패턴과 입력 데이터에서 대소문자 구분을 무시하여 대소문자만 다른 문자가 서로 일치하도록 합니다.
  • port- 검색을 수행한 목적으로 결과 범위를 좁히고 플래그 다음에 정의된 특정 포트에 대한 추가 정보를 찾기 위해 발견되었습니다 -e.

팁:

  • 첫 번째 단계에서는 디렉터리에서 시작하여 최소 플래그를 사용하여 출력을 필터링함으로써 스캔을 최대한 크게 만들어 /우리가 달성할 수 있는 세부 정보를 놓치지 않도록 합니다.
  • 원하는 출력을 찾거나 원하지 않는 출력이 할당되어 원하는 출력을 찾는 데 문제가 발생한 후 플래그를 하나씩 추가하기 시작합니다.
  • 포트 번호를 패턴으로 지정하십시오. 결국 이것이 시작점이자 끝 목표입니다.
  • grep첫 번째 스캔을 패턴 필터로 리디렉션하는 이중 명령을 사용하면 port우리를 정확히 찾아내고 솔루션 속도를 높일 수 있습니다. 결국 우리는 패턴으로 숫자를 찾고 있으며 이로 인해 원하지 않는 결과가 많이 발생할 수 있습니다.
  • 주어진 결과로 결론을 내릴 수 없다면 찾은 키워드를 선택하여 웹에서 검색해 보세요.

관련 정보