Linux에서 포트 스캔을 수행하는 방법

Linux에서 허가된 자산의 포트 상태를 점검하는 방법입니다. ss/lsof, nc/curl, nmap 기본 스캔, /dev/tcp, 결과 해석과 운영 기준을 정리했습니다.

Linux에서 포트 스캔은 서버가 어떤 TCP/UDP 포트를 열고 있는지 확인하는 점검 방법입니다. 본인 소유 서버, 허가된 내부망, 랩 환경에서 서비스 노출 상태를 확인하는 용도로만 사용해야 합니다.

무단으로 타인 시스템을 스캔하면 정책 위반이나 법적 문제가 될 수 있습니다. 운영자는 점검 대상, 시간, 범위, 연락 채널을 먼저 정하고 실행해야 합니다.

로컬 listen 확인

sudo ss -lntup
sudo lsof -i -P -n | grep LISTEN
sudo fuser -n tcp 80 2>/dev/null

로컬 서버에서 어떤 프로세스가 포트를 열었는지 볼 때는 외부 스캔보다 ss가 빠르고 정확합니다.

단일 포트 확인

nc -vz 192.0.2.10 22
nc -vz 192.0.2.10 80
curl -I --connect-timeout 3 http://192.0.2.10/

open, refused, timeout은 의미가 다릅니다. refused는 대상 host까지 도달했지만 포트가 닫힌 경우가 많고, timeout은 방화벽 drop이나 경로 문제일 수 있습니다.

Nmap 기본 점검

nmap 192.0.2.10
nmap -p 22,80,443 192.0.2.10
nmap -sV -p 22,80,443 192.0.2.10
nmap -oN scan-web01.txt -p 1-1024 192.0.2.10

-sV는 서비스 버전 추정을 시도합니다. 운영 중인 민감 시스템에는 사전 승인 없이 넓은 포트 범위나 높은 빈도의 스캔을 실행하지 않습니다.

여러 대상 점검

cat > targets.txt <<'EOF'
192.0.2.10
192.0.2.11
EOF

nmap -iL targets.txt -p 22,80,443 -oA internal-web-check

대상 목록 파일에는 고객/외부 IP가 섞이지 않도록 관리합니다. 점검 결과 파일에도 내부 IP와 서비스 정보가 들어가므로 공유 범위를 제한합니다.

UDP 점검 주의

sudo nmap -sU -p 53,123 192.0.2.10
nc -vzu 192.0.2.10 53

UDP는 TCP처럼 연결 성립 과정이 없어서 결과 해석이 어렵습니다. 응답이 없다는 이유만으로 포트가 닫혔다고 단정하지 말고 서비스 로그, 방화벽 로그, 서버 측 listen 상태를 같이 확인합니다.

Bash /dev/tcp 간단 확인

timeout 3 bash -c 'cat < /dev/null > /dev/tcp/192.0.2.10/22' \
  && echo "open" || echo "closed or filtered"

/dev/tcp는 Bash 기능이지 실제 파일이 아닙니다. timeout 없이 쓰면 오래 걸릴 수 있으므로 제한 시간을 둡니다.

결과 해석

  • open: 포트가 응답합니다.
  • closed: host는 응답하지만 해당 포트가 닫혀 있습니다.
  • filtered: 방화벽이나 네트워크 장비가 응답을 막았을 수 있습니다.
  • open|filtered: UDP처럼 결과를 명확히 구분하기 어려운 경우입니다.

서버 측 대조

sudo ss -lntup
sudo systemctl status nginx --no-pager
sudo firewall-cmd --list-all 2>/dev/null
sudo nft list ruleset 2>/dev/null | head
sudo iptables -L -n -v 2>/dev/null

외부에서 open으로 보이는 포트가 실제 어떤 프로세스인지 서버에서 대조해야 합니다. 컨테이너 환경에서는 호스트 port publishing과 컨테이너 내부 listen 포트를 함께 확인합니다.

docker ps --format "table {{.Names}}\t{{.Ports}}" 2>/dev/null
docker compose ps 2>/dev/null

운영 기준

  • 스캔 전 대상 CIDR과 포트 범위를 명확히 승인받습니다.
  • 업무 시간 중 대량 스캔은 장애처럼 보일 수 있으므로 피합니다.
  • 스캔 결과는 방화벽 정책, 서비스 설정, CMDB와 대조합니다.
  • 불필요하게 열린 포트는 서비스 중지, 방화벽 차단, 접근 제어 중 적절한 방식으로 정리합니다.
  • 변경 후 같은 명령과 같은 대상 범위로 재검증해 결과 차이를 기록합니다.

공식 문서

BGM EVER