인터넷에 잘 정리된게 없어서 함 정리해 봄.
기기가 공인 IPv6 주소를 부여받는 방법은 3가지가 있음(간단->복잡 순):
- SLAAC (RFC 4862): 실제 mac 주소 혹은 랜덤 mac 주소(안드로이드, IOS)
- 임시 주소 확장 (RFC 8981): 완전 랜덤 64비트 정수, OS 재량 주기적으로(하루?) 재생성
- DHCPv6
주소를 할당하는 프로세스는 … (RFC 4861)
기기가 router solicitation 메시지 (ICMPv6 type 133) link-local 멀티케스트 (ff02::01) -> 라우터가 RA 메시지(ICMPv6 type 134)로 응답
기기가 받은 RA 메시지 내용이…
- prefix information 존재, A flag(autonomous config)가 참: 이 prefix로 각 기기가 알아서 나머지 64비트 가지고 각자 공인 주소 할당하라는 뜻 - SLAAC과 RFC 8981 사용
router lifetime > 0: 이 라우터를 통해 인터넷을 사용하라는 뜻 (“default route” 혹은 “gateway”)- RDNSS(Recursive DNS Server) 옵션 존재: 이 라우터로 인터넷 쓸 때 사용할 DNS 서버 주소
- M flag가 참: DHCPv6 서버가 돌아가고 있으니 DHCPv6을 통해서 주소를 받으라는 뜻
- O flag가 참: DHCPv6로 DNS와 NTP 정보 등도 받으라는 뜻
이걸 좀 해석해 보자면,
- A flag가 거짓이고 M flag도 거짓이면 뭔가 설정이 잘못된 것. router lifetime가 0이면 인터넷을 쓸 수는 없지만, 해당 라우터의 prefix는 라우팅 해줄 수 있다는 뜻임(이렇게 RA를 단순 무식한 RIP로 사용 가능). 이렇게 한 L2 링크에 여러 IPv6 라우터가 존재할 수 있음.
router lifetime > 0으로 홍보하는 라우터가 2개 이상 존재하면 일종의 로드밸런싱 가능. 이 상황을 위해 router preference 값이 사용되지만, 이를 실제로 구현하는 구현체는 거의 없음 - DHCPv6 서버가 있으면 주로 M과 O 플레그가 참임. M만 참이거나 O만 참인 경우 역시 뭔가 이상한거임. M O 플레그가 거짓이면 기기는 아에 DHCPv6 시도 조차 안 함
- 이 프로세스(router discovery)가 이루어지려면 각 노드가 link-local 주소를 가지고 있어야 하고, 그 주소는 fe80::/64 prefix로 SLAAC을 함
- 이 때문에 IPv4와는 다르게 default router 주소는 대부분 link-local 주소임. 공인 default router 주소도 유효하기는 하나, L3 터널 등으로만 존재
- 한 인터페이스에 총 4개의 주소가 존재할 수 있다는 뜻. 폰에서는 대충 종류 없이 보여주지만, 주소 모양으로 뭐가 뭔지 유추 가능
- link-local (fe80::/64) 주소
- Router prefix SLAAC 주소
- 임시 주소
- DHCP 주소
- 인터넷 접속은 2, 3, 4 중 하나만 있으면 됨
리눅스는 1, 2, 4를 할당할 것임. 윈도와 IOS는 1, 2, 3, 4 죄다 할당하고, 주로 3만이 사용됨. 안드로이드는 1, 2, 3만 할당되고, 3만 주로 사용됨.
안드로이드는 IPv6 지원 시작한지 거의 10년 넘게 DHCPv6 구현 안하고 앉았음. DHCP를 굳이 돌리지 않아도 인터넷이 되니까.
https://en.wikipedia.org/wiki/Comparison_of_IPv6_support_in_operating_systems
그래서 안드로이드는 A flag 없고 M, O인 환경에서 IPv6 못 씀. 이런 환경은 여전히 유효한 IPv6 환경임에도 불구하고. 구글이 DHCPv6가 좋지 않다고 생각하는 이유는 여러가지 있을 것임:
- Privacy 문제: 이미 IPv4에 존재하던 문제고, v6 와서는 DHCPv6 지원 안해버리면 해결되는 문제라서? wifi는 mac 주소 랜덤생성하면 되지만, 데이터 네트워크가 문제일 듯
- DHCP 없어도 되기 때문에 전세계 대부분의 ISP는 DHCPv6 서버를 돌리지 않고 있을거라는 추측을 해봄
IPv6와서도 DHCP가 사라지지 않은 이유는 어떤 기기에 주소를 고정 할당하면서도 다른 DNS, NTP나 임시주소를 부여하려면 여전히 DHCP 서버에 “reserved host” 설정하는 방법이 있음… 딱 그 한 case 밖에 안 떠오른다.
과거에 말하던 “유동IP”라는 개념은 IPv6와서는 3번 혹은 4번. 이론적으로 prefix가 각 ISP 서비스 지역에 고정된다 가정하면 2는 항상 고정일 것이고, IPv6 주소를 다른 사람과 수동으로 주고 받을 때(개인끼리 vnc나 sftp 접근 등) 2를 사용하면 됨.
공유기가 IPv6를 지원하기 위해 해야할 것은
- NAT을 하면 안되고, ULA쓰면 안됨. 많은 공유기가 ULA를 지원하는데, 그거 개발자나 IPv6 테스트할 때 필요하지, 일반 사용자에게는 쓸모 없음. DHCPv6로 ULA주는 이상한 ISP 공유들이 많은데, 그건 심각하게 의미 없는 짓임(TP-Link)
- RA 릴레이 모드: ISP 장비에서 오는 RA 정보 그대로 전달. 단, source link-layer address를 공유기 lan 포트 걸로 바꾸거나 아에 빼고 릴레이 해야 함
- DHCPv6 릴레이 모드 (혹은 prefix delegation)
ISP 공유기는 하도 개념없이 개발된게 많아서 잘 모르겠고, 일반 시중에서 살 수 있는 공유기는 기본 설정으로 그대로 두면 ISP에서 IPv6 서비스하면 기본설정 그대로 IPv6 사용 가능할 것임(자동 혹은 “브리지 모드”).
ISP 장비에 DHCPv6 요청으로 prefix 하나 달라고 요청할 수 있는데, 이를 prefix delegation(PD)이라고 함. Prefix 하나 받으면 그 전체 주소를 자유롭게 사용할 수 있음. 개인/회사에서 VPN 운영하거나, prefix 잘라서 부서간 주소공간 나누거나, IoT 등등에 쓸모 있음.
// 대부분의 보급형 네트워크 제품이 다 IPv6는 시원찮게 구현된 경향이 있음. 아직 ISP에서 널리 제대로 보급도 해주지 않기도 하고, 제품 개발자들 마저도 IPv6가 기존 v4에 비해 상당히 복잡하게 설계되어 있어 제대로 이해하고 제품 개발을 하지 않는 것이 것이 현실임
TODO
그래서 내가 알고 싶은거: 얼마나 많은 ISP들이 DHCPv6 서버를 돌리는지 궁금함. 단순히 v6 주소만 잡히는 것을 확인하는 것이 다가 아니다.
- DHCP-PD가 서비스 되는지의 여부
- SLAAC만 서비스하는지
- XLAT으로 페브릭을 구현했는지
등등… v4보다 설계 유연성이 상당히 높아졌음
모바일 네트워크는 당연히 안드로이드 때문에 무조건 M+O flag 환경이어야 함. 수집해야 할 정보들은 간단하게:
- 윈도 네트워크 상태(
netsh interface ipv6 show addresses) - 리눅스
ip -6 addr명령 출력값 - 혹은 IOS 와이파이 상태 정보
다른 정보는 높은 이해도가 필요함. 공유기의 구현 한계 때문에 정확한 값을 못 얻는 문제도 있다.
갤러리
IOS

IOS는 모바일 IPv6 주소가 설정 앱으로 안빠져 있어서 1, 2, 3, 4를 다 확인할 수 있는 방법 없음(전형적인 애플 디자인!). whatsmyip 같은 외부 사이트 사용해서 나오는 주소는 3번 뿐. 안드로이드는 DHCPv6 안하니까 의미 없음.
위 스샷은 두번째 주소가 3번으로 추정됨 (리스트 들어가기 전에 보이는 주소??). 첫번째 주소는 아마도 2번, 세번째 주소가 DHCP.
Windows
윈도는 3번이 GUI로 안빠져 있어서, netsh로 확인해야 함. 갈 길이 멀다.
Linux
3번이 기본 설정으로 활성화된 리눅스 배포판은 아직 없음. NetworkManager 등으로 따로 수동으로 설정해야 함. Global 속성이 한국어로 “공인 IP주소”. dynamic은 DHCP로 받았다는 의미. 64비트 prefix로 붙은게 2번.
COLOPHON
Signed-off-by: David Timber
Acked-by: 0
| DATE | COMMIT | MSG |
|---|---|---|
| 2024-08-06 | ce874890654f | telco-provided-ipv6: initial commit |