📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 81편
이전 글: 80. ARP · 다음 글: 82. 메일 프로토콜 SMTP·POP3·IMAP
웹 서비스는 "80과 443"으로 끝나지 않습니다. 실제 웹 시스템은 외부에 보이는 포트(웹 서버·프록시)와 내부에서만 쓰는 포트(WAS, 관리 콘솔, 연동 프로토콜)로 나뉩니다. HTTP 메시지 구조와 TLS는 61. HTTP 요청·응답 구조, 62. HTTPS와 TLS Handshake — 암호화된 통신에서 볼 수 있는 것에서 다뤘습니다.
이 글은 웹 관련 포트 지도를 정리하고, 어떤 포트가 외부에 보이면 안 되는지를 봅니다.
| 포트 | 전송 | 용도 | 외부 공개 |
|---|---|---|---|
| 80 | TCP | HTTP | 보통 443으로 리다이렉트용 |
| 443 | TCP | HTTPS (HTTP/1.1, HTTP/2) | 공개 |
| 443 | UDP | HTTP/3 (QUIC) | 서버가 지원할 때 공개 |
| 8080 | TCP | 대체 HTTP, WAS·프록시 기본값으로 흔함 | 원칙적으로 내부 |
| 8443 | TCP | 대체 HTTPS, 관리 화면에 흔함 | 원칙적으로 내부 |
| 8000, 8888 등 | TCP | 개발 서버, 테스트용 | 운영 환경에서는 없어야 함 |
일반적인 웹 시스템은 리버스 프록시가 443을 받아 내부 WAS로 넘기는 구조입니다. 같은 요청이 구간마다 다른 포트로 기록됩니다.
사용자 203.0.113.50:52311
│ TCP 443 (TLS)
↓
[방화벽] 외부 → 192.168.10.20:443 만 허용
↓
[웹 서버·리버스 프록시 nginx] 0.0.0.0:80, 0.0.0.0:443
│ TLS 종료 → HTTP로 내부 전달
│ 127.0.0.1:8080 (같은 서버) 또는 192.168.20.30:8080 (WAS 서버)
↓
[WAS Tomcat 등] 8080 HTTP 커넥터
│ ├ 8005 종료 명령 포트 (localhost)
│ └ 8009 AJP 커넥터 (웹 서버 연동용, 설정 시)
↓
[DB] 3306 / 5432 ... (83편에서 다룸)
X-Forwarded-For 헤더로 전달되는 경우가 많습니다.제품별로 기본값이 정해진 내부·관리 포트입니다. 설정으로 바꿀 수 있으므로 "기본값 기준"으로만 봅니다.
| 포트 | 대표 제품·용도 (기본값 기준) | 노출 시 위험 |
|---|---|---|
| 8080 | Apache Tomcat HTTP 커넥터, Jenkins 등 | 프록시 우회 직접 접근, 관리 화면 노출 |
| 8005 | Tomcat 종료(shutdown) 포트, localhost 바인드 | 원격 접근 가능하면 서비스 중지 위험 |
| 8009 | Tomcat AJP 커넥터 | Ghostcat(CVE-2020-1938) 같은 AJP 취약점 |
| 7001 / 7002 | Oracle WebLogic HTTP / HTTPS | 관리 콘솔 노출 |
| 9990 | WildFly(JBoss) 관리 콘솔 | 관리 기능 노출 |
| 9090 | Cockpit(서버 웹 관리, Rocky에서 흔함) | 서버 관리 화면 노출 |
| 3000, 5000, 8000 | Node.js, Flask, Django 개발 서버 관례 | 디버그 모드·개발 코드 노출 |
HTTP/3는 UDP 443을 씁니다. 방화벽 정책이 TCP 443만 허용하면 브라우저는 TCP로 대체(fallback)하므로 서비스는 되지만, 로그상 같은 사이트 트래픽이 TCP·UDP 두 가지로 나타날 수 있습니다.
실습 예시 — 본인 소유 웹 서버 VM(192.168.10.20)에서 웹 관련 포트와 바인드 주소를 확인합니다.
# 웹 관련 LISTEN 포트와 프로세스 (Rocky/Ubuntu 공통)
sudo ss -tlnp | grep -E ':(80|443|8080|8443|8005|8009|9090) '
sudo ss -ulnp | grep ':443 ' # HTTP/3(QUIC) 사용 여부
# 헤더로 어떤 서버가 응답하는지 확인 (다른 본인 VM에서)
curl -sI http://192.168.10.20/
curl -sI http://192.168.10.20:8080/
| 항목 | Rocky Linux | Ubuntu |
|---|---|---|
| Apache 패키지·서비스 | httpd | apache2 |
| 웹 포트 추가 시 | SELinux 허용 목록 확인: semanage port -l 결과의 http_port_t | 해당 없음(AppArmor 기본 정책) |
| 방화벽 | firewall-cmd --add-service=https | ufw allow 443/tcp |
ss 출력 형식 예시(값은 환경마다 다름, 프로세스 정보 생략):
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 100 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 1 127.0.0.1:8005 0.0.0.0:*
| 줄 | 해석 |
|---|---|
0.0.0.0:80, 0.0.0.0:443 | 모든 인터페이스에서 수신 → 외부 공개 포트 |
127.0.0.1:8080 | 같은 서버의 프록시만 접근 가능 → 양호 |
127.0.0.1:8005 | Tomcat 종료 포트가 localhost에만 바인드 → 양호 |
8080이 0.0.0.0 또는 *로 바인드되어 있고 방화벽도 열려 있다면, 프록시를 거치지 않는 직접 접근 경로가 생깁니다.
📷 [실습 화면 삽입 위치]
ss -tlnp결과에서 공개 포트(0.0.0.0)와 내부 포트(127.0.0.1)를 구분한 화면
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 방화벽 로그 | 외부 → 8080·8443·8009 등 내부 포트 접근 시도(허용·차단) |
| WAF·프록시 로그 | 443 요청, 원래 사용자 IP, 차단 사유 |
| 웹 서버·WAS 접근 로그 | 요청 경로, 응답 코드, 출발지(프록시 IP 여부) |
| IDS/IPS | 관리 콘솔 경로, AJP 등 포트별 취약점 시그니처 |
관제자가 확인할 질문
오탐 주의: 내부 개발망·모니터링 시스템은 8080·8443 등으로 정상 통신합니다. 로드밸런서 헬스체크도 WAS 포트에 주기적으로 접근하므로, 출발지가 LB·모니터링 자산인지 먼저 확인합니다.