09. IPv6 기초 — 관제에서 놓치기 쉬운 두 번째 주소 체계

changseop lee·6일 전

📚 네트워크 · 패킷 분석 › 01. TCP/IP 구조 이해 — 09편
이전 글: 08. IPv4 주소 구조 · 다음 글: 10. 공인 IP와 사설 IP
참고(리눅스 시스템 기초): ss와 ip 명령어 — ip 명령 기본 사용법

1. 왜 알아야 하는가

"우리 회사는 IPv6를 안 쓴다"는 말이 "우리 네트워크에 IPv6 트래픽이 없다"는 뜻은 아닙니다. 현대 Linux·Windows는 대부분 IPv6가 기본 활성화되어 있고, 설정하지 않아도 인터페이스마다 링크 로컬 주소(fe80::) 를 스스로 만들며, 같은 네트워크 안에서 IPv6로 이웃을 찾는 패킷을 주고받습니다.

관제에서 IPv6를 모르면 생기는 문제는 다음과 같습니다.

  • 방화벽 규칙을 IPv4에만 걸어 두고 IPv6 경로는 열려 있는 상태를 알아채지 못합니다.
  • 로그에 찍힌 ::ffff:192.0.2.10 같은 주소를 IPv4 주소와 같은 대상으로 연결하지 못합니다.
  • IPv6에는 ARP가 없어서, IPv4 기준 ARP 감시만으로는 같은 링크의 위장 시도를 볼 수 없습니다.

이 글은 IPv6를 운영 설계 수준이 아니라 "로그와 패킷에서 알아보고 해석할 수 있는 수준" 으로 정리합니다.


2. 핵심 개념

2-1. 주소 표기

IPv6 주소는 128비트이며, 16비트씩 8개 그룹을 16진수로 쓰고 콜론(:)으로 구분합니다.

2001:0db8:0000:0000:0000:0000:0000:0010
 ↓ 각 그룹 앞자리 0 생략
2001:db8:0:0:0:0:0:10
 ↓ 연속된 0 그룹을 :: 로 한 번만 축약
2001:db8::10
  • :: 축약은 주소 안에서 한 번만 쓸 수 있습니다. 두 번 쓰면 어디가 몇 그룹인지 알 수 없기 때문입니다.
  • 같은 주소를 여러 방식으로 쓸 수 있으므로, 로그를 검색·상관분석할 때는 표기를 정규화해야 합니다. 권장 텍스트 표기(소문자, 앞자리 0 생략, 가장 긴 0 구간을 ::로)는 RFC 5952에 정리되어 있습니다.
  • 서브넷은 IPv4처럼 CIDR로 씁니다. 일반적인 LAN 서브넷은 /64이며, 앞 64비트가 네트워크(prefix), 뒤 64비트가 인터페이스 식별자(Interface ID)입니다.
  • 이 글의 예시는 문서용 대역 2001:db8::/32 를 사용합니다.

2-2. 주소 유형

IPv6에는 브로드캐스트가 없습니다. 그 역할은 멀티캐스트가 대신합니다.

유형범위(prefix)설명관제 포인트
글로벌 유니캐스트2000::/3인터넷에서 라우팅되는 주소NAT 없이 외부와 직접 통신 가능
링크 로컬fe80::/10같은 링크에서만 유효, 모든 인터페이스에 자동 생성라우터를 넘지 않음, NDP·라우터 통신에 사용
고유 로컬(ULA)fc00::/7 (실사용은 fd00::/8)내부망용, IPv4 사설 주소와 비슷한 용도외부로 나가면 비정상
멀티캐스트ff00::/8그룹 전달ff02::1 모든 노드, ff02::2 모든 라우터
루프백::1IPv4의 127.0.0.1
미지정::주소가 아직 없음 / 모든 주소에서 대기ss 출력의 [::]:22
IPv4 매핑::ffff:0:0/96IPv6 소켓이 IPv4 연결을 받을 때 표현로그에 ::ffff:192.0.2.10 형태로 등장
문서용2001:db8::/32예시 전용실제 트래픽에 나오면 설정 오류

애니캐스트(anycast)는 별도 주소 대역이 아니라, 같은 유니캐스트 주소를 여러 노드에 부여해 가장 가까운 곳으로 전달되게 하는 방식입니다.

2-3. 헤더 — 고정 40바이트

필드크기IPv4 대응 / 차이
Version4비트값 6
Traffic Class8비트ToS/DSCP
Flow Label20비트IPv4에 없음
Payload Length16비트헤더 제외 길이 (IPv4 Total Length는 헤더 포함)
Next Header8비트Protocol (TCP=6, UDP=17, ICMPv6=58, 또는 확장 헤더)
Hop Limit8비트TTL과 같은 역할
Source / Destination각 128비트

IPv4 헤더에 있던 체크섬, 단편화 필드(ID·Flags·Offset)가 없습니다. 부가 기능은 확장 헤더로 Next Header를 따라 체인처럼 이어 붙입니다. 단편화는 출발지만 Fragment 확장 헤더로 수행하며, 중간 라우터는 쪼개지 않고 ICMPv6 Packet Too Big을 돌려보냅니다. IPv6 링크의 최소 MTU는 1280입니다.

2-4. NDP — ARP를 대신하는 ICMPv6

IPv6에는 ARP가 없습니다. NDP(Neighbor Discovery Protocol, RFC 4861) 가 ICMPv6 메시지로 같은 역할과 그 이상을 수행합니다.

ICMPv6 Type메시지역할IPv4 대응
133Router Solicitation (RS)"라우터 있나요?"없음 (DHCP 일부)
134Router Advertisement (RA)라우터 존재·prefix·기본 게이트웨이 알림DHCP 게이트웨이 옵션과 유사
135Neighbor Solicitation (NS)"이 IPv6 주소의 MAC은?" / 주소 중복 확인ARP Request
136Neighbor Advertisement (NA)"그 주소는 이 MAC입니다"ARP Reply
137Redirect더 나은 다음 홉 안내ICMP Redirect

NS는 브로드캐스트 대신 대상 주소 끝 24비트로 만든 Solicited-Node 멀티캐스트 주소(ff02::1:ffXX:XXXX) 로 보내 불필요한 수신을 줄입니다.

이 때문에 IPv6 환경에서 ICMPv6를 일괄 차단하면 이웃 찾기, 게이트웨이 설정, PMTU 확인이 모두 멈춥니다. IPv4에서 ICMP를 막는 습관을 그대로 옮기면 안 되는 이유입니다.

2-5. SLAAC — DHCP 없이 주소 받기

SLAAC(Stateless Address Autoconfiguration, RFC 4862) 은 호스트가 RA에 담긴 prefix로 스스로 주소를 만드는 방식입니다. DHCPv6와 함께 쓰거나 SLAAC만 쓸 수도 있습니다.

Interface ID를 만드는 방식은 MAC 기반(EUI-64), 네트워크별로 고정된 무작위 값, 주기적으로 바뀌는 임시(Temporary/Privacy) 주소 등 OS와 설정마다 다릅니다. 임시 주소를 쓰면 같은 PC의 발신 주소가 시간에 따라 바뀌므로, IP만으로 단말을 추적하기 어려워집니다.


3. 동작 원리

IPv6가 활성화된 인터페이스가 링크에 연결되면 다음 순서로 주소를 얻습니다.

ARP와 NDP 비교
그림 1. IPv6에서는 ARP 대신 ICMPv6 기반 NDP가 이웃·라우터를 찾습니다

[1] 링크 로컬 주소 생성    fe80:: + Interface ID
        ↓
[2] DAD (중복 주소 확인)   NS 전송: 출발지 ::, 목적지 Solicited-Node 멀티캐스트
        ↓                  → 응답(NA)이 없으면 주소 사용
[3] RS 전송              fe80::호스트 → ff02::2 (모든 라우터)
        ↓
[4] RA 수신              fe80::라우터 → ff02::1 (모든 노드)
        ↓                  내용: prefix 2001:db8:10::/64, 라우터 수명, M/O 플래그
[5] 글로벌 주소 생성      2001:db8:10:: + Interface ID  → 다시 DAD
        ↓
[6] 기본 게이트웨이 = RA를 보낸 라우터의 링크 로컬 주소
        ↓
[7] 통신 시 NS/NA 로 이웃 MAC 확인 → 이웃 캐시(ip -6 neigh) 저장

기본 게이트웨이가 글로벌 주소가 아니라 링크 로컬 주소(fe80::...) 로 잡히는 것이 IPv4와 다른 점입니다. 또한 RA의 M(Managed)/O(Other) 플래그는 DHCPv6로 주소나 기타 정보(DNS 등)를 받으라는 신호입니다.

보안 측면에서 [5]~[6]은 RA를 보낸 쪽을 게이트웨이로 믿는 구조입니다. 같은 링크의 누군가가 위조 RA를 보내면 트래픽 경로가 바뀔 수 있습니다. IPv4의 ARP 위장, 가짜 DHCP와 같은 계열의 위협이며, 스위치의 RA Guard 같은 기능으로 방어합니다.


4. 실제 명령어 / 실습

실습 환경: 본인 소유 Linux VM (Rocky Linux 또는 Ubuntu), 인터페이스 이름은 ens33 예시입니다. 가상화 네트워크에 IPv6 라우터가 없으면 링크 로컬 주소만 보이는 것이 정상입니다.

4-1. 도구 설치

# Rocky Linux
sudo dnf install -y tcpdump iproute iputils

# Ubuntu
sudo apt update && sudo apt install -y tcpdump iproute2 iputils-ping

4-2. 주소·경로·이웃 확인

ip -6 addr show dev ens33        # scope link / scope global 주소 확인
ip -6 route show                  # 'proto ra' 는 RA로 받은 경로
ip -6 neigh show dev ens33        # 이웃 캐시 (IPv4의 ip neigh / arp 역할)
ss -tln                           # [::]:22 처럼 IPv6로 대기 중인 서비스

4-3. 커널 설정 확인

sysctl net.ipv6.conf.ens33.disable_ipv6   # 0이면 IPv6 활성
sysctl net.ipv6.conf.ens33.accept_ra      # RA 수용 여부
sysctl net.ipv6.bindv6only                # 0이면 IPv6 소켓이 IPv4도 받음(::ffff: 표기의 원인)

4-4. NDP 패킷 관찰

# 터미널 1: ICMPv6만 캡처 (-e 로 MAC까지)
sudo tcpdump -i ens33 -nn -e icmp6

# 터미널 2: 같은 링크의 모든 노드에 ping (링크 로컬은 %인터페이스 지정 필요)
ping -6 -c 3 ff02::1%ens33

# 이웃 캐시를 비우고 다시 통신해 NS/NA 발생시키기 (본인 VM에서만)
sudo ip -6 neigh flush dev ens33
ping -6 -c 2 <응답한 이웃의 fe80 주소>%ens33

📷 [실습 화면 삽입] ip -6 addr show dev ens33 결과 — fe80 링크 로컬 주소의 scope link 표시와 (있다면) 글로벌 주소의 dynamic·mngtmpaddr 표시

4-5. 방화벽의 IPv6 적용 범위 확인

# Rocky (firewalld): nftables inet 테이블 기반이라 존 규칙이 IPv4·IPv6에 함께 적용
sudo firewall-cmd --list-all
sudo nft list ruleset | grep -i icmpv6

# Ubuntu (ufw): IPv6 규칙 적용 여부
grep IPV6 /etc/default/ufw          # IPV6=yes 인지 확인
sudo ufw status verbose             # (v6) 규칙이 함께 보이는지 확인

# iptables를 직접 쓰는 환경이라면 IPv6는 ip6tables 규칙이 별도
sudo ip6tables -L -n -v

5. 결과 확인

ip -6 addr 출력 형식 예시(값은 환경마다 다름):

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2001:db8:10::5a1c:3f2e:91b7:4d20/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 86380sec preferred_lft 14380sec
    inet6 fe80::20c:29ff:fe4a:1b2c/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

ip -6 route / ip -6 neigh 출력 형식 예시(값은 환경마다 다름):

default via fe80::1 dev ens33 proto ra metric 100 pref medium
fe80::1 dev ens33 lladdr 00:50:56:c0:00:08 router REACHABLE
확인 항목해석
scope link + fe80::자동 생성 링크 로컬 주소
scope global dynamicRA 기반 등 수명이 있는 글로벌 주소
valid_lft / preferred_lft주소 유효 수명 / 우선 사용 수명
default via fe80::1 ... proto raRA로 받은 기본 게이트웨이(링크 로컬)
lladdr ... router이웃 캐시에서 라우터로 표시된 항목
  • 인터페이스에 fe80 링크 로컬 주소가 자동으로 있는 것을 확인했다
  • ss -tln에서 IPv6로 대기 중인 서비스를 확인했다
  • tcpdump에서 NS(135)와 NA(136)를 한 쌍 이상 찾았다
  • 기본 게이트웨이가 링크 로컬 주소로 잡히는 이유를 설명할 수 있다
  • 사용 중인 방화벽이 IPv6에도 같은 정책을 적용하는지 확인했다

6. 패킷 / 로그 분석

6-1. 필터

도구필터의미
Wiresharkipv6IPv6 전체
Wiresharkicmpv6.type == 134RA
Wiresharkicmpv6.type == 135 or icmpv6.type == 136NS / NA
Wiresharkipv6.nxt == 44Fragment 확장 헤더
tcpdumpicmp6 and ip6[40] == 134RA (확장 헤더가 없을 때 기준)
tcpdump'ip proto 41 or udp port 3544'6in4 터널(프로토콜 41), Teredo(UDP 3544)

tcpdump의 ip6[40]은 고정 헤더 40바이트 바로 뒤, 즉 ICMPv6 Type 위치입니다. 확장 헤더가 끼어 있으면 위치가 달라지므로 Wireshark 필터가 더 정확합니다.

6-2. 정상일 수 있는 경우 vs 의심해야 하는 경우

관찰정상일 수 있는 경우의심해야 하는 경우
RA 수신등록된 라우터의 링크 로컬 주소에서 주기적 RA라우터가 아닌 단말 MAC에서 RA, 처음 보는 prefix 광고
NA 다수주소 설정·DAD 과정요청(NS) 없이 반복되는 NA, 한 주소에 대한 MAC 변경
IPv6 글로벌 주소 통신IPv6를 운영 중인 망IPv6 미운영 망인데 외부 IPv6 통신 발생
프로토콜 41 / UDP 3544명시적으로 허용한 터널허가되지 않은 IPv6 터널 → IPv4 정책 우회 경로 가능성
::ffff: 주소IPv6 소켓의 IPv4 연결 표현(자체는 정상) 상관분석 시 IPv4와 다른 대상으로 오인하는 것이 문제
# pcap에서 RA를 보낸 MAC·주소 목록 → 등록된 라우터와 대조
tshark -r capture.pcap -Y 'icmpv6.type == 134' -T fields -e eth.src -e ipv6.src | sort | uniq -c

📷 [실습 화면 삽입] Wireshark에서 RA 패킷 상세 — Prefix Information 옵션과 Source link-layer address 옵션


7. 보안관제 관점

흔적이 남는 곳

  • 방화벽·IPS: IPv6 정책이 따로 존재하는 장비가 많습니다. IPv4 정책만 점검하고 끝내면 안 됩니다.
  • 서버 로그: sshd, 웹 서버 로그에 IPv6 주소나 ::ffff: 매핑 주소가 남습니다. SIEM 파싱 규칙이 IPv4 형식만 가정하면 필드 추출에 실패하거나 GeoIP·위협 인텔리전스 매칭이 빠질 수 있습니다.
  • 스위치·라우터: NDP 캐시, RA Guard 위반 로그. IPv4의 ARP 테이블처럼 "어느 시점에 어느 MAC이 어느 IPv6 주소를 썼는가"를 확인하는 근거입니다.

관제 판단 포인트

  • IPv6를 운영하지 않는다면 "비활성"을 설정으로 확인하거나, 최소한 IPv6 트래픽이 발생하는지 모니터링해야 합니다. 둘 중 하나도 안 되어 있으면 사각지대입니다.
  • 임시 주소 때문에 IPv6 주소만으로 단말을 특정하기 어렵습니다. 같은 시각의 NDP 캐시(MAC)와 연결해야 합니다.
  • ICMPv6는 IPv4 ICMP처럼 일괄 차단하면 안 됩니다. NDP와 Packet Too Big은 동작에 필수이고, 필요한 유형만 허용하는 방식으로 설계합니다(세부 정책은 06. 방화벽 · IDS/IPS 분석 시리즈에서 다룸).
  • 위조 RA·NDP 위장은 원리만 이해하고, 탐지는 "등록된 라우터 목록과 RA 출발지 비교", "IP-MAC 매핑 변화 감시"로 접근합니다. 장비 기능은 04. 네트워크 장비 실습 시리즈에서 다룹니다.

한계와 오탐 주의

  • 가상화 환경, 컨테이너 네트워크, 일부 OS 기능이 스스로 RA나 멀티캐스트를 보낼 수 있습니다. 새로운 RA 출발지를 곧바로 공격으로 단정하지 말고 자산 정보와 대조합니다.
  • 같은 주소의 표기 차이(2001:db8::10 vs 2001:0db8:0:0::0010)로 검색 누락이 생길 수 있으니 정규화 여부를 먼저 확인합니다.

8. 핵심 정리

  • IPv6 주소는 128비트, 16진수 8그룹이며 :: 축약은 한 번만 쓸 수 있고, 로그 분석 전 표기 정규화가 필요합니다.
  • 브로드캐스트가 없고, 링크 로컬(fe80::/10)은 모든 인터페이스에 자동 생성되므로 "IPv6를 안 쓴다"고 트래픽이 없는 것은 아닙니다.
  • ARP 대신 ICMPv6 기반 NDP(RS·RA·NS·NA·Redirect)가 이웃과 라우터를 찾으므로, ICMPv6 일괄 차단은 통신 장애를 만듭니다.
  • SLAAC는 RA의 prefix로 호스트가 스스로 주소를 만들며, 임시 주소로 인해 IP만으로 단말을 특정하기 어렵습니다.
  • 관제에서는 방화벽의 IPv6 정책, ::ffff: 매핑 주소 정규화, RA 출발지·IP-MAC 매핑 변화, 허가되지 않은 터널을 확인합니다.

다음 글: 14. DNS 이름 해석 흐름 — 도메인이 IP가 되기까지

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

0개의 댓글