📚 네트워크 · 패킷 분석 › 01. TCP/IP 구조 이해 — 14편
이전 글: 13. Network Address와 Host Address · 다음 글: 15. Subnetting 기초
2편에서 컴퓨터는 목적지가 같은 네트워크면 목적지에게 직접, 다른 네트워크면 게이트웨이에게 프레임을 보낸다고 했습니다.
그 판단 기준이 바로 서브넷(Subnet)입니다.
보안관제에서 IP 주소와 서브넷은 매일 쓰는 기본 도구입니다.
10.10.20.0/24처럼 CIDR로 쓰인 방화벽 규칙과 SIEM 검색 조건을 읽고 써야 합니다.IP 주소 : 192.168.10.77
2진수 : 11000000.10101000.00001010.01001101
서브넷 마스크: 11111111.11111111.11111111.00000000 (= 255.255.255.0 = /24)
└──────── 네트워크 부분 ────────┘└ 호스트 ┘
/24 = 앞 24비트가 네트워크 부분.| CIDR | 서브넷 마스크 | 전체 주소 수 | 사용 가능한 호스트 | 주로 쓰는 곳 |
|---|---|---|---|---|
| /8 | 255.0.0.0 | 16,777,216 | 16,777,214 | 대형 사설망(10.0.0.0/8) |
| /16 | 255.255.0.0 | 65,536 | 65,534 | 캠퍼스·지사 전체 |
| /24 | 255.255.255.0 | 256 | 254 | 일반적인 사용자망·서버망 |
| /26 | 255.255.255.192 | 64 | 62 | 작은 부서·DMZ |
| /30 | 255.255.255.252 | 4 | 2 | 라우터 간 연결 |
| /32 | 255.255.255.255 | 1 | (단일 호스트) | 방화벽 규칙에서 특정 IP 하나 지정 |
사용 가능한 호스트 수가 2 적은 이유: 호스트 부분이 모두 0인 주소는 네트워크 주소, 모두 1인 주소는 브로드캐스트 주소로 예약되기 때문입니다. (/31, /32는 예외적으로 쓰입니다.)
| 대역 | 이름 | 관제에서의 의미 |
|---|---|---|
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/10 | CGNAT 공유 주소 | 통신사 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이므로 사설 대역으로 착각하지 않도록 주의하세요.
호스트는 내 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을 찾아 게이트웨이에게 전송
| 단계 | 계산 | 결과 |
|---|---|---|
| ① 마스크 | /26 → 마지막 옥텟 11000000 | 255.255.255.192 |
| ② 블록 크기 | 256 − 192 | 64 (0, 64, 128, 192 단위로 나뉨) |
| ③ 네트워크 주소 | 77이 속한 블록의 시작 | 192.168.10.64 |
| ④ 브로드캐스트 | 다음 블록 시작 − 1 | 192.168.10.127 |
| ⑤ 사용 가능 범위 | 네트워크+1 ~ 브로드캐스트−1 | 192.168.10.65 ~ .126 (62개) |
→ 같은 192.168.10.x라도 /26에서는 .20과 .77이 다른 네트워크입니다. 앞자리만 보고 같은 망이라고 판단하면 안 됩니다.
실습 환경: 본인 소유 Linux VM 1대 (Rocky Linux 또는 Ubuntu). ens33은 예시 인터페이스 이름입니다.
# 내 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같은 연결 경로가 보이는 화면
# 같은 네트워크 안의 IP : 결과에 via가 없음 → 직접 전송
ip route get <같은_대역의_IP>
# 외부 IP : 결과에 via <게이트웨이> 가 붙음 → 게이트웨이로 전송
ip route get 8.8.8.8
손으로 계산한 결과를 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 실행 결과
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 게이트웨이가 붙는가?172.32.x.x가 공인 IP로 나오는 것을 확인했는가?| 로그에서 본 상황 | 판단 |
|---|---|
| 외부(WAN) 인터페이스로 들어온 패킷의 출발지가 사설 IP·루프백 | 정상적으로 올 수 없는 주소 → 위조 또는 설정 오류 의심 |
| 내부 IP → 내부 IP, 평소 통신하지 않는 대역 간 | 내부 확산(Lateral Movement) 여부 확인 대상 |
내부 호스트가 169.254.x.x 사용 | DHCP 장애 또는 네트워크 연결 문제 |
| 같은 /24 안의 여러 IP에서 동시에 같은 공격 | 개별 IP 차단보다 대역 단위 판단 필요 |
| 한 출발지가 /24 대역의 IP를 순서대로 접근 | 네트워크 스윕(탐색) 가능성 → 05. 스캔 시리즈에서 다룸 |
인증 로그에서 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에 외부 접속 기록이 없으면 결과가 거의 없을 수 있습니다. 그 경우 결과가 없다는 것 자체를 기록하세요.
📷 [실습 화면 삽입] ①과 ② 결과 비교 화면
관제 환경에서는 대역마다 역할이 정해져 있습니다. 예를 들면 다음과 같습니다. (구성은 조직마다 다릅니다.)
10.10.10.0/24 서버망 → 외부로 먼저 연결을 시작하는 일이 드묾
10.10.20.0/24 사용자망 → 서버망 관리 포트(22, 3389) 접근은 확인 대상
10.10.30.0/26 DMZ → 외부 노출 서비스. 내부망으로의 연결은 확인 대상
→ "어느 대역에서 어느 대역으로"만 보고도 1차 우선순위를 정할 수 있습니다.
| 위치 | 예시 |
|---|---|
| 방화벽 규칙 | 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 시리즈에서 다룹니다.
192.168.1.10만 있으면 어느 지점·어느 망인지 추가 정보가 필요합니다.10/8, 172.16/12, 192.168/16)와 특수 대역은 로그를 읽는 즉시 판단할 수 있어야 한다.