Step 34. 포트와 서비스 — 건물 안의 호수
Level 0 — 컴퓨터 조작과 구조의 이해 | 난이도 ★★★☆☆ | 예상 소요 시간 3시간
전제: Step 31~33(IP, ARP, DNS) 완료. 윈도우 파워쉘에서 진행합니다. 연결 시험의 대상은 내 컴퓨터와 내 게이트웨이뿐입니다.
- 준비물: 윈도우 PC, 파워쉘.
- 주의: 조회와 내 장비로의 연결 시험만 합니다.
Test-NetConnection으로 내 장비가 아닌 주소를 두드리지 마세요 — 포트를 두드려 보는 행위는 대상이 남의 것이면 침입의 준비 행위로 볼 수 있습니다.
지난 챕터들에서 우리는 주소(IP)를 배웠습니다. 그런데 질문이 하나 남습니다. 한 대의 서버가 웹 서비스도 하고, 원격 접속도 받고, 메일도 주고받는다면 — 들어온 편지를 어느 부서에 전달할까요? 컴퓨터는 이 문제를 번호 하나 더로 해결합니다.
IP가 건물 주소라면, 포트(port)는 그 건물 안의 호수(방 번호)입니다. 172.30.1.54:22라고 쓰면 "172.30.1.54라는 건물의 22호"라는 뜻입니다. 이 번호들은 전 세계가 약속한 것이라, 열린 번호만 보고도 그 건물에 어떤 부서가 사는지 추측할 수 있습니다. 오늘은 그 언어를 배웁니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 포트가 무엇이며 IP와 어떻게 다른지(건물과 호수) 설명한다
- 주요 well-known 포트 15개를 번호와 함께 말한다
netstat -an으로 내 컴퓨터의 LISTENING 포트를 찾아 읽는다- "포트 → PID → 프로그램" 삼단 연결로 열린 포트의 주인을 찾는다
0.0.0.0에 열린 것과127.0.0.1에만 열린 것의 차이를 보안 관점에서 설명한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 파워쉘 5.1 (조회 중심, 일반 권한으로 충분) |
| 오늘의 명령어 | netstat -an(열린 문 목록), netstat -ano(PID까지), tasklist(PID로 이름 찾기), Test-NetConnection 주소 -Port 번호(문 두드리기) |
| 필요한 개념 | 포트 번호와 세 구역, LISTENING/ESTABLISHED, 바인딩 주소(0.0.0.0 vs 127.0.0.1), 배너 |
2-1. 포트 번호의 범위와 세 구역
포트 번호는 0부터 65535까지, 총 65,536개입니다(16비트라서). 이 번호들은 크게 세 구역으로 나뉩니다.
- 0~1023 (well-known): 세계 공인 부서들의 번호. 웹, 메일, SSH 같은 유명 서비스들이 약속대로 사는 칸입니다.
- 1024~49151 (registered): 등록된 프로그램들이 쓰는 번호. 데이터베이스(3306, 5432) 같은 것들입니다.
- 49152~65535 (dynamic): 임시 번호. 내 컴퓨터가 바깥에 연결을 걸 때 잠깐 빌려 쓰는 번호들입니다.
2-2. 외워야 할 15개
보안 실무자들이 숫자만 봐도 서비스를 알아보는 단골 번호들입니다. 오늘 이 표를 통째로 외웁니다.
| 포트 | 서비스 | 한 줄 설명 |
|---|---|---|
| 21 | FTP | 파일 전송(구형, 암호화 없음) |
| 22 | SSH | 암호화 원격 접속 (Step 29) |
| 23 | Telnet | 원격 접속(평문 — 요즘은 금지에 가까움) |
| 25 | SMTP | 메일 보내기 |
| 53 | DNS | 이름 조회 (Step 33) |
| 80 | HTTP | 암호화 없는 웹 |
| 110 | POP3 | 메일 가져오기(구형) |
| 143 | IMAP | 메일 읽기(서버에 두고) |
| 443 | HTTPS | 암호화된 웹 |
| 445 | SMB | 윈도우 파일 공유 |
| 3306 | MySQL | 데이터베이스 |
| 3389 | RDP | 윈도우 원격 데스크톱 |
| 5432 | PostgreSQL | 데이터베이스 |
| 6379 | Redis | 인메모리 DB |
| 8080 | HTTP 대체 | 웹 서비스의 보조 문 |
외우는 요령: 덩어리로 묶으세요. "원격 접속 22(23은 위험한 구형)", "웹은 80과 443", "메일은 25, 110, 143", "데이터베이스는 3306, 5432, 6379". 묶음으로 외우면 금방입니다.
2-3. LISTENING과 ESTABLISHED — 문의 두 상태
열린 문에도 상태가 있습니다.
- LISTENING: "손님 기다리는 중." 서비스가 포트를 열어 두고 접속을 기다리는 상태입니다. 스캔에서 "열림(open)"은 이것을 봤다는 뜻입니다.
- ESTABLISHED: "지금 통화 중." 실제로 연결이 맺어져 데이터가 오가는 상태입니다.
점검의 첫 질문은 "무엇이 손님을 기다리는가"입니다. 그래서 오늘은 LISTENING에 집중합니다.
2-4. 0.0.0.0과 127.0.0.1 — 누구에게 열었는가
같은 "열림"이라도 어느 주소에 열렸는가가 하늘과 땅 차이입니다.
0.0.0.0:445— "이 컴퓨터의 모든 주소로 오는 445번 접속을 받겠다." 동네 너머에서도 두드릴 수 있습니다.127.0.0.1:5000— "나 자신(루프백)으로 오는 접속만 받겠다." 외부에서는 두드릴 방법이 없습니다.
"포트가 열리 있다"와 "외부에 노출되어 있다"는 다른 문장입니다. 이 구분이 방화벽과 보안 설정의 출발점입니다.
2-5. 배너 — 문을 두드리면 들리는 목소리
일부 서비스는 접속하는 순간 인사말을 냅니다. 이것을 배너(banner)라고 합니다. SSH 서버에 접속하면 SSH-2.0-OpenSSH_… 같은 문구를 먼저 보냅니다. 친절한 인사지만, 동시에 "무슨 프로그램의 어떤 버전인지"를 알려 주는 광고판입니다.
공격자에게 배너는 "목표의 버전 정보 = 알려진 취약점 목록"이고, 방어자에게는 "내가 스스로 광고하고 있는 정보"입니다. 3-5절에서 실제로 들어 봅니다.
3. 따라 하기
3-1. 내 컴퓨터의 열린 문 보기 — netstat
netstat -an | findstr LISTENING
TCP 0.0.0.0:22 0.0.0.0:0 LISTENING
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP 0.0.0.0:5040 0.0.0.0:0 LISTENING
TCP 0.0.0.0:5357 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49664 0.0.0.0:0 LISTENING
TCP 0.0.0.0:49665 0.0.0.0:0 LISTENING
TCP 127.0.0.1:10086 0.0.0.0:0 LISTENING
TCP 127.0.0.1:54525 0.0.0.0:0 LISTENING
TCP 172.30.1.54:139 0.0.0.0:0 LISTENING
(2026-09-09 실측. 실제 출력은 이것보다 훨씬 길며, 여러분의 목록은 다릅니다.)
출력 읽는 법: 한 줄이 하나의 "열린 문"입니다. 앞의 주소:포트가 "어디서 기다리는가"이고, LISTENING은 "손님 기다리는 중"입니다.
실측 목록 읽기 연습:
0.0.0.0:22— SSH 서버가 모든 주소에서 기다리고 있습니다. 이 컴퓨터에는 윈도우용 OpenSSH 서버가 켜져 있었습니다.0.0.0.0:445— 윈도우 파일 공유(SMB). 표에서 외운 번호가 보이죠.0.0.0.0:49664~— 49152 이상의 큰 번호들. 윈도우 시스템 서비스들이 쓰는 동적 구역입니다.127.0.0.1:…— 나 자신에게만 열린 문들. 외부에서는 못 두드립니다.
여러분의 목록에서도 445가 보일 겁니다. 모르는 번호가 있으면 검색해 보세요 — "무슨 포트인지 물어보는 것"이 점검의 시작입니다.
3-2. 문지기의 정체 찾기 — 포트 → PID → 프로그램
열린 포트의 주인이 누구인지 찾아 봅시다. -o 옵션을 붙이면 PID(프로세스 번호, Step 13의 그 번호)가 나옵니다.
netstat -ano | findstr LISTENING | findstr :445
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
(2026-09-09 실측.)
맨 뒤 숫자 4가 PID입니다. 이제 그 번호의 주인을 묻습니다:
tasklist /FI "PID eq 4"
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
System 4 Services 0 128 K
(2026-09-09 실측.)
읽는 법: 파일 공유(445)는 PID 4, 즉 윈도우의 System 프로세스 — 운영체제 심장이 직접 담당하고 있었습니다. 같은 방법으로 135번을 보면 PID가 svchost.exe(1924번)로 나옵니다(2026-09-09 실측) — 윈도우 서비스들의 숙주 프로세스입니다.
포트 → PID → 프로그램 — 이 삼단 연결이 "모르는 포트" 조사의 정석 절차입니다. 스캔이 "무엇이 열렸나"를 알려 준다면, 이 절차는 "누가 열었나"를 알려 줍니다.
3-3. 문 두드려 보기 — Test-NetConnection
이번엔 문이 정말 대답하는지 두드려 봅니다. 대상은 내 게이트웨이입니다.
Test-NetConnection 172.30.1.254 -Port 80
ComputerName : 172.30.1.254
RemoteAddress : 172.30.1.254
RemotePort : 80
InterfaceAlias : 이더넷
SourceAddress : 172.30.1.54
TcpTestSucceeded : True
(2026-09-09 실측. 주소는 여러분의 게이트웨이로 바꾸세요.)
출력 읽는 법: TcpTestSucceeded : True — "80번 문을 두드렸더니 대답이 왔다." 공유기에 웹 관리 화면(80번)이 열려 있었다는 뜻입니다. SourceAddress로 내 어느 주소에서 나갔는지도 보입니다.
3-4. 닫힌 문의 침묵 확인
이번엔 없는 호수를 두드려 봅니다. 내 컴퓨터의 65000번 — 그런 서비스를 연 적이 없는 번호입니다.
Test-NetConnection 127.0.0.1 -Port 65000
경고: TCP connect to (127.0.0.1 : 65000) failed
ComputerName : 127.0.0.1
RemoteAddress : 127.0.0.1
RemotePort : 65000
PingSucceeded : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded : False
(2026-09-09 실측.)
출력 읽는 법: PingSucceeded : True(건물은 있는데) + TcpTestSucceeded : False(그 호수는 없다). "건물까지는 갔는데 그 호수는 닫혀 있다"가 두 줄로 분리되어 보입니다. 닫힌 문의 침묵도 정보입니다 — 상대가 살아 있는지와 서비스가 있는지를 따로 알 수 있으니까요.
3-5. 배너 들어 보기
3-1에서 이 컴퓨터에 SSH 서버(22번)가 열려 있는 것을 봤습니다. 문을 두드리면 뭐라고 인사하는지 들어 봅시다. 파워쉘 한 줄짜리 연결 도구로 접속해 서버가 먼저 보내는 한 줄을 읽습니다:
$c = New-Object System.Net.Sockets.TcpClient("127.0.0.1", 22)
$r = New-Object System.IO.StreamReader($c.GetStream())
$r.ReadLine() # 서버가 먼저 보내는 한 줄
$c.Close()
SSH-2.0-OpenSSH_for_Windows_9.5
(2026-09-09 실측.)
읽는 법: 이 한 줄이 배너입니다. 서버가 스스로 "나는 윈도우용 OpenSSH 9.5야"라고 말하고 있습니다. 접속만 해도, 암호도 묻기 전에, 버전을 알려 주는 셈입니다.
왜: 이 한 줄이 공격자에게는 "목표 버전"입니다. 버전을 알면 그 버전의 알려진 약점 목록을 펼칠 수 있습니다. 방어자가 버전을 감추는 설정을 하거나, 꼭 필요한 서비스만 여는 이유입니다.
3-6. "열림"과 "서비스"의 관계 정리
"포트를 닫는다"는 것은 실제로 무엇을 하는 걸까요? 문 자체에 자물쇠를 거는 게 아닙니다. 그 호수에서 손님을 기다리던 서비스(프로그램)를 멈추는 것입니다. 서비스가 서면 문이 열리고, 멈추면 문이 닫힙니다 — 몸과 그림자의 관계입니다.
그래서 "모르는 포트가 열리 있다"를 발견했을 때의 행동 순서는 이렇습니다. ① 3-2절의 삼단 연결로 주인 프로그램을 찾고, ② 필요 없으면 그 서비스를 멈추고, ③ 부팅 때 자동으로 켜지지 않게 비활성화합니다. 문을 닫는 것이 아니라, 문지기를 해고하는 것이 정확한 표현입니다.
4. 미션과 연습문제
미션 — 내 컴퓨터 노출면 검수표 만들기
netstat -an | findstr LISTENING을 실행해my-open-ports.txt에 붙여 넣으세요- 그중
0.0.0.0에 열린 포트만 골라, 각각이 "무슨 서비스인지" 주석을 다세요 (모르는 번호는 검색) - 그중 하나를 골라 포트 → PID → 프로그램 삼단 연결로 주인을 찾아 기록하세요
127.0.0.1에만 열린 포트가 몇 개인지 세어 적으세요- 마지막 줄에 "이 중 외부에 열릴 이유가 없는 포트는 ___번"이라고 스스로 답해 보세요
연습문제
문제 1. "대상 서버에 22, 80, 443, 3306이 열려 있다"는 스캔 결과를 보고, 이 서버의 역할을 추측하는 세 문장을 써 보세요.
문제 2. 서버에서 보면 3306이 LISTENING인데 다른 PC에서는 접속이 안 됩니다. 원인 후보 두 가지와, 각각을 확인하는 방법을 말하세요.
문제 3. netstat -ano 출력의 맨 뒤 숫자는 무엇이며, 그 숫자로 다음에 무엇을 할 수 있나요?
문제 4. 개발자가 시험용 웹 서버를 80번이 아니라 8080번에 여는 이유를 두 가지 말하세요. (힌트: 0~1023번의 규칙, 한 컴퓨터에 웹 서비스가 둘일 때)
5. 모범 답안과 완료 기준
미션 모범 답안
실측 컴퓨터의 검수표 예 (2026-09-09, 발췌):
[0.0.0.0에 열린 포트와 정체]
22 → SSH (sshd.exe, PID 6416 확인 — 내가 켠 원격 접속 서버)
135 → 윈도우 RPC (svchost.exe, PID 1924 — 시스템 기본)
445 → 파일 공유 SMB (System, PID 4 — 시스템 기본)
5040 → 윈도우 기본 서비스 (CDPSvc 계열)
5357 → 윈도우 네트워크 검색(WSD)
49664~49670 → 윈도우 시스템 서비스들 (동적 구역)
[127.0.0.1에만 열린 포트] 14개 — 외부에서 못 두드리므로 노출 아님
[자기 답변 예]
"이 중 외부에 열릴 이유가 없는 포트는: 파일 공유를 쓰지 않는다면 445번.
확인 결과 나는 SSH(22)를 쓰고 있으므로 유지, 445는 사용 여부를 확인 예정."
검증하는 법: ① 0.0.0.0 목록의 번호마다 정체가 적혀 있는가. ② 삼단 연결의 세 값(포트, PID, 프로그램 이름)이 한 세트로 기록됐는가. ③ 마지막 줄의 자기 답변이 있는가 — 정답이 있는 게 아니라, 근거 있는 판단이 있으면 됩니다.
연습문제 해답
문제 1 해답. 예시: "웹 서버(80/443)이면서 관리자가 SSH(22)로 접속해 관리하는 서버로 보인다. 뒤에 MySQL 데이터베이스(3306)가 붙어 있으니 전형적인 웹 애플리케이션 서버다. 단, 3306이 외부에 열려 있는 것은 위험 신호다 — 데이터베이스는 보통 같은 건물 안에서만 쓴다." 번호가 말해 주는 그림이 바로 이런 것입니다.
문제 2 해답. 후보 ① 127.0.0.1에만 열린 경우 — 서버에서 LISTENING 줄의 주소 부분을 확인합니다(0.0.0.0이 아니라 127.0.0.1이면 외부 접속 불가가 정상). 후보 ② 방화벽이 막는 경우 — 다른 PC에서 Test-NetConnection 서버주소 -Port 3306을 치고, 서버 쪽 방화벽 규칙을 확인합니다. "열림"과 "닿음"은 두 단계입니다.
문제 3 해답. PID(프로세스 번호)입니다. tasklist /FI "PID eq 번호"로 그 번호의 프로그램 이름을 찾을 수 있습니다. 이것이 "모르는 포트의 주인 찾기" 절차입니다.
문제 4 해답. ① 0~1023번은 관리자 권한이 필요한 귀한 번호라, 권한 없이 시험하려면 1024 이상을 씁니다. ② 한 컴퓨터에 웹 서비스가 둘 이상이면 같은 호수를 같이 못 쓰니 번호를 나눕니다. "약속된 번호는 기본값이지 법이 아니다" — 서비스는 이사할 수 있고, 그래서 스캔은 유명 번호만 보고 끝나지 않습니다.
완료 기준 체크리스트
- [ ] IP와 포트의 관계(건물과 호수)를 설명할 수 있다
- [ ] 주요 포트 15개를 번호와 함께 말할 수 있다
- [ ]
netstat -an | findstr LISTENING으로 기다리는 문만 추릴 수 있다 - [ ] 0.0.0.0과 127.0.0.1의 차이를 설명할 수 있다
- [ ] 포트 → PID → 프로그램 삼단 연결을 직접 해 봤다
- [ ] 배너가 무엇이고 왜 보안 정보인지 설명할 수 있다
- [ ] 미션:
my-open-ports.txt검수표를 완성했다
6. 흔한 실수와 해결
벽 1. "netstat 결과가 너무 많아서 뭘 봐야 할지 모르겠어요."
증상: 수십 줄이 쏟아져 읽기를 포기하게 됩니다 (실측 컴퓨터에서도 60줄 넘게 나왔습니다).
원인: LISTENING 말고 ESTABLISHED, TIME_WAIT 등 모든 상태가 섞여 있기 때문입니다.
해결: 오늘은 findstr LISTENING으로 "기다리는 문"만 추리세요. 점검의 첫 질문은 "무엇이 손님을 기다리는가" 하나면 충분합니다.
벽 2. "Test-NetConnection에 이상한 경고가 떠요."
증상: 닫힌 포트를 두드리면 이런 줄이 뜹니다 (2026-09-09 실측):
경고: TCP connect to (127.0.0.1 : 65000) failed
원인: 오류가 아니라 결과 보고입니다. "연결해 봤는데 실패했다"는 뜻이고, 그래서 결과표의 TcpTestSucceeded가 False입니다.
해결: 경고와 표를 같이 읽으세요. PingSucceeded : True + TcpTestSucceeded : False = "건물은 있는데 그 호수는 닫힘." False도 소중한 정보입니다.
벽 3. "49152 이상의 포트가 잔뜩 열려 있어요. 해킹당한 건가요?"
증상: 49664 같은 큰 번호들이 LISTENING으로 여러 개 보입니다.
원인: 대부분 정상입니다. 윈도우 시스템 서비스들이 쓰는 동적(dynamic) 구역의 번호들입니다 (실측 컴퓨터에도 49664~49670이 있었고, 주인은 전부 윈도우 자체 서비스였습니다).
해결: 침착하게 주인을 확인하세요 — 삼단 연결(3-2절)로 PID를 찾으면 System이나 svchost.exe가 나오면 정상 범주입니다. 의심의 기준은 "번호가 크다"가 아니라 "주인을 설명할 수 없다"입니다.
벽 4. "포트가 열려 있다는데 접속이 안 돼요."
증상: 서버에서 보면 LISTENING인데, 다른 PC에서 접속하면 실패합니다.
원인: 127.0.0.1에만 열린 경우이거나, 방화벽이 막고 있거나.
해결: 열린 주소를 먼저 확인하세요(0.0.0.0이냐 127.0.0.1이냐). 그다음 방화벽. "열림"과 "닿음"은 두 단계입니다.
벽 5. "8080인데 왜 80이 아니에요? 뭐가 다른 거죠?"
증상: 웹 서비스가 80이 아닌 8080에서 도는 경우를 만납니다.
원인: 0~1023번은 관리자 권한이 필요한 귀한 번호라, 개발·시험용 웹 서버는 흔히 8080에 엽니다. 또 한 컴퓨터에 웹 서비스가 둘 이상이면 번호를 나눠야 합니다.
해결: 주소 뒤에 :8080을 붙여 접속하는 것이 정상입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 포트 | 한 컴퓨터 안의 호수 (0~65535) |
| well-known 포트 | 0~1023 — 세계 공인 서비스들의 약속 번호 |
| LISTENING | 손님을 기다리는 열린 문 |
| ESTABLISHED | 통화 중인 연결 |
| 0.0.0.0 vs 127.0.0.1 | 모두에게 열림 vs 나에게만 열림 |
| 배너 | 서비스가 접속 즉시 밝히는 버전 인사말 |
| 삼단 연결 | 포트 → PID → 프로그램, 포트 주인 찾기 절차 |
오늘의 명령어
| 명령 | 하는 일 |
|---|---|
netstat -an | findstr LISTENING |
기다리는 문 목록 |
netstat -ano | findstr LISTENING |
PID까지 포함한 목록 |
tasklist /FI "PID eq 번호" |
PID로 프로그램 이름 찾기 |
Test-NetConnection 주소 -Port 번호 |
문 두드려 보기 (내 장비 한정) |
명령어보다 중요한 감각
열린 포트는 "쓸 수 있는 기능"이기도 하지만, 동시에 "공격자에게 보이는 메뉴판"입니다. 공격자는 그 메뉴판을 보고 어디서부터 공략할지 고릅니다. 메뉴가 적을수록 공격자의 선택지도 적습니다 — 쓰지 않는 문은 닫는다가 서버 관리의 첫 원칙인 이유입니다.
그리고 이 지도는 한 번 그리는 것으로 끝나지 않습니다. 프로그램을 설치하면 문이 열리고, 때로는 설치한 기억이 없는데 문이 열려 있습니다. 오늘의 netstat을 습관의 첫 페이지로 삼으세요. "지금 내 컴퓨터에 열린 문들을 보는 눈" — 그것이 어제의 여러분과 오늘의 여러분을 가르는 선입니다.
전부 체크되면 Step 34 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.