네트워크 연결 또는 응용 프로그램 관련 문제를 해결할 때 가장 먼저 확인해야 할 사항 중 하나는 시스템에서 실제로 사용 중인 포트와 특정 포트에서 수신 중인 응용 프로그램입니다.
이 문서에서는 netstat, ss 및 lsof 명령을 사용하여 어떤 서비스가 어떤 포트에서 수신 중인지 확인하는 방법에 대해 설명합니다. 이 지침은 macOS와 같은 모든 Linux 및 Unix 기반 운영 체제에 적용됩니다.
수신 대기 포트란
네트워크 포트는 번호, 연결된 IP 주소 및 통신 프로토콜 유형(예: TCP 또는 UDP)으로 식별됩니다.
수신 포트는 응용 프로그램 또는 프로세스가 수신 대기하는 네트워크 포트로, 통신 끝점 역할을 합니다.
방화벽을 사용하여 각 수신 포트를 열거나 닫을 수 있습니다. 일반적으로 개방형 포트는 원격 위치에서 들어오는 패킷을 수신하는 네트워크 포트입니다.
두 서비스가 동일한 IP 주소에서 동일한 포트를 수신하도록 할 수 없습니다.
예를 들어 포트 80 및 443에서 수신 대기하는 Apache 웹 서버를 실행 중이고 Nginx를 설치하려고 하면 HTTP 및 HTTPS 포트가 이미 사용 중이므로 나중에 시작되지 않습니다.
netstat를 사용하여 수신 포트를 선택
netstat는 네트워크 연결에 대한 정보를 제공할 수 있는 명령줄 도구입니다.
포트 및 소켓 상태를 사용하는 서비스를 포함하여 수신 중인 모든 TCP 또는 UDP 포트를 나열하려면 다음 명령을 사용합니다.
sudo netstat -tunlp
이 명령에 사용되는 옵션에는 다음과 같은 뜻이 있습니다.
-t - TCP 포트를 표시합니다.
-u - UDP 포트를 표시합니다.
-n - 호스트를 확인하는 대신 숫자 주소를 표시합니다.
-l - 수신 포트만 표시합니다.
-p - 수신기 프로세스의 PID 및 이름을 표시합니다. 이 정보는 명령을 루트 또는 sudo 사용자로 실행하는 경우에만 표시됩니다.
출력은 다음과 같습니다.
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 445/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 929/master
tcp6 0 0 :::3306 :::* LISTEN 534/mysqld
tcp6 0 0 :::80 :::* LISTEN 515/apache2
tcp6 0 0 :::22 :::* LISTEN 445/sshd
tcp6 0 0 :::25 :::* LISTEN 929/master
tcp6 0 0 :::33060 :::* LISTEN 534/mysqld
udp 0 0 0.0.0.0:68 0.0.0.0:* 966/dhclient
이 경우 중요한 열은 다음과 같습니다.
Proto - 소켓에 사용되는 프로토콜입니다.
로컬 주소 - 프로세스가 수신하는 IP 주소 및 포트 번호입니다.
PID/프로그램 이름 - PID 및 프로세스 이름입니다.
결과를 필터링하려면 grep 명령을 사용하십시오. 예를 들어 TCP 포트 22에서 수신하는 프로세스를 찾으려면 다음을 입력합니다.
sudo netstat -tnlp | grep :22
출력에 이 컴퓨터의 포트 22가 SSH 서버에서 사용되는 것으로 나타납니다.
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 445/sshd
tcp6 0 0 :::22 :::* LISTEN 445/sshd
출력이 비어 있으면 포트에서 수신 중인 항목이 없음을 의미합니다.
PID, 프로토콜, 상태 등과 같은 조건을 기준으로 목록을 필터링할 수도 있습니다.
netstat는 더 이상 사용되지 않으며 ss 및 ip로 대체되지만 네트워크 연결을 확인하는 데 가장 많이 사용되는 명령입니다.
ss를 사용하여 수신 포트를 확인
ss는 새로운 netstat입니다. 일부 netstat 기능이 없지만 TCP 상태를 더 많이 노출하고 속도가 약간 더 빠릅니다. 명령 옵션은 대부분 동일하므로 netstat에서 ss로 전환하는 것은 어렵지 않습니다.
ss와 함께 모든 수신 포트 목록을 가져오려면 다음을 입력합니다.
출력은 netstat에서 보고한 출력과 거의 동일합니다.
sudo ss -tunlp
# State Recv-Q Send-Q Local Address:Port Peer Address:Port
# LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=445,fd=3))
# LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=929,fd=13))
# LISTEN 0 128 *:3306 *:* users:(("mysqld",pid=534,fd=30))
# LISTEN 0 128 *:80 *:* users:(("apache2",pid=765,fd=4),("apache2",pid=764,fd=4),("apache2",pid=515,fd=4))
# LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=445,fd=4))
# LISTEN 0 100 [::]:25 [::]:* users:(("master",pid=929,fd=14))
# LISTEN 0 70 *:33060 *:* users:(("m
수신 포트를 lsof로 확인
lsof는 프로세스에서 여는 파일에 대한 정보를 제공하는 강력한 명령줄 유틸리티입니다.
Linux에서는 모든 것이 파일입니다. 소켓은 네트워크에 쓰는 파일이라고 생각할 수 있습니다.
ls 유형의 모든 수신 TCP 포트 목록을 가져오려면 다음과 같이 하십시오.
sudo lsof -nP -iTCP -sTCP:LISTEN
사용되는 옵션은 다음과 같습니다.
-n - 포트 번호를 포트 이름으로 변환하지 않습니다.
-p - 호스트 이름을 확인하지 않고 숫자 주소를 표시합니다.
-iTCP -sTCP입니다.LISTEN - TCP 상태 LISTEN인 네트워크 파일만 표시합니다.
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# sshd 445 root 3u IPv4 16434 0t0 TCP *:22 (LISTEN)
# sshd 445 root 4u IPv6 16445 0t0 TCP *:22 (LISTEN)
# apache2 515 root 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
# mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN)
# mysqld 534 mysql 33u IPv6 19973 0t0 TCP *:33060 (LISTEN)
# apache2 764 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
# apache2 765 www-data 4u IPv6 16590 0t0 TCP *:80 (LISTEN)
# master 929 root 13u IPv4 19637 0t0 TCP *:25 (LISTEN)
# master 929 root 14u IPv6 19638 0t0 TCP *:25 (LISTEN)
대부분의 출력 열 이름은 쉽게 설명할 수 있습니다.
- COMMAND, PID, USER - 포트와 연결된 프로그램을 실행하는 이름, pid 및 사용자입니다.
- NAME- 포트 번호입니다.
포트 3306과 같이 특정 포트에서 수신 중인 프로세스를 확인하려면 다음을 사용합니다.
출력에 MySQL 서버가 포트 3306을 사용하는 것으로 나타납니다.
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# mysqld 534 mysql 30u IPv6 17636 0t0 TCP *:3306 (LISTEN)
자세한 내용은 ls of man 페이지를 방문하여 이 도구의 다른 모든 강력한 옵션에 대해 읽어보십시오.
시스템에서 사용 중인 포트를 확인하고 특정 포트에서 수신하는 프로세스를 찾는 데 사용할 수 있는 몇 가지 명령을 보여 드렸습니다.
'OS > linux' 카테고리의 다른 글
linux 리눅스에서 mysql 자동 백업하기 cron (0) | 2023.02.17 |
---|---|
CentOS Apache 설치 (0) | 2023.02.16 |