📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 56편
이전 글: 55. Dynamic Port · 다음 글: 57. Destination Port
Source Port(출발지 포트, sport) 는 TCP·UDP 헤더의 첫 16비트 필드로, 이 패킷을 보낸 프로세스가 사용하는 포트 번호입니다. 받는 쪽의 Destination Port와 짝을 이루므로, 두 필드를 함께 놓고 설명합니다.
| 필드 | 위치 | 크기 | 의미 |
|---|---|---|---|
| Source Port (sport) | 헤더 0~1바이트 | 16비트 | 이 패킷을 보낸 프로세스의 포트 |
| Destination Port (dport) | 헤더 2~3바이트 | 16비트 | 이 패킷을 받을 프로세스의 포트 |
두 필드는 TCP·UDP에서 위치와 크기가 같아서, 도구들이 전송 계층 종류와 관계없이 같은 방식으로 포트를 읽을 수 있습니다. 헤더의 나머지 필드는 01. TCP/IP 구조 이해 영역 40. TCP와 UDP 헤더 비교 — 신뢰성과 속도의 차이에서 다룹니다.
출발지 포트는 누가 정할까요? 클라이언트가 접속할 때는 보통 운영체제가 임시(Dynamic) 포트 범위에서 자동으로 골라 붙입니다(55. Dynamic Port). 서버가 응답할 때는 자신이 LISTEN하던 서비스 포트(예: 80)가 출발지 포트가 됩니다. 즉 같은 연결 안에서도 패킷 방향이 바뀌면 sport 값이 바뀝니다. 이 글은 출발지 포트의 이런 성질과 관제에서의 해석에 집중하고, 목적지 포트 쪽 해석은 다음 글 57. Destination Port에서 다룹니다.
클라이언트 192.168.10.30 서버 192.168.10.20 (nginx :80)
요청 ① sport 51200 ─────────────────────→ dport 80
응답 ② dport 51200 ←───────────────────── sport 80
요청 ③ sport 51200 ─────────────────────→ dport 80
↓
패킷 단위: ①③은 sport=51200/dport=80, ②는 sport=80/dport=51200
세션 단위: "192.168.10.30:51200 → 192.168.10.20:80" 하나의 연결
(Initiator = 클라이언트, 서비스 포트 = 80)
로그와 도구는 이 둘 중 하나의 관점으로 기록합니다.
| 기록 주체 | 기록 단위 | sport·dport의 의미 |
|---|---|---|
| tcpdump·Wireshark | 패킷 | 각 패킷의 실제 헤더 값 (방향마다 바뀜) |
| Stateful 방화벽 세션 로그 | 세션 | 보통 첫 패킷(연결 시작) 기준 — Initiator 쪽이 src |
| IDS Alert | 탐지된 패킷(또는 흐름) | 룰이 걸린 패킷 기준이라 응답 패킷이면 서버가 src로 찍힐 수 있음 |
| NetFlow 등 흐름 기록 | 흐름 | 단방향 흐름이면 요청·응답이 별도 레코드 |
특히 IDS에서 "서버 응답 내용"을 보는 룰(예: 에러 메시지, 유출 의심 데이터)은 Alert의 src가 내부 서버, sport가 80 으로 나타납니다. 이것을 "내부 서버가 외부를 공격"으로 읽으면 방향을 거꾸로 해석한 것입니다(06. 방화벽 · IDS 기초 영역 295. IDS Alert의 Source/Destination 분석에서 다룸).
출발지 포트를 보고 "이 패킷이 요청인가 응답인가"를 가늠하는 기준입니다. 한 가지 기준만으로 확정하지 않고 여러 개를 함께 봅니다.
| 판단 기준 | 서비스 쪽일 가능성이 높은 포트 | 예외 |
|---|---|---|
| 번호 크기 | 낮은 번호 (Well-Known·Registered) | 8080·50000 같은 고번호 서비스, 양쪽 모두 낮은 번호(NTP 123↔123) |
| 번호의 변화 | 여러 연결에서 고정 | 한 클라이언트의 고정 출발지 포트 프로토콜 |
| 첫 패킷 | SYN을 받은 쪽의 포트 | 캡처가 연결 도중부터 시작된 경우 |
| LISTEN 여부 | 해당 호스트에서 LISTEN 중인 포트 | 호스트 확인이 불가능한 외부 IP |
출발지 포트가 고정되는 정상 프로토콜도 알아 둡니다.
| 프로토콜 | 출발지 → 목적지 | 비고 |
|---|---|---|
| DHCP | 68 → 67 (응답 67 → 68) | UDP, 브로드캐스트 (48. DHCP DORA 과정 — IP를 받는 4단계) |
| NTP | 123 → 123 (구현에 따라 임시 포트 사용) | 78. NTP와 로그 시간 동기화 |
| IKE (IPsec VPN) | 500 → 500, NAT 통과 시 4500 → 4500 | UDP |
| NetBIOS Name Service | 137 → 137 | UDP |
실습 예시 — tcpdump 필터로 포트 방향을 구분해 봅니다(Rocky/Ubuntu 공통, 인터페이스 ens33은 예시).
# 목적지 포트가 80인 패킷만 = 클라이언트 → 서버 방향
sudo tcpdump -nn -i ens33 'tcp dst port 80'
# 출발지 포트가 80인 패킷만 = 서버 → 클라이언트 방향
sudo tcpdump -nn -i ens33 'tcp src port 80'
# 방향 무관, 80이 어느 쪽이든
sudo tcpdump -nn -i ens33 'tcp port 80'
출력 형식 예시(값은 환경마다 다름):
192.168.10.30.51200 > 192.168.10.20.80: Flags [S], seq 1000, length 0
192.168.10.20.80 > 192.168.10.30.51200: Flags [S.], seq 5000, ack 1001, length 0
같은 연결이 방화벽 세션 로그에서는 한 줄로 요약되는 형식 예시입니다(필드명은 장비마다 다름).
src=192.168.10.30 sport=51200 dst=192.168.10.20 dport=80 proto=tcp action=allow sent=812 rcvd=15320
sent·rcvd처럼 방향별 바이트가 있으면 "Initiator가 보낸 양"과 "받은 양"을 구분할 수 있습니다.
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 방화벽 세션 로그 | Initiator 기준 src·dst, 방향별 바이트 |
| IDS Alert | 룰에 걸린 패킷의 sport·dport (응답 패킷일 수 있음) |
| 패킷 캡처 | 첫 SYN 방향으로 Initiator 확정 |
| NAT 로그 | 변환 전·후 출발지 포트 |
관제자가 확인할 질문
오탐 주의: IDS Alert의 src가 내부 서버라고 해서 내부에서 시작된 통신으로 단정하지 않습니다. 응답 패킷에 걸린 룰인지 룰 내용과 방화벽 세션 로그로 교차 확인합니다. IP와 포트를 묶어 보는 분석은 91. IP + Port 분석에서 이어집니다.