📚 네트워크 · 패킷 분석 › 01. TCP/IP 구조 이해 — 08편
이전 글: 07. IP Address란 무엇인가 · 다음 글: 09. IPv6 기초 — 관제에서 놓치기 쉬운 두 번째 주소 체계

1. 개념

IPv4 주소는 32비트(4바이트) 길이의 숫자입니다. 사람이 읽기 쉽도록 8비트씩 네 덩어리로 나누고, 각 덩어리를 10진수로 바꿔 점(.)으로 이어 씁니다. 이 표기를 점 10진 표기(Dotted Decimal Notation), 각 덩어리를 옥텟(Octet) 이라고 부릅니다.

  • 옥텟 하나 = 8비트 → 0~255
  • 전체 주소 수 = 2^32 = 4,294,967,296개

2. 동작 원리

192.168.10.25를 2진수로 분해하면 다음과 같습니다.

 10진 표기      192   .   168   .    10   .    25
                 ↓         ↓         ↓         ↓
 2진수      11000000  10101000  00001010  00011001
                 ↓ (네 옥텟을 이어 붙임)
 32비트     11000000101010000000101000011001
                 ↓ (하나의 정수로 보면)
 10진 정수  3232238105  = 192×2^24 + 168×2^16 + 10×2^8 + 25

각 비트 위치의 값은 왼쪽부터 128, 64, 32, 16, 8, 4, 2, 1입니다. 예를 들어 168 = 128 + 32 + 8 이므로 10101000입니다.

32비트 중 앞쪽 몇 비트가 네트워크 부분, 나머지가 호스트 부분입니다. 그 경계는 주소 자체가 아니라 함께 설정된 서브넷 마스크(프리픽스 길이) 가 정합니다. 경계를 계산하는 방법은 12. Subnet Mask란 무엇인가와 13. Network Address와 Host Address에서 다룹니다.

패킷 안에서 IPv4 주소는 IP 헤더의 출발지 주소(12~15바이트 위치)와 목적지 주소(16~19바이트 위치) 필드에 각각 4바이트로 들어갑니다. 헤더 필드 전체는 115. IP 헤더 분석 — TTL·Flags·Fragment·Checksum 필드 읽는 법(03 영역)에서 다룹니다.


3. 주요 특징

① 과거에는 클래스(Class)로 네트워크 크기를 정했습니다. 첫 옥텟의 앞 비트로 클래스를 구분했으며, 1993년 CIDR 도입 이후 클래스 방식(Classful)은 주소 할당에 쓰이지 않습니다. 다만 용어와 멀티캐스트 대역 구분에는 여전히 흔적이 남아 있습니다.

클래스첫 비트첫 옥텟 범위기본 네트워크 부분용도
A00~1278비트대규모 네트워크
B10128~19116비트중규모 네트워크
C110192~22324비트소규모 네트워크
D1110224~239—멀티캐스트
E1111240~255—예약(실험용)

② 특수 용도 주소가 있습니다. (사설 대역은 10편, 전체 특수 대역 표는 14. IPv4 주소와 서브넷(CIDR) — 같은 네트워크인지 판단하는 법에서 다룸)

주소·대역의미
0.0.0.0"지정되지 않음" — DHCP 요청 전 출발지, 서버의 "모든 인터페이스에서 대기"
127.0.0.0/8루프백 — 자기 자신 (127.0.0.1)
169.254.0.0/16링크 로컬 — DHCP 실패 시 자동 설정(APIPA)
224.0.0.0/4멀티캐스트
255.255.255.255제한 브로드캐스트 — 같은 링크 전체

③ 표기 방식이 하나가 아닙니다. 많은 소프트웨어가 IPv4 주소를 32비트 정수로 처리하기 때문에, 점 10진 표기 외에도 같은 주소를 가리키는 형태가 존재합니다.


4. 예시

실습 예시 — Python 표준 라이브러리 ipaddress로 주소 구조 확인 (Rocky·Ubuntu 모두 python3 기본 제공)

python3 - <<'EOF'
import ipaddress
a = ipaddress.ip_address("192.168.10.25")
print(int(a))                     # 32비트 정수
print(format(int(a), "032b"))     # 2진수 32자리
print(a.is_private, a.is_loopback, a.is_multicast)
EOF
# 출력 예시(값은 환경마다 다름)
3232238105
11000000101010000000101000011001
True False False

같은 주소를 가리킬 수 있는 변형 표기 예시(이론적으로 확인할 수 있는 방법):

표기값비고
점 10진192.168.10.25표준 표기
10진 정수3232238105일부 브라우저·라이브러리가 해석
16진 정수0xC0A80A19일부 파서가 해석
옥텟별 16진0xC0.0xA8.0x0A.0x19일부 파서가 해석

어떤 표기를 받아들이는지는 소프트웨어마다 다릅니다. 특히 010처럼 앞에 0이 붙은 옥텟을 8진수(=8)로 해석하는 파서도 있어, 같은 문자열이 도구마다 다른 주소로 해석될 수 있습니다.


5. 보안 관점

  • 필터 우회 가능성: URL 필터나 입력 검증이 점 10진 표기만 검사하면, 정수·16진 표기로 쓴 주소를 놓칠 수 있습니다. 피싱 URL이나 내부 주소 접근(SSRF) 시도에서 이런 변형 표기가 관찰되는 경우가 있습니다.
  • 앞자리 0 처리 차이: 검증 로직과 실제 접속 로직이 옥텟을 다르게 해석하면, 검증은 통과했지만 다른 주소로 접속하는 불일치가 생길 수 있습니다.
  • 특수 주소 오용: 인터넷 경계에서 출발지가 127.0.0.0/8, 0.0.0.0/8, 사설 대역인 패킷은 정상적으로 들어올 수 없으므로 위조 트래픽의 신호가 됩니다(Bogon 필터링).

6. SOC 관점

  • 정규화 후 비교: 로그마다 IP 표기(앞자리 0 포함 여부, 정수 저장 등)가 다를 수 있으므로, IOC 목록과 대조하기 전에 점 10진 표기로 통일합니다.
  • URL 속 IP 확인: 프록시·웹 로그에서 호스트 부분이 도메인이 아닌 숫자(특히 정수·16진)인 요청은 우선 확인 대상입니다.
  • 특수 대역 식별: 169.254.x.x가 보이면 DHCP 실패를, 0.0.0.0 출발지는 DHCP 요청 과정을 먼저 떠올립니다.

관제자가 확인할 질문은 다음과 같습니다.

  • 이 IP 문자열을 표준 표기로 바꾸면 어떤 주소이며, 내부 대역인가?
  • 검색·매칭 도구가 이 표기를 올바르게 인식했는가?

⚠️ 오탐 주의: SIEM 필드가 IP 타입이 아닌 문자열로 저장되어 있으면 192.168.10.25와 192.168.010.025가 다른 값으로 취급되어 매칭이 누락될 수 있습니다. 반대로 정수 표기 요청이 모두 악성인 것도 아니므로 목적지와 맥락을 함께 봐야 합니다.


7. 핵심 정리

  • IPv4 주소는 32비트이며 8비트 옥텟 4개를 점 10진 표기로 씁니다(옥텟당 0~255).
  • 네트워크 부분과 호스트 부분의 경계는 서브넷 마스크가 정합니다.
  • 클래스 A~E 구분은 CIDR 이후 할당에 쓰이지 않지만 용어와 D(멀티캐스트) 대역에 흔적이 남아 있습니다.
  • 0.0.0.0, 127.0.0.0/8, 169.254.0.0/16, 255.255.255.255 등 특수 주소의 의미를 알아야 합니다.
  • 같은 주소의 변형 표기가 존재하므로 관제에서는 표기를 정규화한 뒤 비교합니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글