Mac에서 열린 포트 확인하는 방법: lsof, netstat, nc

lsof -i :3000, netstat, nc를 사용하여 Mac에서 열린 포트를 확인하는 방법. 로컬 포트 확인과 원격 호스트 테스트를 실제 명령어 출력 예시와 함께 설명합니다.

rails server를 실행했는데 아무것도 로드되지 않습니다. 또는 원격 서버에 연결하려고 하는데 응답이 없습니다. 항상 같은 첫 번째 질문이 생깁니다: 포트가 실제로 열려 있는가?

Mac에서 포트 상태를 확인하는 것은 명령어 하나면 됩니다. 핵심은 자신의 Mac을 확인하는지, 아니면 원격 호스트를 확인하는지에 따라 어떤 명령어를 사용할지 아는 것입니다.

자신의 Mac의 열린 포트 확인하기

개발자에게 가장 흔한 경우입니다. 개발 서버가 포트 3000에서 실행 중이어야 하는데, 브라우저가 연결할 수 없다고 합니다. 포트가 리스닝 상태인지조차 확인이 안 되는 상황입니다.

lsof -i :port (빠른 답변)

lsof -i :3000

무언가가 리스닝 중이라면 다음과 같은 출력이 표시됩니다:

COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby     8421  aaron  13u  IPv4 0x3f8a2b4c      0t0  TCP *:3000 (LISTEN)

출력이 비어있다면 그 포트에 아무것도 바인딩되지 않은 것입니다. Rails 서버가 실행 중이지 않거나 다른 포트에서 시작된 것입니다.

포트 8080의 경우:

lsof -i :8080

포트 80의 경우 (권한이 필요한 포트이므로 sudo 필요):

sudo lsof -i :80

lsof -i | grep LISTEN (한 번에 모두 보기)

Mac이 현재 리스닝 중인 모든 포트를 보려면:

lsof -i | grep LISTEN

출력은 열린 리스닝 포트를 가진 모든 프로세스를 보여줍니다:

ruby      8421  aaron  13u  IPv4  TCP *:3000 (LISTEN)
node      9102  aaron  21u  IPv6  TCP *:8080 (LISTEN)
postgres  1234  aaron   5u  IPv4  TCP localhost:5432 (LISTEN)

localhost:5432*:3000의 차이에 주목하세요. Postgres는 같은 머신에서만 연결을 수락합니다. Rails는 네트워크 어디서든 수락합니다. 이 구분은 다른 디바이스에서 연결하려 할 때 중요합니다.

호스트명 조회 없이 숫자 포트를 원하시면 (더 빠름):

lsof -i -n -P | grep LISTEN

netstat -an | grep LISTEN

netstat은 다른 형식으로 유사한 뷰를 제공합니다:

netstat -an | grep LISTEN

출력은 다음과 같습니다:

tcp4       0      0  *.3000                 *.*                    LISTEN
tcp4       0      0  127.0.0.1.5432         *.*                    LISTEN
tcp6       0      0  *.8080                 *.*                    LISTEN

포트 앞의 주소가 인터페이스를 알려줍니다. *.3000은 모든 인터페이스(네트워크에서 접근 가능)를 의미합니다. 127.0.0.1.5432는 로컬호스트만을 의미합니다.

netstat은 프로세스 이름 없이 빠른 플랫 목록을 원할 때 유용합니다. lsof는 어떤 앱이 어떤 포트를 소유하는지 알아야 할 때 더 유용합니다.

결과의 의미

LISTEN 출력에 무언가가 있는 경우: 포트가 열려 있고 프로세스가 소유하고 있습니다. 여전히 연결할 수 없다면 문제는 다른 곳에 있습니다 (방화벽, 잘못된 IP, 인증).

lsof에서 출력 없음 / netstat에서 없음: 그 포트에서 리스닝하는 것이 없습니다. 서비스가 실행 중이지 않거나 다른 포트에서 시작된 것입니다.

출력에 127.0.0.1 또는 localhost가 표시됨: 서비스가 로컬 연결만 수락합니다. 같은 네트워크의 다른 머신이나 폰에서 접근할 수 없습니다.

원격 호스트의 포트 확인하기

제어하지 않는 서버의 포트가 열려 있는지 테스트해야 할 때, lsof를 사용할 수 없습니다. 대신 실제로 연결을 시도하고 어떤 일이 발생하는지 확인합니다.

nc -zv (올바른 도구)

nc -zv hostname 443

포트가 열려 있다면:

Connection to hostname port 443 [https] succeeded!

포트가 닫혀 있다면 (아무것도 리스닝하지 않음):

nc: connectx to hostname port 80 (tcp) failed: Connection refused

포트가 필터링되어 있다면 (방화벽이 패킷을 차단):

nc: connectx to hostname port 25 (tcp) failed: Operation timed out

“Connection refused"는 서버에 도달할 수 있지만 그 포트에 아무것도 없다는 의미입니다. “Timed out"은 방화벽이 패킷을 차단하고 있을 가능성이 높습니다.

실제 사용 예:

# 서버에서 HTTPS가 작동하나요?
nc -zv myserver.com 443

# 이 서버에 SSH가 열려 있나요?
nc -zv 192.168.1.100 22

# 이 머신에서 데이터베이스 포트에 접근할 수 있나요?
nc -zv db.internal 5432

여러 포트를 한 번에 확인할 수도 있습니다:

nc -zv hostname 80 443 8080

결과 해석하기

결과 의미
Connection succeeded 포트가 열려 있고 무언가가 리스닝 중
Connection refused 포트가 닫혀 있고 아무것도 리스닝하지 않음
Operation timed out 방화벽이 연결을 차단하고 있음
Name or service not known 호스트명이 해석되지 않음 (DNS 문제)

포트가 성공했지만 서비스가 여전히 작동하지 않는다면, 문제는 애플리케이션 레이어에 있습니다: 잘못된 자격 증명, 프로토콜 불일치, 앱이 연결을 거부하는 경우입니다.

확인할 일반적인 포트들

디버깅할 때 가장 자주 나오는 포트들입니다:

  • 22 (SSH): SSH 연결이 안 된다면 여기서 먼저 확인하세요.
  • 80 (HTTP)과 443 (HTTPS): 웹 서버가 응답하지 않습니다.
  • 3000, 3001, 8000, 8080: 일반적인 개발 서버 포트. Rails는 기본적으로 3000을 사용하고, 많은 Node 앱은 8080을 사용합니다.
  • 5432 (PostgreSQL), 3306 (MySQL), 27017 (MongoDB): 데이터베이스 연결 문제.
  • 25 (SMTP): 앱이 이메일을 보낼 수 없나요? ISP와 클라우드 제공업체에 의해 자주 차단됩니다.

보안: Mac이 어떤 포트를 노출하고 있나요?

보안 관점에서 가끔 lsof -i | grep LISTEN을 실행해 볼 가치가 있습니다. 모든 리스닝 포트는 잠재적인 진입점입니다. 노트북에서는 가능한 한 열린 포트가 적은 것이 좋습니다.

예상치 못한 열린 포트의 일반적인 원인:

  • 실행 중인 개발 서버 (Rails, Node, Webpack)
  • 호스트에 포트를 매핑하는 Docker
  • 원격 데스크톱 또는 화면 공유 활성화
  • AirPlay 수신기
  • 백그라운드 서비스를 실행하는 서드파티 앱

인식하지 못하는 것이 있다면, lsof 출력에서 PID를 가져와 조회해 보세요:

ps aux | grep <PID>

macOS 방화벽 사용하기

macOS 방화벽은 외부에서 Mac에 연결할 수 있는 것을 제어합니다. 시스템 설정 > 네트워크 > 방화벽 (또는 일부 버전에서는 시스템 설정 > 개인 정보 보호 및 보안 > 방화벽)에서 확인하세요.

방화벽이 켜져 있으면 다른 머신은 명시적으로 허용하지 않는 한 Mac의 리스닝 서비스에 접근할 수 없습니다. Mac은 여전히 외부로 연결할 수 있습니다.

로컬 개발 서버가 브라우저에서는 잘 로드되지만 같은 네트워크의 폰에서는 로드되지 않는다면, 방화벽이 원인일 가능성이 높습니다.

GUI 옵션: NetUtil의 포트 스캐너

명령어를 입력하지 않으려면, NetUtil에 포트 스캐너가 포함되어 있습니다. 호스트명과 포트 범위를 입력하면 열린 포트가 표 형식으로 표시됩니다. macOS Monterey에서 제거되기 전 Apple의 네트워크 유틸리티에 있던 포트 스캐너의 직접적인 대체품입니다.

정기적인 디버깅에는 Terminal 명령어가 익히면 더 빠릅니다. lsof -i :3000은 몇 번 사용하면 몇 번의 키 입력만으로 가능합니다. 가끔씩 확인하거나 원격 서버의 포트 범위를 스캔하고 싶을 때는 GUI 도구가 시간을 절약해 줍니다.

빠른 참조

Mac이 특정 포트에서 리스닝 중인지 확인:

lsof -i :3000

Mac이 리스닝 중인 모든 포트 보기:

lsof -i | grep LISTEN

netstat으로도 동일하게:

netstat -an | grep LISTEN

원격 포트가 열려 있는지 확인:

nc -zv hostname 443

Mac의 포트 상태는 서비스가 실행 중인지 알려줍니다. 원격 호스트의 포트 상태는 그 서비스에 접근 가능한지 알려줍니다. 두 개의 다른 질문, 두 개의 다른 도구입니다.