공부 기록/네트워크 보안

[네트워크 보안] IP 주소

도도히히 2025. 11. 10. 16:23

개요

주소 공간

  • 인터넷에 연결된 각 장치 식별자: IP 주소
  • IPv4 주소: 32비트 길이
  • 주소 공간: 2^32 또는 약 43억
  • 인터넷에서 유일한 식별자
  • 인터넷상에 두 개의 장치가 같은 주소를 가질 수 X
  • 2진 표기법, 16진 표기법, 점-10진 표기법

표기법

2진 표기법 → 점-10진 표기법

ex) 10000001 00001011 00001011 11101111 → 129.11.11.239

점-10진 표기법 → 2진 표기법

ex) 111.56.45.78 → 01101111 00111000 00101101 01001110

2진 표기법 → 16진 표기법

ex) 10000001 00001011 00001011 11101111 → 0x(또는 0X)810B0BEF (또는 맨끝에 아래첨자 16 붙이기)

 

주소의 범위

  • 처음 주소와 마지막 주소가 주어지면, 범위 내 주소 개수를 찾는 것이 필요
  • 처음 주소, 마지막 주소, 범위 내 주소 개수(해당되는 주소에 몇 개의 식별자가 있는지)를 구할 수 있어야 함

예제

범위 내의 주소의 개수는?

처음 주소: 146.102.29.0, 마지막 주소: 146.102.32.255

마지막 주소에서 시작 주소를 빼고 결과에 1을 더하면 됨

0.0.3.255, 3 * 256 + 255 * 1 + 1 = 1024

 

클래스 기반 주소 지정

 

클래스

  • 5개(A, B, C, D, E)의 클래스로 구분
  • A가 전체의 50%, B가 전체의 25%, C가 전체의 12.5%, D와 E가 각각 전체의 6.25% 차지

클래스 구분 방법: 무엇으로 시작하는지에 따라 구분

클래스 구분 2진 표현 10진 표현

A 0……. 0-127
B 10…… 128-191
C 110….. 192-223
D 1110…. 224-239
E 1111…. 240-255

 

예제

주소의 클래스 나타내기

ex) 10100111 11011011 10001011 01101111 의 클래스는?

10으로 시작하므로 클래스 B 주소에 해당됨

ex) 227.12.14.87 의 클래스는?

227로 시작하므로 클래스 D 주소에 해당됨

 

클래스에 따라 netid와 hostid 길이가 다름

 

클래스 A의 블록

netid 길이: 1바이트

가장 왼쪽 비트 0

7비트로 나타내는 블록의 수: 2^7=128

블록에 속한 주소 수: 2^24개 (=3바이트)

2^24개의 호스트를 네트워크 내에서 표현할 수 O

클래스 A 주소는 거의 소진됨

 

클래스 B의 블록

netid 길이: 2바이트

처음 두 비트 10

14비트로 나타내는 블록의 수: 2^14 = 16,384

각 블록에 속한 주소 수: 2^16 개 (=2바이트)

2^16개의 호스트를 네트워크 내에서 표현할 수 O

클래스 B 주소도 거의 소진됨

 

클래스 C의 블록

netid 길이: 3바이트

처음 세 비트 110

21비트로 나타내는 블록의 수: 2^21

각 블록에 속한 주소 수: 2^8 = 256개

C 클래스 블록이 충분할 만큼 작은 기관이 많지 X

 

클래스 D에 있는 단일 블록

한 블록만 있으며 멀티캐스팅을 위해 설계

인터넷상에 호스트들의 그룹 지정하는 데 사용

 

클래스 E에 있는 단일 블록

한 블록만 있으며 향후 사용을 위해 예약 (예비용)

 

네트워크 내의 모든 주소는 한 블록에 속함

각 주소는 netid와 hostid를 포함

netid: 네트워크 정의

hostid: 네트워크에 연결된 특정 호스트 정의

 

netid의 길이를 n이라고 할 때, hostid의 길이는 32-n

전체 주소의 수 N=2^(32-n)

 

추출 가능한 정보의 종류

  • 주소의 수
  • 첫 번째 주소 (네트워크를 식별하는 주소로 활용)
    • 왼쪽 n비트 유지, 오른쪽 32-n 비트 전부 0
  • 마지막 주소 (네트워크 내에서만 브로드캐스팅할 특수 목적으로 활용)
    • 왼쪽 n비트 유지, 오른쪽 32-n 비트 전부 1

 

예제

180.8.17.9가 속한 블록의 첫 번째 주소와 마지막 주소는?

답(풀이)

180으로 시작하므로 클래스 B에 해당

클래스 B의 netid 길이는 16이므로 n=16

블록의 주소의 수는 2^16 = 65,536

첫 번째 주소: 왼쪽 16비트는 유지하고 오른쪽 16비트는 전부 0

마지막 주소: 왼쪽 16비트는 유지하고 오른쪽 16비트는 전부 1

→ 첫 번째 주소: 180.8.0.0, 마지막 주소: 180.8.255.255

 

블록의 첫 번째 주소는 네트워크 주소(네트워크의 식별자)

목적지(가 속한 네트워크)로 패킷을 전송하는 데 사용

 

네트워크 마스크

목적지 주소를 이용하여 네트워크 주소를 찾아내는 데 사용, 디폴트 마스크라고도 함

클래스 A: 255.0.0.0, 클래스 B: 255.255.0.0, 클래스 C:255.255.255.0

목적지 주소와 디폴트 마스크를 비트 AND 연산 수행하여 나온 결과가 네트워크 주소임

 

예제

라우터가 목적지 주소 201.24.67.32 패킷을 받았을 때 라우터가 패킷의 네트워크 주소를 찾는 방법 보이기

답(풀이)

주소의 클래스는 C에 해당함(201로 시작) → 디폴트 마스크: 255.255.255.0

비트 AND 연산 결과: 201.24.67.0 (네트워크 주소)

 

서브넷팅

  • 블록을 작은 블록으로 나누는 개념으로 네트워크가 몇 개의 작은 서브네트워크(서브넷)로 나뉨
  • 각 서브넷은 자신의 서브넷 주소를 가짐

서브넷 필요한 이유: 보안 및 관리 효율을 높이기 위해

 

서브넷팅에 의한 ID 정보의 변화

netid 길이는 증가, hostid의 길이는 감소

subnetid의 길이 = netid의 길이 + log2_s (s는 2의 거듭제곱인 서브넷의 개수)

서브넷으로 나누는 만큼 subnetid의 길이는 netid보다 길어질 수밖에 없음

서브넷 마스크와 네트워크 마스크는 다름

 

ex) 클래스 B의 주소에서 서브넷팅 전후 차이

서브넷팅 전: 약 2^16개의 호스트를 가짐, netid 길이는 16

서브넷팅 후: 4개의 서브넷으로 나누어질 때 각 서브넷은 2^14개의 호스트를 가짐, subnetid 길이는 18

/16과 /18로 나타냄 (각각 netid 길이와 subnetid 길이)

subnetid의 길이가 18일 경우 서브넷 마스크 (18개의 1과 14개의 0): 255.255.192.0

클래스 B의 네트워크 마스크 255.255.0.0과 다름

 

슈퍼넷팅

서브넷팅의 반대 개념

  • 슈퍼넷 마스크는 디폴트 마스크보다 1의 개수가 적음
    • 서브넷 마스크는 디폴트 마스크보다 1의 개수가 많음
  • 여러 개의 C 클래스 결합

 

ex) 하나의 클래스 C 블록을 8개의 서브블록으로 나눌 때와 8개의 클래스 C 블록을 하나의 슈퍼블록으로 묶을 때 네트워크 마스크의 변화

서브넷 마스크: nsub = 24 + 3 = 27

디폴트 마스크: n = 24

슈퍼넷 마스크: nsuper = 24 - 3 = 21

 

클래스 기반이 아닌 주소 지정

 

기존 클래스 기반 주소 지정 방식의 한계

  • 실제로 주소 고갈 문제를 해결하지 못함
  • 인터넷의 성장에 따라 보다 큰 주소 공간을 확보하는 것이 필요
  • 장기적인 해결책: IPv6
  • 단기적인 해결책: 클래스 없는 주소지정 (같은 주소 공간을 사용하지만 주소 분배 방법을 변경)

 

각 기관은 가변길이 블록으로 2^1, 2^2, … , 2^32 개의 주소를 갖는 블록을 지정할 수 있음

  • 프리픽스 길이는 0에서 32까지
  • 프리픽스(prefix) = netid, 서픽스(suffix) = hostid

 

슬래시 표기법

프리픽스 길이를 주소에 포함하여 표현

  • 블록 정보를 알기 위해서는 블록 내의 주소와 프리픽스를 알아야 함

클래스 기반이 아닌 주소 지정에서 주소 정보만을 이용해 주소가 속한 블록을 알 수 X

 

블록 정보 추출

블록에 속하는 주소의 개수 구하는 방식은 클래스 기반 주소 지정에서의 방법과 동일

N = 2^(32-n) (n은 프리픽스의 길이)

첫 번째 주소: (블록에 속하는 임의의 주소) AND (네트워크 마스크)

마지막 주소: (블록에 속하는 임의의 주소) OR [NOT (네트워크 마스크)]

 

예제

167.199.170.82/27 가 속한 네트워크의 처음과 마지막 주소, 전체 주소의 수 구하기

답 (풀이)

/27과 같이 슬래시로 표기했다면 클래스 기반이 아닌 주소 지정 유형이라고 생각하면 됨

네트워크 마스크: 27개의 1과 5개의 0이므로, 255.255.255.224

네트워크에 있는 주소의 수(블록에 속하는 주소의 개수) = 2^5 = 32

첫 번째 주소: 167.199.170.64/27

마지막 주소: 167.199.170.95/27

 

블록 할당

국제 관리기구인 ICANN 담당

ISP에 할당

블록 할당 제약 조건(CIDR)

요구 주소 n은 2의 거듭제곱

블록에 속한 주소의 수로 프리픽스 길이를 알 수 있음

할당하는 블록에 속한 주소는 연속적이어야 함

 

예제

ISP가 1000개의 주소를 갖는 블록을 요청

답 (풀이)

1000은 2의 누승이 아니므로, 1024(=2^10)개의 주소가 할당

프리픽스 길이 n = 32 - 10 = 22

시작 주소는 18.14.12.0이 선택됨

→ 할당된 블록 18.14.12.0/22, 첫 번째 주소: 18.14.12.0/22, 마지막 주소: 18.14.15.255/22

 

클래스 기반 주소 지정 방법과의 관계

클래스 프리픽스 길이

A /8
B /16
C /24
D /4
E /4

 

ex) 73.0.0.0의 클래스 A 블록을 할당받은 기관은 클래스 없는 주소 지정에서 73.0.0.0/8 블록을 할당받은 것과 같음

 

서브넷팅

3단계의 서브넷팅

  • 하나의 블록을 할당 받은 기관은 블록을 여러 개의 서브 블록으로 나눈 후 각 서브 블록을 서브넷에 할당
  • 서브넷은 여러 개의 서브-서브넷으로 나누어질 수 있음
  • 서브-서브넷은 다시 서브-서브-서브넷으로 나누어질 수 있음

 

파라미터 정의

기관이 할당 받은 주소 개수 N, 각 서브넷에게 할당된 주소 개수 Nsub

프리픽스 길이 n, 각 서브넷의 프리픽스 길이 nsub

서브넷의 총 개수는 s

각 서브넷에 속하는 주소의 개수(Nsub)는 2의 거듭제곱이어야 함

s = N/Nsub

nsub = n + log2_(N/Nsub) (N/Nsub 가 2의 거듭제곱이어야 함)

각 서브넷에 속하는 시작 주소는 해당 서브넷에 속하는 주소의 개수로 나누어질 수 있어야 함

 

예제

블록 130.34.12.64/26을 할당 받은 경우 호스트 개수가 같은 4개의 서브넷 설계

답 (풀이)

전체 주소의 개수: 2^(32-26) = 2^6 = 64

첫 번째 주소: 130.34.12.64/26

마지막 주소: 130.34.12.127/26

서브넷 설계: 각 서브넷은 16개의 주소를 가짐

프리픽스 길이: n + log2(N/Ni) = 26 + log2(64/16) = 26 + 2 = 28

(서브넷 구분을 위한 비트가 netid에 포함되어 subnetid가 그만큼 길어짐)

 

CIDR 구조의 한 가지 장점: 주소 결합

ICANN은 ISP에게 다양한 크기의 주소 블록 할당

  • ISP는 할당된 블록을 여러 개의 서브-블록으로 나누어 각 서브-블록을 고객들에게 할당할 수 O
  • 여러 개의 작은 블록을 하나의 블록으로 결합하여 ISP에게 할당

 

예제

ISP가 190.100.0.0/16 (65,536개 주소)로 시작하는 주소 블록을 할당 받았다. ISP는 이 주소를 다음과 같이 세 그룹의 고객에게 분배하고자 한다:

첫 번째 그룹은 64개의 고객, 각각은 대략 256개의 주소 필요

두 번째 그룹은 128개의 고객, 각각 대략 128개의 주소 필요

세 번째 그룹은 128개의 고객, 각각 대략 64개의 주소 필요

서브 블록을 설계하고, 할당을 한 후에 이용 가능한 주소가 얼마나 남았는지 알아보기

답(풀이)

각 그룹에 주소의 서브블록 할당하기

그룹 1: 64 * 256 = 16,384 n1 = 16 + log2(65536/16384) = 18

그룹 2: 128 * 128 = 16,384 n2 = 16 + log2(65536/16384) = 18

그룹 3: 128 * 64 = 8,192 n3 = 16 + log2(65536/8192) = 19

이용 가능한 주소의 수: 65536 - (16384 + 16384 +8192) = 24576

각 그룹의 서브넷 구하기

그룹 1: n = 18, 서브넷 n1 = 18 + log2(16384/256) = 24

그룹 2: n = 18, 서브넷 n2 = 18 + log2(16384/128) = 25

그룹 3: n = 19, 서브넷 n3 = 19 + log2(8192/64) = 26

 

특수 주소

 

클래스 기반 주소 지정에서 일부 주소는 특수 목적 위해 예약 (클래스 기반이 아닌 주소 지정에서도 동일하게 특수 주소 있음)

 

특수 블록

  • 모두가 0인 주소
  • 모두가 1인 주소
  • 루프백 주소
  • 멀티캐스트 주소

블록 내의 특수 주소

  • 네트워크 주소 (첫 번째 주소)
  • 직접 브로드캐스트 주소 (마지막 주소)

모두가 0인 주소 예시

자신의 IPv4 주소를 모르는 호스트가 부트스트랩 시 사용

동적 IP 관리를 제공하는 동적 호스트 구성 프로토콜(DHCP)에서 IP 할당 받기 위해 사용

(즉, 동적으로 IP를 할당받기 위함)

필요할 때마다 동적으로 할당받아 자원 제공

0.0.0.0

 

제한된 브로드캐스트 주소 예시

255.255.255.255

모두가 1인 주소 (같은 네트워크 내에서만 브로드캐스팅)

네트워크에 있는 모든 호스트에게 메시지 전달 시 사용

  • 무분별한 데이터의 외부 유출을 막기 위해 라우터는 차단 (내부에서 쓰는 데이터이므로 외부로 내보내면 안 됨)

 

루프백 주소의 예시

127.0.0.0/8 블록은 루프백 주소로 사용됨

  • 컴퓨터에 설치된 소프트웨어를 시험하기 위해 사용
  • 하나의 PC에서 여러 디바이스가 있는 것처럼 실험할 때 (테스트 용도)

외부로 내보내지 않고 내부에서만 처리를 끝내는 목적으로 씀

 

사설 주소

사설 용도를 위해 할당 (네트워크마다 내부적으로 할당해서 쓸 수 있는 형태의 주소 체계)

전역 네트워크에서 인식되지 않음 (내부에서만 사용)

네트워크가 분리되어 있거나 NAT(network address translation) 사용하여 사설 네트워크를 인터넷에 연결하는데 사용

→ 모자란 주소체계로 인해 생기는 자원 고갈 문제 해결 용도로 사용

 

ex) 사설망 주소 (참고만 하기)

블록 주소의 수 블록 주소의 수

10.0.0.0/8 16,777,216 192.168.0.0/16 65,536
172.16.0.0/12 1,047,584 169.254.0.0/16 65,536

 

멀티캐스트 주소

224.0.0.0/4 블록

  • 각 개별 주소가 멀티캐스트 그룹을 지정함

멀티캐스트 통신을 위해 예약된 블록

각 사용자는 일반 목적의 주소와 멀티캐스트 주소를 동시에 가짐

같은 멀티캐스트 그룹에 속하는 멀티 유저들이 동일한 멀티캐스트 주소를 가짐 (여러 멀티캐스트 주소를 가질 수도 O)

 

블록에 속하는 특수 주소

블록 내의 일부 주소를 특수 주소로 사용하는 것은 권고사항(호스트에 할당 불가)

네트워크 주소

  • 블록에 속하는 첫 번째 주소

직접 브로드캐스트 주소

  • suffix가 모두 1로 설정된 블록의 마지막 주소
  • 라우터가 특정 네트워크에 있는 모든 호스트에 패킷 전송 시 사용

 

IPv6 주소

 

IPv4의 문제점

  • 주소의 고갈
  • 기술상의 한계
  • 계층적 주소 할당 부재

네트워크의 규모가 너무 커짐, 네트워크 활용 반경 넓어짐, 여러 문제 중 보안이 가장 큰 문제

 

IPv6 주소 체계

주소 길이: 16바이트(128비트)

  • 64비트의 네트워크 주소 부문과 64비트의 인터페이스 주소 부문으로 정의
  • CIDR 기반 표기법과 유사하게 임의 비트 길이의 프리픽스 사용 가능 → 네트워크 부문과 인터페이스 부문 길이가 고정된 것은 아님

 

IPv6 주소 표기법

점 10진 표기법

ex) 221.14.65.11.105.45.170.34.12.234.18.0.14.0.115.255

콜론 16진 표기법: 32개의 16진수

ex) FDEC:BA98:7654:3210:ADBF:BBFF:2922:FFFF

제로 압축: 0이 연속으로 오는 개수가 더 많은 쪽을 압축 (:: 로 나타내기) (생략형)

ex) FDEC:0:0:0:0:BBFF:0:FFFF → FDEC::BBFF:0:FFFF

혼합 표기법

  • 콜론 16진 표기법과 점 10진 표기법을 혼합하여 표기
  • FDEC:14AB:2311:BBFE:AAAA:BBBB:130.24.24.18
  • 가장 왼쪽이 모두 0인 주소의 압축 표현
  • ::130.24.24.18

CIDR 표기법

FDEC::BBFF:0:FFFF/60

 

IPv6 주소 공간 할당

전체 주소 공간을 8등분으로 나눠 사용

현재 1/8만 사용자 주소 공간으로 사용

IPv6 주소 공간: 2^128, (IPv4 주소의 2^96배)