14. IPv4 주소와 서브넷(CIDR) — 같은 네트워크인지 판단하는 법

changseop lee·6일 전

📚 네트워크 · 패킷 분석 › 01. TCP/IP 구조 이해 — 14편
이전 글: 13. Network Address와 Host Address · 다음 글: 15. Subnetting 기초

1. 왜 알아야 하는가

2편에서 컴퓨터는 목적지가 같은 네트워크면 목적지에게 직접, 다른 네트워크면 게이트웨이에게 프레임을 보낸다고 했습니다.
그 판단 기준이 바로 서브넷(Subnet)입니다.

보안관제에서 IP 주소와 서브넷은 매일 쓰는 기본 도구입니다.

  • 방화벽 로그의 출발지 IP가 내부인지 외부인지 즉시 구분해야 합니다.
  • 10.10.20.0/24처럼 CIDR로 쓰인 방화벽 규칙과 SIEM 검색 조건을 읽고 써야 합니다.
  • 알림 여러 건을 같은 대역(/24) 단위로 묶어 보면, 개별 IP로는 안 보이던 공격 규모가 보입니다.
  • 외부에서 들어온 패킷의 출발지가 사설 IP라면 위조(Spoofing)를 의심해야 합니다.

2. 핵심 개념

2-1. IPv4 주소 = 네트워크 부분 + 호스트 부분

IP 주소    : 192.168.10.77
2진수      : 11000000.10101000.00001010.01001101
서브넷 마스크: 11111111.11111111.11111111.00000000   (= 255.255.255.0 = /24)
             └──────── 네트워크 부분 ────────┘└ 호스트 ┘
  • IPv4 주소는 32비트이고, 8비트씩 4개(옥텟)로 나눠 적습니다.
  • 서브넷 마스크에서 1인 비트가 네트워크 부분, 0인 비트가 호스트 부분입니다.
  • CIDR 표기(/24)는 마스크의 앞쪽 1비트 개수입니다. /24 = 앞 24비트가 네트워크 부분.

2-2. 자주 쓰는 프리픽스

CIDR서브넷 마스크전체 주소 수사용 가능한 호스트주로 쓰는 곳
/8255.0.0.016,777,21616,777,214대형 사설망(10.0.0.0/8)
/16255.255.0.065,53665,534캠퍼스·지사 전체
/24255.255.255.0256254일반적인 사용자망·서버망
/26255.255.255.1926462작은 부서·DMZ
/30255.255.255.25242라우터 간 연결
/32255.255.255.2551(단일 호스트)방화벽 규칙에서 특정 IP 하나 지정

사용 가능한 호스트 수가 2 적은 이유: 호스트 부분이 모두 0인 주소는 네트워크 주소, 모두 1인 주소는 브로드캐스트 주소로 예약되기 때문입니다. (/31, /32는 예외적으로 쓰입니다.)

2-3. 관제에서 반드시 외워야 할 특수 대역

대역이름관제에서의 의미
10.0.0.0/8 · 172.16.0.0/12 · 192.168.0.0/16사설 IP (RFC 1918)내부망. 인터넷에서 직접 들어올 수 없음
127.0.0.0/8루프백자기 자신. 외부 인터페이스에서 보이면 비정상
169.254.0.0/16링크 로컬(APIPA)DHCP로 IP를 못 받은 상태의 흔적
100.64.0.0/10CGNAT 공유 주소통신사 NAT 구간
224.0.0.0/4멀티캐스트서비스 광고·라우팅 프로토콜 트래픽
255.255.255.255제한 브로드캐스트DHCP Discover 등
192.0.2.0/24 외 2개문서용 예시 주소실제 트래픽에 보이면 설정 오류·위조

172.16.0.0/12는 172.16.0.0 ~ 172.31.255.255입니다. 172.32.x.x는 공인 IP이므로 사설 대역으로 착각하지 않도록 주의하세요.


3. 동작 원리 — "같은 네트워크인가"를 판단하는 AND 연산

호스트는 내 IP와 목적지 IP에 각각 내 서브넷 마스크를 AND 연산해서 결과(네트워크 주소)가 같은지 비교합니다.

내 PC      : 192.168.10.20 / 24

[목적지 A]  192.168.10.77
  192.168.10.20 AND 255.255.255.0 = 192.168.10.0
  192.168.10.77 AND 255.255.255.0 = 192.168.10.0   → 같음
  → ARP로 192.168.10.77의 MAC을 직접 찾아 전송

[목적지 B]  8.8.8.8
  8.8.8.8       AND 255.255.255.0 = 8.8.8.0        → 다름
  → ARP로 게이트웨이 MAC을 찾아 게이트웨이에게 전송

3-1. 서브넷 직접 계산하기 (예: 192.168.10.77/26)

단계계산결과
① 마스크/26 → 마지막 옥텟 11000000255.255.255.192
② 블록 크기256 − 19264 (0, 64, 128, 192 단위로 나뉨)
③ 네트워크 주소77이 속한 블록의 시작192.168.10.64
④ 브로드캐스트다음 블록 시작 − 1192.168.10.127
⑤ 사용 가능 범위네트워크+1 ~ 브로드캐스트−1192.168.10.65 ~ .126 (62개)

→ 같은 192.168.10.x라도 /26에서는 .20과 .77이 다른 네트워크입니다. 앞자리만 보고 같은 망이라고 판단하면 안 됩니다.


4. 실제 명령어 / 실습

실습 환경: 본인 소유 Linux VM 1대 (Rocky Linux 또는 Ubuntu). ens33은 예시 인터페이스 이름입니다.

4-1. 내 IP와 프리픽스, 연결된 네트워크 확인

# 내 IP와 /프리픽스
ip -br addr show ens33

# 라우팅 테이블: proto kernel scope link 줄이 '내가 직접 연결된 네트워크'
ip route

📷 [실습 화면 삽입] ip -br addr과 ip route 결과 — 192.168.x.0/24 dev ens33 proto kernel scope link 같은 연결 경로가 보이는 화면

4-2. 커널의 판단을 직접 확인

# 같은 네트워크 안의 IP : 결과에 via가 없음 → 직접 전송
ip route get <같은_대역의_IP>

# 외부 IP : 결과에 via <게이트웨이> 가 붙음 → 게이트웨이로 전송
ip route get 8.8.8.8

4-3. 서브넷 계산 검증 (Python 표준 라이브러리)

손으로 계산한 결과를 ipaddress 모듈로 검증합니다. 별도 설치가 필요 없습니다.

python3 - <<'EOF'
import ipaddress

net = ipaddress.ip_network('192.168.10.77/26', strict=False)
print('네트워크   :', net.network_address)
print('브로드캐스트:', net.broadcast_address)
print('마스크     :', net.netmask)
print('주소 수    :', net.num_addresses)

for ip in ['192.168.10.20', '192.168.10.100', '172.20.1.5', '172.32.1.5', '169.254.3.3']:
    a = ipaddress.ip_address(ip)
    print(f'{ip:15} /26 포함={a in net!s:5} 사설={a.is_private!s:5} 링크로컬={a.is_link_local}')
EOF

📷 [실습 화면 삽입] Python 실행 결과


5. 결과 확인

192.168.10.77/26 기준으로 기대되는 결과는 다음과 같습니다. 3-1의 손 계산과 같은지 확인하세요.

항목기대 값
네트워크 주소192.168.10.64
브로드캐스트192.168.10.127
마스크255.255.255.192
주소 수64
192.168.10.20/26 포함 False (다른 네트워크)
192.168.10.100/26 포함 True
172.20.1.5 / 172.32.1.5사설 True / False (172.32는 공인)
169.254.3.3링크 로컬 True

확인 체크리스트

  • ip route get에서 같은 대역 IP는 via가 없고, 외부 IP는 via 게이트웨이가 붙는가?
  • /26 계산을 손으로 먼저 하고 Python 결과와 비교했는가?
  • 172.32.x.x가 공인 IP로 나오는 것을 확인했는가?

6. 패킷 / 로그 분석 — IP 대역으로 로그 읽기

6-1. 출발지 IP 분류표

로그에서 본 상황판단
외부(WAN) 인터페이스로 들어온 패킷의 출발지가 사설 IP·루프백정상적으로 올 수 없는 주소 → 위조 또는 설정 오류 의심
내부 IP → 내부 IP, 평소 통신하지 않는 대역 간내부 확산(Lateral Movement) 여부 확인 대상
내부 호스트가 169.254.x.x 사용DHCP 장애 또는 네트워크 연결 문제
같은 /24 안의 여러 IP에서 동시에 같은 공격개별 IP 차단보다 대역 단위 판단 필요
한 출발지가 /24 대역의 IP를 순서대로 접근네트워크 스윕(탐색) 가능성 → 05. 스캔 시리즈에서 다룸

6-2. 로그의 IP를 /24 단위로 묶어 보기

인증 로그에서 IP만 뽑아 개별 IP 순위와 /24 대역 순위를 비교합니다. (Rocky: /var/log/secure, Ubuntu: /var/log/auth.log)

LOG=/var/log/secure   # Ubuntu는 /var/log/auth.log

# ① 개별 IP 순위
sudo grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' "$LOG" | sort | uniq -c | sort -rn | head

# ② /24 대역 순위
sudo grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' "$LOG" \
  | awk -F. '{print $1"."$2"."$3".0/24"}' | sort | uniq -c | sort -rn | head

개별 IP로는 각각 몇 건뿐인데 대역으로 묶으면 상위에 올라오는 경우가 있습니다. 여러 IP를 돌려 쓰는 공격을 찾는 기본 방법입니다.
실습 VM에 외부 접속 기록이 없으면 결과가 거의 없을 수 있습니다. 그 경우 결과가 없다는 것 자체를 기록하세요.

📷 [실습 화면 삽입] ①과 ② 결과 비교 화면


7. 보안관제 관점

7-1. 대역 = 자산 정보

관제 환경에서는 대역마다 역할이 정해져 있습니다. 예를 들면 다음과 같습니다. (구성은 조직마다 다릅니다.)

10.10.10.0/24  서버망      → 외부로 먼저 연결을 시작하는 일이 드묾
10.10.20.0/24  사용자망    → 서버망 관리 포트(22, 3389) 접근은 확인 대상
10.10.30.0/26  DMZ         → 외부 노출 서비스. 내부망으로의 연결은 확인 대상

→ "어느 대역에서 어느 대역으로"만 보고도 1차 우선순위를 정할 수 있습니다.

7-2. CIDR를 쓰는 곳

위치예시
방화벽 규칙10.10.20.0/24 → 10.10.10.5/32 : tcp/22 허용
SIEM·ELK 검색출발지 IP 필드에 CIDR 조건 사용 (예: source.ip: "10.10.20.0/24")
IDS 룰 변수Suricata·Snort의 HOME_NET = 보호 대상 내부 대역

HOME_NET이 실제 내부 대역과 다르게 설정되면 "외부 → 내부" 룰이 제대로 동작하지 않습니다. 06. 방화벽 · IDS/IPS 시리즈에서 다룹니다.

7-3. 주의할 점

  • 사설 IP는 조직마다 중복됩니다. 알림에 192.168.1.10만 있으면 어느 지점·어느 망인지 추가 정보가 필요합니다.
  • DHCP 환경에서는 IP의 주인이 바뀝니다. "그 시각에 그 IP를 누가 썼는가"는 DHCP 로그와 시간을 함께 봐야 확정할 수 있습니다.
  • NAT를 거치면 IP가 바뀝니다. 방화벽 로그의 IP와 서버 로그의 IP가 다를 수 있습니다. (04. 네트워크 장비 실습에서 다룸)

8. 핵심 정리

  • IPv4 주소는 네트워크 부분 + 호스트 부분이고, 경계를 정하는 것이 서브넷 마스크(CIDR)다.
  • 호스트는 AND 연산 결과가 같으면 직접 전송, 다르면 게이트웨이로 전송한다.
  • 블록 크기(256 − 마스크 값)만 알면 네트워크·브로드캐스트·사용 가능 범위를 계산할 수 있다.
  • 사설 대역 3개(10/8, 172.16/12, 192.168/16)와 특수 대역은 로그를 읽는 즉시 판단할 수 있어야 한다.
  • 관제에서는 IP를 대역 단위로 묶어 보고, 대역 간 흐름으로 우선순위를 정한다.

다음 글: 04. 게이트웨이와 라우팅 기초 — 다른 네트워크로 패킷은 어떻게 가는가

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글