조회수: 9
목차
포트 오픈 여부가 왜 중요한가
서버 운영이나 개발을 하다 보면 “서비스는 분명 떠 있는데 접속이 안 된다”라는 상황을 자주 마주하게 된다. 이때 가장 먼저 볼 것은 해당 포트가 실제로 열려(Listen) 있는지, 그리고 외부에서 접근 가능한 상태인지다.
포트 체크는 단순 연결 여부를 넘어서 다음과 같은 이유로 중요하다.
- 서비스가 정상 기동되었는지 확인
- 방화벽, 보안 그룹 설정이 올바른지 검증
- 예상치 못한 포트 오픈으로 인한 보안 취약점 점검
- 특정 포트를 사용하는 프로세스를 찾아 장애 원인 분석
아래 방법들을 익혀 두면 리눅스 서버든, 개발용 로컬 환경이든 포트 문제를 훨씬 빠르게 진단할 수 있다.
netstat로 현재 열려 있는 포트 확인하기
전통적인 포트 확인 명령으로 가장 많이 언급되는 도구가 netstat다. 요즘 배포판에서는 ss로 대체되기도 했지만, 여전히 많은 환경에서 사용된다.
리눅스에서 자주 쓰는 기본 예시는 다음과 같다.
netstat -tulnp
-t: TCP-u: UDP-l: LISTEN 중인 소켓만-n: 호스트명 대신 숫자(IP, 포트) 그대로 출력-p: 해당 포트를 잡고 있는 프로세스 정보 표시
예를 들어 80번 포트가 열려 있는지 보고 싶다면 grep으로 걸러볼 수 있다.
netstat -tulnp | grep :80
출력 결과의 Local Address 컬럼에서 0.0.0.0:80이나 :::80과 같이 표시된다면 해당 포트에서 리스닝 중이라는 뜻이다. 127.0.0.1:80처럼 로컬 루프백 주소로만 떠 있다면 외부에서 접근이 안 될 수 있다는 점도 함께 확인해야 한다.
윈도우에서도 비슷하게 사용할 수 있다.
netstat -ano | findstr :80
여기서는 -o 옵션을 통해 PID를 확인하고, 작업 관리자나 tasklist 명령으로 어떤 프로세스가 포트를 쓰는지 추가로 추적할 수 있다.
ss 명령으로 빠르게 포트 상태 확인하기
최근 리눅스에서는 netstat보다 ss를 권장하는 경우가 많다. ss는 속도가 빠르고, 더 다양한 필터를 제공한다.
가장 많이 쓰는 기본 명령은 다음과 같다.
ss -tulnp
옵션 의미는 netstat와 거의 비슷하다. 특정 포트만 보고 싶다면 다음처럼 필터를 걸 수 있다.
ss -ltn 'sport = :8080'
-l: LISTEN 상태-t: TCP-n: 숫자 그대로 표시sport = :8080: source port가 8080인 소켓
결과에서 LISTEN 상태이고, Local Address:Port에 원하는 포트가 보인다면 서버 내부에서는 해당 포트가 열려 있다고 볼 수 있다. 이 상태에서 외부 접속이 안 되면, 포트가 아니라 방화벽이나 네트워크 라우팅 문제일 가능성이 크다.
ss는 소켓 상태별 통계도 쉽게 볼 수 있어, 다수의 연결이 몰릴 때 병목을 파악하는 데에도 유용하다.
ss -s
lsof로 포트와 프로세스를 한 번에 조회하기
포트 체크를 하다 보면 “이 포트를 누가 쓰고 있지?”가 가장 궁금할 때가 많다. 그럴 때는 lsof를 활용하면 편리하다.
특정 포트를 사용하는 프로세스를 찾는 기본 예시는 다음과 같다.
lsof -i:3306
MySQL이나 MariaDB처럼 3306 포트를 사용하는 서비스가 있을 경우, 해당 포트에 바인딩된 프로세스와 PID를 바로 보여준다.
TCP 포트만, 그리고 LISTEN 상태만 보고 싶다면 다음과 같이 사용할 수 있다.
lsof -iTCP:443 -sTCP:LISTEN
여기서 확인할 수 있는 포인트는 다음과 같다.
- 어떤 실행 파일(COMMAND)이 포트를 점유하는지
- 실행 유저가 누구인지
- 프로세스 PID가 무엇인지
포트 충돌로 인해 신규 서비스가 뜨지 않을 때, 혹은 의도치 않은 프로세스가 민감한 포트를 열고 있을 때 lsof는 강력한 진단 도구가 된다.
nc(netcat)로 원격 포트 오픈 여부 테스트하기
지금까지는 “서버 내부에서” 포트가 열려 있는지 확인하는 방법이었다. 그러나 실제 사용자 입장에서는 “외부에서 접속 가능한지”가 더 중요하다. 그럴 때 유용한 도구가 nc(netcat)다.
특정 서버의 포트가 열려 있는지 간단히 확인하는 방식은 다음과 같다.
nc -zv example.com 80
-z: 실제 데이터를 보내지 않고 스캔만 수행-v: verbose 모드로 결과를 자세히 출력
포트가 열려 있으면 “succeeded”와 비슷한 메시지가 출력되고, 닫혀 있으면 “connection refused” 또는 “timed out” 등의 메시지가 나온다.
여러 포트를 한 번에 검사할 수도 있다.
nc -zv example.com 80 443 8080
내부 방화벽이나 클라우드 보안 그룹 설정에 따라, 서버 내부에서 보는 포트 상태와 외부에서 보는 포트 상태가 다를 수 있다. nc를 사용하면 실제 클라이언트 관점에서 포트가 열려 있는지 빠르게 확인할 수 있다.
간단한 통신 테스트도 가능하다. 예를 들어 로컬에서 테스트 서버를 띄우고 싶다면 다음과 같이 쓸 수 있다.
# 서버 쪽
nc -l 9000
# 클라이언트 쪽
echo "hello" | nc 127.0.0.1 9000
이렇게 하면 포트만 열려 있는지 보는 것을 넘어, 실제 데이터 송수신이 되는지도 확인할 수 있다.
nmap으로 서버 포트 스캔하기
조금 더 체계적으로 서버의 포트 오픈 상태를 보고 싶다면 nmap을 사용할 수 있다. 보안 점검이나 운영 환경 진단에서 널리 사용되는 도구다.
특정 포트만 확인하는 가장 단순한 예시는 다음과 같다.
nmap -p 22,80,443 example.com
특정 범위를 스캔하고 싶다면:
nmap -p 1-1024 example.com
nmap은 포트가 열려 있는지(open), 필터링되어 있는지(filtered), 닫혀 있는지(closed)를 구분해서 보여준다. 실제 서비스 운영 시에는 다음과 같은 관점에서 활용할 수 있다.
- 의도한 포트만 외부에 노출되어 있는지 확인
- 운영팀, 보안팀에서 관리하지 않는 의심 포트가 열려 있지 않은지 점검
- 클라우드 환경에서 보안그룹, 방화벽 설정이 제대로 적용되었는지 검증
단, nmap을 사용할 때는 반드시 권한이 있는 시스템에만 사용해야 한다. 무단 스캔은 보안 정책 위반이나 법적 문제가 될 수 있으므로, 자신의 서버 또는 승인된 범위 내에서만 활용하는 것이 기본이다.
상황별 포트 확인 방법 추천
실제 운영 환경에서 어떤 도구를 선택하면 좋을지 상황별로 정리하면 다음과 같다.
- 서버 내부에서 서비스가 제대로 떠 있는지 확인
→ ss 또는 netstat로 LISTEN 상태 확인, 필요하면 lsof로 프로세스까지 추적 - 특정 포트를 어느 프로세스가 점유하는지 알고 싶을 때
→ lsof -i:포트번호 로 바로 확인 - 외부 사용자가 접속이 안 된다고 할 때
→ nc로 외부에서 포트 오픈 여부 테스트, 필요 시 nmap으로 스캔 - 보안 관점에서 노출 포트를 정기적으로 점검하고 싶을 때
→ nmap으로 전체 혹은 주요 포트 범위를 주기적으로 점검
서버 내부 도구(ss, netstat, lsof)와 외부 테스트 도구(nc, nmap)를 조합하면 문제 위치를 훨씬 빠르게 좁혀갈 수 있다.
포트가 닫혀 있을 때 확인해야 할 체크리스트
포트가 열려 있지 않거나, 열려 있는데도 접속이 안 되는 경우 다음 항목들을 차례대로 확인해 보면 좋다.
- 서비스 프로세스가 실제로 떠 있는가
- systemd 기반:
systemctl status 서비스명 - Docker, Kubernetes 등 컨테이너 환경이라면 컨테이너 상태부터 점검
- systemd 기반:
- 포트가 LISTEN 상태로 떠 있는가
ss -ltn혹은netstat -tulnp로 실제 포트 리스닝 여부 확인
- 리스닝 주소가 적절한가
127.0.0.1에만 바인딩되어 있으면 외부 접속 불가- 외부에서 접근하려면
0.0.0.0또는 특정 외부 IP에 바인딩 필요
- 서버 내부 방화벽 설정
- iptables, firewalld, ufw 등에서 해당 포트 허용 여부 확인
- 클라우드 보안 그룹, 로드밸런서 설정
- AWS, GCP, Azure 등에서는 인스턴스 보안 그룹, 네트워크 ACL, 로드밸런서 리스너/타깃 그룹 설정까지 모두 확인해야 한다.
- 네트워크 경로 문제
- 사내망, VPN, 게이트웨이, 프록시 등 중간 장비에서 포트가 막혀 있지 않은지 확인
이 체크리스트를 따라가며 ss, netstat, lsof, nc, nmap을 적절히 조합하면 대부분의 포트 관련 장애는 원인을 찾아낼 수 있다.
마무리
서버 포트가 열려 있는지 확인하는 작업은 단순해 보이지만, 실제로는 서버 내부 상태, 프로세스, 방화벽, 네트워크, 보안 설정까지 모두 아우르는 중요한 진단 과정이다.
netstat와 ss로 내부 포트를 확인하고, lsof로 포트와 프로세스를 매칭하고, nc와 nmap으로 외부에서 실제 접근 가능 여부를 검증하는 흐름을 익혀 두면, 장애 대응 속도와 정확도가 눈에 띄게 달라진다. 개발 환경이든 운영 환경이든, 위 명령들을 실습해 보며 자신의 서비스에 맞는 포트 점검 루틴을 만들어 두는 것을 추천한다.
참고 문서
- netstat 매뉴얼: https://man7.org/linux/man-pages/man8/netstat.8.html
- ss 매뉴얼: https://man7.org/linux/man-pages/man8/ss.8.html
- lsof 매뉴얼: https://man7.org/linux/man-pages/man8/lsof.8.html
- nmap 공식 사이트: https://nmap.org/