Step 34. 포트와 서비스 — 건물 안의 호수

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:22SSH 서버가 모든 주소에서 기다리고 있습니다. 이 컴퓨터에는 윈도우용 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. 미션과 연습문제

미션 — 내 컴퓨터 노출면 검수표 만들기

  1. netstat -an | findstr LISTENING을 실행해 my-open-ports.txt에 붙여 넣으세요
  2. 그중 0.0.0.0에 열린 포트만 골라, 각각이 "무슨 서비스인지" 주석을 다세요 (모르는 번호는 검색)
  3. 그중 하나를 골라 포트 → PID → 프로그램 삼단 연결로 주인을 찾아 기록하세요
  4. 127.0.0.1에만 열린 포트가 몇 개인지 세어 적으세요
  5. 마지막 줄에 "이 중 외부에 열릴 이유가 없는 포트는 ___번"이라고 스스로 답해 보세요

연습문제

문제 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 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.