포트 번호의 구조
포트 번호의 구조
1. 포트 번호란?
포트 번호 개념
┌─────────────────────────────────────────────────────────────┐
│ 포트 번호 (Port Number) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 정의: │
│ • 0 ~ 65535 범위의 16비트 숫자 │
│ • 같은 컴퓨터에서 실행되는 애플리케이션을 구분 │
│ • TCP/UDP 헤더에 포함 │
│ │
│ 역할: │
│ ───────────────────────────────────────── │
│ • IP 주소: "어떤 컴퓨터인가?" │
│ • 포트 번호: "컴퓨터 안의 어떤 프로그램인가?" │
│ │
│ 비유: │
│ ───────────────────────────────────────── │
│ • IP 주소 = 아파트 주소 (예: 123-456번지) │
│ • 포트 번호 = 호수 (예: 101호, 202호) │
│ │
│ 예시: │
│ 192.168.1.10:80 │
│ └──────┬─────┘ └┬┘ │
│ IP 주소 포트 번호 │
│ │
└─────────────────────────────────────────────────────────────┘포트 번호의 필요성
┌─────────────────────────────────────────────────────────────┐
│ 포트 번호가 없다면? │
├─────────────────────────────────────────────────────────────┤
│ │
│ 컴퓨터 (IP: 192.168.1.10) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │웹브라우저│ │ 이메일 │ │메신저앱 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ │ │ │ │ │
│ │ └──────────────┴──────────────┘ │ │
│ │ ↓ │ │
│ │ 데이터가 도착했는데... │ │
│ │ 어디로 보내야 하지? ✗ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ → IP 주소만으로는 애플리케이션 구분 불가! │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 포트 번호가 있다면! │
├─────────────────────────────────────────────────────────────┤
│ │
│ 컴퓨터 (IP: 192.168.1.10) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │웹브라우저│ │ 이메일 │ │메신저앱 │ │ │
│ │ │포트 52341│ │포트 52342│ │포트 52343│ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
│ │ │ │ │ │ │
│ │ └──────────────┴──────────────┘ │ │
│ │ ↓ │ │
│ │ [전송 계층 - 포트 번호로 구분] │ │
│ │ ↓ │ │
│ │ 52341로 온 데이터 → 웹브라우저 ✓ │ │
│ │ 52342로 온 데이터 → 이메일 ✓ │ │
│ │ 52343로 온 데이터 → 메신저앱 ✓ │ │
│ │ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ → 포트 번호로 정확한 애플리케이션에 전달! │
│ │
└─────────────────────────────────────────────────────────────┘2. 포트 번호의 구조
16비트 구조
┌─────────────────────────────────────────────────────────────┐
│ 포트 번호 16비트 구조 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 비트: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 │
│ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │
│ │
│ 범위: 0 ~ 65535 (2^16 - 1) │
│ │
│ 예시: │
│ • 포트 80 (HTTP): │
│ 0000 0000 0101 0000 (2진수) │
│ │
│ • 포트 443 (HTTPS): │
│ 0000 0001 1011 1011 (2진수) │
│ │
│ • 포트 3306 (MySQL): │
│ 0000 1100 1110 1010 (2진수) │
│ │
└─────────────────────────────────────────────────────────────┘포트 번호 분류
┌─────────────────────────────────────────────────────────────┐
│ 포트 번호 범위와 분류 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 전체 범위: 0 ~ 65535 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 0 1024 49152 65535 │ │
│ ├──────────┼──────────────────────┼─────────────────┤ │
│ │Well-Known│ Registered │ Dynamic │ │
│ │ Ports │ Ports │ (Private) Ports│ │
│ └──────────┴──────────────────────┴─────────────────┘ │
│ │
│ │
│ 1. Well-Known Ports (0 ~ 1023) │
│ ───────────────────────────────────────── │
│ • IANA (Internet Assigned Numbers Authority)가 관리 │
│ • 잘 알려진 서비스/프로토콜에 할당 │
│ • 시스템 포트 (System Ports)라고도 함 │
│ • 보통 관리자 권한 필요 (Unix/Linux) │
│ │
│ 예시: │
│ - 20, 21 : FTP │
│ - 22 : SSH │
│ - 25 : SMTP │
│ - 53 : DNS │
│ - 80 : HTTP │
│ - 443 : HTTPS │
│ │
│ │
│ 2. Registered Ports (1024 ~ 49151) │
│ ───────────────────────────────────────── │
│ • IANA에 등록된 포트 │
│ • 특정 서비스나 애플리케이션이 사용 │
│ • User Ports라고도 함 │
│ • 일반 사용자도 사용 가능 │
│ │
│ 예시: │
│ - 3306 : MySQL │
│ - 3389 : RDP (Remote Desktop) │
│ - 5432 : PostgreSQL │
│ - 8080 : HTTP 대체 포트 │
│ - 27017 : MongoDB │
│ │
│ │
│ 3. Dynamic/Private Ports (49152 ~ 65535) │
│ ───────────────────────────────────────── │
│ • 동적 포트, 임시 포트 (Ephemeral Ports) │
│ • 클라이언트가 서버 연결 시 자동으로 할당 │
│ • IANA에 등록되지 않음 │
│ • 운영체제가 자동으로 관리 │
│ │
│ 사용 예: │
│ - 웹 브라우저가 웹 서버 접속 시 │
│ - 임시로 52341번 같은 포트 할당 │
│ │
│ │
│ 참고: 실제 동적 포트 범위는 OS마다 다름 │
│ ───────────────────────────────────────── │
│ • Linux: 32768 ~ 60999 │
│ • Windows: 49152 ~ 65535 │
│ │
└─────────────────────────────────────────────────────────────┘3. 주요 포트 번호
Well-Known Ports 상세
┌─────────────────────────────────────────────────────────────┐
│ 주요 Well-Known Ports (0-1023) │
├──────────┬──────────────────┬───────────────────────────────┤
│포트 번호 │ 프로토콜/서비스 │ 설명 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 20 │ FTP-DATA │ FTP 데이터 전송 │
│ 21 │ FTP │ FTP 제어 (명령) │
├──────────┼──────────────────┼───────────────────────────────┤
│ 22 │ SSH │ 보안 셸 (원격 접속) │
├──────────┼──────────────────┼───────────────────────────────┤
│ 23 │ Telnet │ 원격 터미널 (비보안) │
├──────────┼──────────────────┼───────────────────────────────┤
│ 25 │ SMTP │ 이메일 전송 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 53 │ DNS │ 도메인 이름 시스템 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 67 │ DHCP (Server) │ DHCP 서버 │
│ 68 │ DHCP (Client) │ DHCP 클라이언트 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 80 │ HTTP │ 웹 (Hyper Text Transfer) │
├──────────┼──────────────────┼───────────────────────────────┤
│ 110 │ POP3 │ 이메일 수신 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 143 │ IMAP │ 이메일 수신 (고급) │
├──────────┼──────────────────┼───────────────────────────────┤
│ 443 │ HTTPS │ 보안 웹 (SSL/TLS) │
├──────────┼──────────────────┼───────────────────────────────┤
│ 465 │ SMTPS │ 보안 이메일 전송 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 993 │ IMAPS │ 보안 IMAP │
├──────────┼──────────────────┼───────────────────────────────┤
│ 995 │ POP3S │ 보안 POP3 │
└──────────┴──────────────────┴───────────────────────────────┘Registered Ports 주요 예시
┌─────────────────────────────────────────────────────────────┐
│ 주요 Registered Ports (1024-49151) │
├──────────┬──────────────────┬───────────────────────────────┤
│포트 번호 │ 프로토콜/서비스 │ 설명 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 1433 │ MS SQL Server │ Microsoft SQL Server │
├──────────┼──────────────────┼───────────────────────────────┤
│ 1521 │ Oracle │ Oracle Database │
├──────────┼──────────────────┼───────────────────────────────┤
│ 3306 │ MySQL │ MySQL Database │
├──────────┼──────────────────┼───────────────────────────────┤
│ 3389 │ RDP │ 원격 데스크톱 (Windows) │
├──────────┼──────────────────┼───────────────────────────────┤
│ 5432 │ PostgreSQL │ PostgreSQL Database │
├──────────┼──────────────────┼───────────────────────────────┤
│ 5900 │ VNC │ Virtual Network Computing │
├──────────┼──────────────────┼───────────────────────────────┤
│ 6379 │ Redis │ Redis 인메모리 DB │
├──────────┼──────────────────┼───────────────────────────────┤
│ 8080 │ HTTP-Alt │ HTTP 대체 포트 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 8443 │ HTTPS-Alt │ HTTPS 대체 포트 │
├──────────┼──────────────────┼───────────────────────────────┤
│ 9200 │ Elasticsearch │ Elasticsearch REST API │
├──────────┼──────────────────┼───────────────────────────────┤
│ 27017 │ MongoDB │ MongoDB Database │
└──────────┴──────────────────┴───────────────────────────────┘4. 소켓 (Socket) 개념
IP 주소 + 포트 번호 = 소켓
┌─────────────────────────────────────────────────────────────┐
│ 소켓 (Socket) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 정의: │
│ • IP 주소 + 포트 번호의 조합 │
│ • 네트워크 통신의 종단점 (Endpoint) │
│ • 통신하는 두 프로그램을 연결하는 가상의 연결점 │
│ │
│ 표기법: │
│ IP주소:포트번호 │
│ │
│ 예시: │
│ 192.168.1.10:80 │
│ └───────┬────┘ └┬┘ │
│ IP 주소 포트 │
│ │
│ 172.16.0.5:8080 │
│ 142.250.185.78:443 │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 통신 예시 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 웹 브라우저 → 웹 서버 접속 │
│ │
│ [클라이언트] [서버] │
│ 192.168.1.10:52341 → 142.250.185.78:80 │
│ └────────┬─────────┘ └────────┬──────┘ │
│ 소켓 1 소켓 2 │
│ │
│ • 소켓 1: 출발지 (Source Socket) │
│ • 소켓 2: 목적지 (Destination Socket) │
│ │
│ → 두 소켓이 연결되어 통신 수행 │
│ │
└─────────────────────────────────────────────────────────────┘
통신 쌍 (Connection Pair):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
(출발지 IP:포트, 목적지 IP:포트)의 4개 값으로 연결 식별
예시:
(192.168.1.10:52341, 142.250.185.78:80)
(192.168.1.10:52342, 142.250.185.78:80)
(192.168.1.10:52343, 172.217.175.46:443)
→ 같은 서버(IP)에 접속해도 클라이언트 포트가 다르면
별개의 연결로 구분!5. 동적 포트 할당
클라이언트 포트 자동 할당
┌─────────────────────────────────────────────────────────────┐
│ 동적 포트 할당 과정 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 웹 브라우저로 google.com 접속 예시: │
│ │
│ Step 1: 사용자가 브라우저에 URL 입력 │
│ ───────────────────────────────────────── │
│ https://www.google.com │
│ │
│ │
│ Step 2: OS가 자동으로 임시 포트 할당 │
│ ───────────────────────────────────────── │
│ ┌──────────────────┐ │
│ │ 웹 브라우저 │ │
│ ├──────────────────┤ │
│ │ "구글 접속할래!" │ │
│ └────────┬─────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────┐ │
│ │ 운영체제 (네트워크 스택) │ │
│ │ │ │
│ │ 사용 가능한 포트 검색... │ │
│ │ • 52341번 확인 → 사용 중 │ │
│ │ • 52342번 확인 → 사용 안 함 ✓ │ │
│ │ │ │
│ │ → 52342번 할당! │ │
│ └────────┬───────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────┐ │
│ │ 웹 브라우저 │ │
│ │ 192.168.1.10 │ │
│ │ 포트: 52342 │ ← 자동 할당됨! │
│ └──────────────────┘ │
│ │
│ │
│ Step 3: 서버로 연결 요청 │
│ ───────────────────────────────────────── │
│ [클라이언트] [서버] │
│ 192.168.1.10:52342 142.250.185.78:443 │
│ │ │ │
│ │── SYN (연결 요청) ─────→│ │
│ │ │ │
│ │←─── SYN+ACK ────────────│ │
│ │ │ │
│ │─── ACK ────────────────→│ │
│ │ │ │
│ │ 연결 성공! │ │
│ │
│ │
│ Step 4: 연결 종료 후 포트 반환 │
│ ───────────────────────────────────────── │
│ • 웹 페이지 로딩 완료 │
│ • 연결 종료 (4-Way Handshake) │
│ • 포트 52342번 반환 │
│ • 다른 애플리케이션이 재사용 가능 │
│ │
└─────────────────────────────────────────────────────────────┘포트 할당 과정 상세
┌─────────────────────────────────────────────────────────────┐
│ 클라이언트의 동적 포트 할당 │
├─────────────────────────────────────────────────────────────┤
│ │
│ OS의 포트 관리: │
│ │
│ 사용 가능 포트 풀 (Pool): │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 49152 49153 49154 ... 52341 52342 ... 65535 │ │
│ │ ✓ ✓ ✗ ✗ ✓ ✓ │ │
│ │ 사용 사용 사용중 사용중 사용 사용 │ │
│ │ 가능 가능 가능 가능 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ │
│ 할당 알고리즘: │
│ ───────────────────────────────────────── │
│ │
│ 1. 순차 할당 (일부 OS) │
│ • 49152 → 49153 → 49154 → ... │
│ • 예측 가능 (보안상 약점) │
│ │
│ 2. 랜덤 할당 (대부분 최신 OS) │
│ • 무작위로 선택 │
│ • 보안 강화 │
│ • 포트 스캔 공격 방어 │
│ │
│ │
│ 여러 연결 시: │
│ ───────────────────────────────────────── │
│ │
│ 같은 서버에 동시 접속: │
│ • 브라우저 탭 1: 192.168.1.10:52341 → google.com:443 │
│ • 브라우저 탭 2: 192.168.1.10:52342 → google.com:443 │
│ • 브라우저 탭 3: 192.168.1.10:52343 → google.com:443 │
│ │
│ → 클라이언트 포트가 다르므로 별개의 연결! │
│ │
└─────────────────────────────────────────────────────────────┘6. TCP/UDP 헤더의 포트 번호
TCP 헤더에서의 포트
┌─────────────────────────────────────────────────────────────┐
│ TCP 헤더 구조 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 비트: 0 16 31 │
│ ├────────────────────┼────────────────────┤ │
│ 0 │ ┌──────────────────────────────────┐ │ │
│ │ │ 출발지 포트 (Source Port) │ │ │
│ │ │ 16비트 │ │ ← 여기! │
│ │ └──────────────────────────────────┘ │ │
│ ├────────────────────┼────────────────────┤ │
│ │ ┌──────────────────────────────────┐ │ │
│ │ │ 목적지 포트 (Destination Port) │ │ │
│ │ │ 16비트 │ │ ← 여기! │
│ │ └──────────────────────────────────┘ │ │
│ ├─────────────────────────────────────────┤ │
│ 32 │ 순서 번호 (Sequence Number) │ │
│ │ (32비트) │ │
│ ├─────────────────────────────────────────┤ │
│ 64 │ 확인 응답 번호 (ACK Number) │ │
│ │ (32비트) │ │
│ ├────┬──────┬────┬────────────────────────┤ │
│ 96 │헤더│예약 │플래그│ 윈도우 크기 │ │
│ │길이│(6bit)│(6bit)│ (16비트) │ │
│ └────┴──────┴────┴────────────────────────┘ │
│ │
│ 출발지 포트 (16비트): │
│ • 송신측 애플리케이션의 포트 번호 │
│ • 0 ~ 65535 범위 │
│ │
│ 목적지 포트 (16비트): │
│ • 수신측 애플리케이션의 포트 번호 │
│ • 0 ~ 65535 범위 │
│ │
└─────────────────────────────────────────────────────────────┘UDP 헤더에서의 포트
┌─────────────────────────────────────────────────────────────┐
│ UDP 헤더 구조 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 비트: 0 16 31 │
│ ├────────────────────┼────────────────────┤ │
│ 0 │ 출발지 포트 │ 목적지 포트 │ │
│ │ (16비트) │ (16비트) │ │
│ ├────────────────────┼────────────────────┤ │
│ 32 │ 길이 (16비트) │ 체크섬 (16비트) │ │
│ ├────────────────────┴────────────────────┤ │
│ 64 │ 데이터 │ │
│ │ ... │ │
│ └─────────────────────────────────────────┘ │
│ │
│ • TCP보다 헤더가 간단 (8바이트 고정) │
│ • 포트 번호 필드는 동일 (각 16비트) │
│ • 출발지 포트는 선택사항 (0으로 설정 가능) │
│ │
└─────────────────────────────────────────────────────────────┘7. 실무 활용
포트 확인 명령어
Windows에서 포트 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 모든 포트 연결 상태 확인
> netstat -an
활성 연결
프로토콜 로컬 주소 외부 주소 상태
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING
TCP 192.168.1.10:52341 142.250.185.78:443 ESTABLISHED
TCP 192.168.1.10:52342 20.189.173.1:443 TIME_WAIT
2. 프로세스 정보 포함
> netstat -ano
프로토콜 로컬 주소 외부 주소 상태 PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 192.168.1.10:52341 142.250.185.78:443 ESTABLISHED 5678
3. 특정 포트 확인
> netstat -an | findstr ":80"
> netstat -an | findstr "LISTEN"
4. 특정 포트 사용 프로세스 확인
> netstat -ano | findstr ":80"
> tasklist /FI "PID eq 1234"
Linux에서 포트 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 모든 포트 연결 상태 (ss 명령어 - 권장)
$ ss -tuln
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:443 0.0.0.0:*
tcp ESTAB 0 0 192.168.1.10:52341 142.250.185.78:443
2. 프로세스 정보 포함
$ ss -tulnp
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
3. netstat 명령어 (전통적)
$ netstat -tuln
$ netstat -tulnp # 프로세스 정보 포함
4. 특정 포트 확인
$ ss -tuln | grep :80
$ lsof -i :80 # 포트 80 사용 프로세스
5. LISTEN 중인 포트만
$ ss -tln
$ netstat -tln포트 사용 예시
┌─────────────────────────────────────────────────────────────┐
│ 실제 통신 예시 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 웹 브라우저로 3개 사이트 동시 접속: │
│ │
│ [내 컴퓨터: 192.168.1.10] │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │구글 탭 │ │유튜브 탭 │ │깃허브 탭 │ │ │
│ │ │포트: 52341 │ │포트: 52342 │ │포트: 52343 │ │ │
│ │ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ │ │
│ │ │ │ │ │ │
│ └────────┼───────────────┼───────────────┼───────────┘ │
│ │ │ │ │
│ ↓ ↓ ↓ │
│ │
│ 연결 1: 192.168.1.10:52341 → 142.250.185.78:443 (Google) │
│ 연결 2: 192.168.1.10:52342 → 142.250.142.91:443 (YouTube) │
│ 연결 3: 192.168.1.10:52343 → 140.82.114.4:443 (GitHub) │
│ │
│ → 클라이언트 포트가 다르므로 각각 독립된 연결! │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 서버 입장에서 본 포트 │
├─────────────────────────────────────────────────────────────┤
│ │
│ [웹 서버: 203.0.113.50] │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 웹 서버 │ │메일 서버 │ │ FTP 서버 │ │ │
│ │ │포트: 80 │ │포트: 25 │ │포트: 21 │ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
│ │ │ │ │ │ │
│ │ └─────────────┴─────────────┘ │ │
│ │ ↑ │ │
│ │ [전송 계층이 포트로 구분] │ │
│ │ │ │
│ └──────────────────────────────────────────────────────┘ │
│ ↑ ↑ ↑ │
│ 포트 80 요청 포트 25 요청 포트 21 요청 │
│ │
│ • 포트 80: 웹 서버로 전달 │
│ • 포트 25: 메일 서버로 전달 │
│ • 포트 21: FTP 서버로 전달 │
│ │
└─────────────────────────────────────────────────────────────┘8. 포트 관련 문제와 해결
포트 충돌 (Port Conflict)
┌─────────────────────────────────────────────────────────────┐
│ 포트 충돌 문제 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 문제 상황: │
│ • 같은 포트를 두 프로그램이 동시에 사용하려 할 때 │
│ • "Address already in use" 오류 발생 │
│ │
│ │
│ 예시: │
│ ───────────────────────────────────────── │
│ │
│ 1. Apache 웹 서버가 80번 포트 사용 중 │
│ 2. Nginx를 80번 포트로 시작하려 함 │
│ │
│ ┌─────────────┐ │
│ │ Apache │ │
│ │ 포트: 80 │ ✓ 사용 중 │
│ └─────────────┘ │
│ │
│ ┌─────────────┐ │
│ │ Nginx │ │
│ │ 포트: 80 │ ✗ 시작 실패! │
│ └─────────────┘ │
│ │
│ 오류 메시지: │
│ "bind() to 0.0.0.0:80 failed (98: Address already in use)"│
│ │
│ │
│ 해결 방법: │
│ ───────────────────────────────────────── │
│ │
│ 1. 기존 프로그램 종료 │
│ Windows: │
│ > netstat -ano | findstr :80 │
│ > taskkill /PID 1234 /F │
│ │
│ Linux: │
│ $ lsof -i :80 │
│ $ kill -9 1234 │
│ │
│ │
│ 2. 다른 포트 사용 │
│ • Nginx를 8080번 포트로 설정 │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Apache │ │ Nginx │ │
│ │ 포트: 80 │ │ 포트: 8080 │ 둘 다 실행 가능! │
│ └─────────────┘ └─────────────┘ │
│ │
│ │
│ 3. TIME_WAIT 상태 대기 │
│ • 서버 재시작 시 TIME_WAIT로 포트가 일시적으로 점유 │
│ • 1~2분 대기 후 재시도 │
│ • 또는 SO_REUSEADDR 옵션 사용 │
│ │
└─────────────────────────────────────────────────────────────┘방화벽과 포트
┌─────────────────────────────────────────────────────────────┐
│ 방화벽 포트 제어 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 방화벽의 역할: │
│ • 특정 포트를 열거나 차단 │
│ • 보안을 위한 접근 제어 │
│ │
│ │
│ 예시: 웹 서버 방화벽 설정 │
│ ───────────────────────────────────────── │
│ │
│ [인터넷] [방화벽] [서버] │
│ │ │ │ │
│ │── 포트 80 요청 ─────────→ │ 허용 ✓ │ │
│ │ ├───────────────→│ │
│ │ │ │ │
│ │── 포트 22 요청 ─────────→ │ 차단 ✗ │ │
│ │ ╳ │ │
│ │ │ │
│ │
│ │
│ Windows 방화벽 포트 열기: │
│ ───────────────────────────────────────── │
│ │
│ > netsh advfirewall firewall add rule │
│ name="HTTP Port 80" │
│ dir=in │
│ action=allow │
│ protocol=TCP │
│ localport=80 │
│ │
│ │
│ Linux 방화벽 포트 열기 (firewalld): │
│ ───────────────────────────────────────── │
│ │
│ $ firewall-cmd --permanent --add-port=80/tcp │
│ $ firewall-cmd --reload │
│ │
│ │
│ Linux 방화벽 포트 열기 (ufw): │
│ ───────────────────────────────────────── │
│ │
│ $ ufw allow 80/tcp │
│ $ ufw enable │
│ │
└─────────────────────────────────────────────────────────────┘보안 고려사항
┌─────────────────────────────────────────────────────────────┐
│ 포트 보안 Best Practice │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 불필요한 포트 닫기 │
│ ───────────────────────────────────────── │
│ • 사용하지 않는 서비스는 중지 │
│ • 포트 스캔으로 열린 포트 확인 │
│ │
│ $ nmap -p- localhost # 모든 포트 스캔 │
│ │
│ │
│ 2. 잘 알려진 포트 변경 (Security by Obscurity) │
│ ───────────────────────────────────────── │
│ • SSH 22번 → 2222번 변경 │
│ • 완벽한 보안은 아니지만 자동화된 공격 방어 │
│ │
│ 나쁜 예: SSH 22번 (기본) │
│ 좋은 예: SSH 2222번 + 키 인증 │
│ │
│ │
│ 3. 외부 접근 제한 │
│ ───────────────────────────────────────── │
│ • 관리 포트는 특정 IP만 허용 │
│ • 로컬호스트에서만 접근 허용 │
│ │
│ 예: MySQL은 127.0.0.1:3306만 허용 │
│ (외부 직접 접근 차단) │
│ │
│ │
│ 4. 포트 노킹 (Port Knocking) │
│ ───────────────────────────────────────── │
│ • 특정 순서로 포트를 두드려야 포트 개방 │
│ • 예: 7000, 8000, 9000 순서로 접근 → SSH 22번 개방 │
│ │
│ │
│ 5. 정기적인 포트 감사 │
│ ───────────────────────────────────────── │
│ • 주기적으로 열린 포트 점검 │
│ • 불필요하게 노출된 포트 발견 │
│ │
│ $ netstat -tuln | grep LISTEN │
│ $ ss -tuln │
│ │
└─────────────────────────────────────────────────────────────┘핵심 정리
| 개념 | 설명 |
|---|---|
| 포트 번호 | 0~65535 범위의 16비트 숫자, 애플리케이션 식별 |
| Well-Known Ports | 0~1023, 잘 알려진 서비스용 (HTTP:80, HTTPS:443) |
| Registered Ports | 1024~49151, 등록된 애플리케이션용 (MySQL:3306) |
| Dynamic Ports | 49152~65535, 클라이언트가 임시로 사용 |
| 소켓 | IP 주소 + 포트 번호 조합 (예: 192.168.1.10:80) |
| 동적 포트 할당 | OS가 클라이언트에게 자동으로 포트 할당 |
| 포트 충돌 | 같은 포트를 여러 프로그램이 사용하려 할 때 발생 |
포트 번호 요약
┌─────────────────────────────────────────────────────────────┐
│ 포트 번호 핵심 개념 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 포트 번호 = 애플리케이션 구분자 │
│ ───────────────────────────────────────── │
│ • IP: 컴퓨터 찾기 │
│ • Port: 프로그램 찾기 │
│ │
│ 2. 16비트 = 0~65535 │
│ ───────────────────────────────────────── │
│ • 0~1023: 시스템 예약 (HTTP, HTTPS, SSH 등) │
│ • 1024~49151: 애플리케이션 등록 │
│ • 49152~65535: 동적 할당 (클라이언트) │
│ │
│ 3. 소켓 = IP + Port │
│ ───────────────────────────────────────── │
│ • 통신의 양 끝점 │
│ • 예: 192.168.1.10:52341 │
│ │
│ 4. 서버는 고정 포트, 클라이언트는 동적 포트 │
│ ───────────────────────────────────────── │
│ • 서버: 80, 443 등 고정 │
│ • 클라이언트: OS가 자동 할당 (52341 등) │
│ │
│ │
│ 통신 예시: │
│ ───────────────────────────────────────── │
│ │
│ [클라이언트] [서버] │
│ 192.168.1.10:52341 203.0.113.50:80 │
│ └────────┬─────────┘ └────────┬──────┘ │
│ 동적 할당 고정 포트 │
│ │
│ → 두 소켓이 연결되어 HTTP 통신! │
│ │
└─────────────────────────────────────────────────────────────┘주요 명령어 정리
포트 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Windows:
> netstat -an # 모든 연결
> netstat -ano # PID 포함
> netstat -an | findstr ":80" # 특정 포트
Linux:
$ ss -tuln # 모든 연결
$ ss -tulnp # 프로세스 포함
$ lsof -i :80 # 포트 80 사용 프로세스
$ netstat -tuln # 전통적 방식
포트 사용 프로세스 확인:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Windows:
> netstat -ano | findstr ":80"
> tasklist /FI "PID eq 1234"
Linux:
$ lsof -i :80
$ fuser 80/tcp
테스트:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$ telnet [host] [port] # 포트 연결 테스트
$ nc -zv [host] [port] # 포트 스캔
$ nmap -p 80 [host] # 포트 확인용어 정리
- 포트 번호 (Port Number): 0~65535 범위의 16비트 숫자로 애플리케이션을 구분
- Well-Known Ports: 0~1023 범위, 잘 알려진 서비스용 포트
- Registered Ports: 1024~49151 범위, 등록된 애플리케이션용
- Dynamic Ports (Ephemeral Ports): 49152~65535 범위, 임시 포트
- 소켓 (Socket): IP 주소와 포트 번호의 조합 (예: 192.168.1.10:80)
- 출발지 포트 (Source Port): 데이터를 보내는 측의 포트 번호
- 목적지 포트 (Destination Port): 데이터를 받는 측의 포트 번호
- 동적 포트 할당: 운영체제가 클라이언트에게 자동으로 포트 번호를 할당하는 과정
- 포트 충돌 (Port Conflict): 같은 포트를 여러 프로그램이 동시에 사용하려 할 때 발생하는 문제