테스트용 IP 주소 생성기의 역할은 하나입니다. 픽스처가 주장하는 범위에 유효한 주소를 반환하되, 실수로 중요한 머신을 가리키지 않도록 하는 것입니다. 대부분의 생성기가 실패하는 지점이 바로 후반부입니다. 구문상 공인인 주소라도 은행, 클라우드 제공자, 또는 자체 사무실 업링크에 속할 수 있습니다.
이 가이드는 생성기가 지원하는 범위, 모든 검증기가 알아야 할 특수 목적 범위, 구문상 공인 주소와 라우팅 가능한 주소의 차이, 그리고 실제 네트워크와 충돌할 수 없는 픽스처 세트를 만드는 방법을 다룹니다. 또한 범위 규칙이 충분히 달라서 IPv4 사고 모델을 그대로 복사하면 테스트가 깨지는 IPv6도 다룹니다.
생성기가 반환하는 것
IPv4의 경우 생성기는 공인, 사설, 루프백, 링크 로컬의 네 가지 범위에서 값을 생성합니다. IPv6도 마찬가지로 글로벌, 고유 로컬(ULA), 링크 로컬, 루프백의 네 가지 범위를 생성합니다. 범위는 요청의 일부이며 출력에서 추측하는 것이 아닙니다. 같은 점 표기 사중주가 한 맥락에서는 사설이고 다른 맥락에서는 사설 네트워크의 유효한 호스트일 수 있기 때문입니다.
범위는 픽스처 레이블이지 도달 가능성 주장이 아닙니다. 생성된 공인 범위 주소는 사설 및 특수 목적 블록 밖에 있지만, 인터넷 어딘가의 실제 할당과 여전히 일치할 수 있습니다. 생성된 주소로 트래픽을 보내지 마세요. 테스트가 실제 대상과 접촉하지 않음을 확실히 해야 한다면 공인 범위 출력 대신 아래에 설명된 문서화 범위를 사용하세요.
- IPv4 범위: 공인, 사설, 루프백, 링크 로컬
- IPv6 범위: 글로벌, 고유 로컬, 링크 로컬, 루프백
- 어떤 범위도 해당 주소로 트래픽을 보내는 것이 안전하다는 것을 의미하지 않음
- 강한 격리가 필요하면 공인 범위 출력이 아니라 문서화 범위를 사용
IPv4 특수 목적 범위
아래 블록은 검증기나 픽스처 빌더가 명시적으로 처리해야 하는 것들입니다. 사설 공간은 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16으로 약 1,780만 개의 주소를 제공합니다. 루프백은 127.0.0.1만이 아니라 전체 127.0.0.0/8 블록이며, 링크 로컬은 169.254.0.0/16으로 DHCP 실패 시 APIPA 범위로 익숙합니다.
그 외에도 테스트에 중요한 블록이 여러 개 있습니다. 100.64.0.0/10은 통신사급 NAT 공간으로 많은 네트워크에서 사설 공간처럼 동작합니다. 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24는 문서화용으로 예약되어 있어 실제 호스트에 절대 도달해서는 안 되는 픽스처에 이상적입니다. 198.18.0.0/15는 벤치마킹용으로 예약되어 있습니다. 0.0.0.0/8은 "이 호스트"를 의미하고, 224.0.0.0/4는 멀티캐스트, 240.0.0.0/4는 예약입니다.
| 범위 | CIDR | 주소 수 | 일반적 용도 |
|---|---|---|---|
| 사설 | 10.0.0.0/8 | 16,777,216 | 대규모 사설 네트워크 |
| 사설 | 172.16.0.0/12 | 1,048,576 | Docker 및 중규모 네트워크 |
| 사설 | 192.168.0.0/16 | 65,536 | 가정 및 소규모 사무실 LAN |
| 루프백 | 127.0.0.0/8 | 16,777,216 | 로컬 호스트 전용 |
| 링크 로컬 | 169.254.0.0/16 | 65,536 | DHCP 실패 시 APIPA |
| 통신사 NAT | 100.64.0.0/10 | 4,194,304 | ISP 공유 주소 공간 |
| 문서화 | 192.0.2.0/24 | 256 | 안전한 픽스처 범위(TEST-NET-1) |
| 벤치마크 | 198.18.0.0/15 | 131,072 | 네트워크 테스트 장비 |
| 멀티캐스트 | 224.0.0.0/4 | 268,435,456 | 그룹 전달 |
사설 공간과 10/8 질문
세 개의 사설 블록은 RFC 1918에 정의되어 있으며 공용 인터넷에서 라우팅되지 않습니다. 어느 것을 사용할지는 규모와 관례의 문제입니다. 10/8은 무엇이든 수용할 만큼 큰 단일 평면 공간을 제공하고, 172.16/12는 컨테이너 네트워크에서 흔하며, 192.168/16은 소비자 라우터의 기본값입니다. 블록은 겹치지 않으므로 모든 사설 주소가 10으로 시작한다고 가정하는 테스트는 공간의 3분의 2에 대해 틀립니다.
테스트를 깨뜨리는 미묘한 점: 사설 주소는 사설 네트워크 내부에서는 평범한 주소입니다. CI 러너가 10.0.0.0/8에 있다면 해당 블록에서 생성된 사설 주소는 메타데이터 서비스나 관리 패널을 포함한 실제 내부 호스트를 가리킬 수 있습니다. 테스트를 격리해야 한다면 192.168.0.0/16 범위에서, 더 나아가 문서화 범위에서 생성하세요.
- RFC 1918 블록: 10/8, 172.16/12, 192.168/16
- 테스트를 실행하는 네트워크와 겹치지 않는 범위 선택
- 클라우드 메타데이터 엔드포인트는 잘 알려진 사설 주소에 위치
- 내부 호스트도 외부 호스트만큼 실제임
루프백, 링크 로컬, 그리고 이들이 속한 곳
루프백 주소는 호스트를 떠나지 않습니다. 127.0.0.1이 일반적이지만 대부분의 스택에서 전체 127.0.0.0/8 블록이 루프백이며, 127.0.0.53은 systemd-resolved가 로컬 DNS에 사용합니다. 127.0.0.1을 서버 주소로 하드코딩하는 테스트는 같은 포트를 사용하는 머신의 다른 무엇과도 충돌하므로, 병렬 테스트 실행은 포트를 동적으로 할당해야 합니다.
169.254.0.0/16의 링크 로컬 IPv4 주소는 DHCP 서버가 응답하지 않을 때 자동으로 할당됩니다. 프로덕션 로그에서 이를 보는 것은 거의 항상 DHCP 실패를 의미하지, 고객이 이상한 네트워크에 있다는 뜻이 아닙니다. IPv6에서 이에 해당하는 것은 fe80::/10이며 다르게 동작합니다. 모든 IPv6 인터페이스에는 링크 로컬 주소가 있고, 이웃 탐색에 필요하며, 같은 주소가 모든 링크에 존재하므로 영역 인덱스 없이는 사용할 수 없습니다.
| 주소 | 범위 | 호스트를 떠날 수 있나? | 흔한 실수 |
|---|---|---|---|
| 127.0.0.1 | IPv4 루프백 | 아니오 | 이것만 루프백이라고 가정 |
| 127.0.0.53 | IPv4 루프백 | 아니오 | 로컬 리졸버와 충돌 |
| 169.254.1.1 | IPv4 링크 로컬 | 같은 링크만 | 공인 주소로 취급 |
| ::1 | IPv6 루프백 | 아니오 | ::1/128을 호스트 범위로 작성 |
| fe80::1 | IPv6 링크 로컬 | 같은 링크만 | 영역 인덱스 누락 |
IPv4 사고 모델 없이 IPv6 범위 다루기
IPv6에는 브로드캐스트가 없고 NAT 요구 사항도 없으며, 범위 규칙은 접두사에 담겨 있습니다. 글로벌 유니캐스트는 현재 2000::/3에 있으며, 이는 2000::부터 3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff까지의 전체 범위입니다. 고유 로컬 주소는 fc00::/7에 있고 관례적으로 fd00::/8에서 생성됩니다. 링크 로컬은 fe80::/10이며, ::1/128은 루프백이고 ::/128은 미지정 주소입니다.
생성기는 이 네 가지 범위의 주소를 반환합니다. 테스트에 중요한 두 가지 세부 사항: ULA 주소는 전 세계적으로 라우팅되지 않으므로 사설로 취급해야 하며, 링크 로컬 주소는 영역 식별자(예: fe80::1%eth0)와 함께여야 의미가 있습니다. 코드가 IPv6 주소를 저장한다면 영역을 텍스트에 붙이지 말고 별도로 저장하세요. URL의 퍼센트 기호는 다른 의미를 갖기 때문입니다.
| 범위 | 접두사 | 라우팅 가능 | 예시 |
|---|---|---|---|
| 글로벌 유니캐스트 | 2000::/3 | 원칙적으로 예 | 2001:db8::1 |
| 고유 로컬 | fc00::/7 | 아니오, 사설 | fd12:3456::1 |
| 링크 로컬 | fe80::/10 | 같은 링크만 | fe80::1 |
| 루프백 | ::1/128 | 아니오 | ::1 |
| 문서화 | 2001:db8::/32 | 문서용 예약 | 2001:db8::1 |
전환 주소와 기타 함정
IPv4 매핑 IPv6 주소는 ::ffff:192.0.2.1 형태이며, 듀얼 스택 소켓이 IPv4 피어를 IPv6로 보고할 때 나타납니다. 이들은 범용 IPv6 주소가 아니며, 그렇게 취급하면 접두사를 비교하는 속도 제한기와 접근 규칙에서 버그가 발생합니다. 2002::/16의 6to4 주소와 2001::/32의 Teredo 주소는 자체 구조를 가진 전환 메커니즘입니다. 일반 글로벌 주소인 것처럼 생성하지 마세요.
다른 함정은 더 오래되었지만 여전히 존재합니다. 010.1.1.1처럼 IPv4 옥텟의 선행 0은 일부 파서에서 8진수로 해석되고 다른 파서에서는 거부되므로 픽스처에서 절대 허용하지 마세요. 축약형 127.1은 일부 스택에서 127.0.0.1로 허용됩니다. 포트는 별도 필드이며 주소 값에 절대 연결해서는 안 됩니다.
- ::ffff:0:0/96은 IPv4 매핑이며 일반 IPv6 범위가 아님
- 2001:db8::/32는 문서화 공간이며 픽스처의 안전한 기본값
- 기수를 추측하지 말고 선행 0이 있는 옥텟을 거부
- 스택별 확장에 의존하는 127.1 같은 형식 거부
- 포트를 주소 필드 밖에 두고 별도 정수로 검증
충돌할 수 없는 픽스처 세트 만들기
소켓을 열지 않는 단위 테스트에는 문서화 범위를 사용하세요. IPv4는 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24이고 IPv6는 2001:db8::/32입니다. 이들은 예제와 테스트가 실제 호스트에 도달할 수 없도록 정확히 예약되어 있습니다. 파서는 이를 구문상 유효한 공인 범위 주소로 허용해야 하며, 이는 분류 로직을 테스트하기에도 좋습니다.
소켓을 여는 통합 테스트에는 루프백에 바인딩하고 8080을 하드코딩하지 말고 운영 체제에서 포트를 할당하세요. 그럴듯한 원격 피어가 필요한 테스트에는 문서화 범위를 사용하고 모든 클라이언트가 해당 범위로 연결을 거부하도록 하세요. 이 조합은 현실적인 값을 제공하면서 잘못된 구성이 예상치 못한 곳으로 트래픽을 보낼 수 없다는 확실한 보장을 줍니다.
| 필요 | 사용 | 이유 |
|---|---|---|
| 파싱 및 포맷팅 | 192.0.2.0/24, 2001:db8::/32 | 예약됨, 호스트에 도달할 수 없음 |
| 사설 범위 로직 | 192.168.0.0/16 | CI 네트워크와 겹칠 가능성 낮음 |
| 루프백 서버 | 127.0.0.1 및 OS 할당 포트 | 고정 포트 충돌 없음 |
| 링크 로컬 로직 | 169.254.0.0/16 및 fe80::/10 | 올바른 분기를 트리거 |
| 범위 분류 | 한 테이블에 네 가지 범위 모두 | 잘못된 마스크나 접두사 포착 |
테스트에 도달하기 전에 출력 검증
생성된 모든 주소는 애플리케이션이 사용하는 동일한 검증기를 통과해야 합니다. 그것이 생성하는 이유입니다. 패밀리가 요청된 범위와 일치하는지, 주소가 예상 블록 안에 있는지, 텍스트 형식이 동일한 비트로 다시 파싱되는지 확인하세요. 왕복 검사는 IPv6의 0 압축 오류를 잡아냅니다. 여기서 2001:db8:0:0:0:0:0:1은 2001:db8::1로만 정규화되어야 합니다.
주소가 아닌 것도 확인하세요. 사설 범위 픽스처는 공인 블록 안에 들어가서는 안 되고, 루프백 픽스처는 127.0.0.0/8 또는 정확히 ::1이어야 하며, 테스트가 명시적으로 그런 경우를 다루지 않는 한 어떤 픽스처도 멀티캐스트, 브로드캐스트, 미지정 주소가 되어서는 안 됩니다. 이러한 부정 확인은 비용이 적게 들고 가장 창피한 생성기 버그를 잡아냅니다.
- 왕복: 파싱, 포맷, 파싱, 문자열이 아닌 비트 비교
- 패밀리 확인: 값이 요청된 IP 버전으로 파싱됨
- 범위 확인: 접두사 문자열 비교가 아닌 블록 포함 여부
- 부정 확인: 멀티캐스트 아님, 브로드캐스트 아님, 미지정 아님
- 정규화: IPv6 출력은 표준 압축 형식 사용
질문
- IPv4 공인, 사설, 루프백, 링크 로컬; IPv6 글로벌, 고유 로컬, 링크 로컬, 루프백입니다. 범위는 출력에서 추론하지 않고 명시적으로 선택합니다.
- 아니요. 공인 범위는 사설 및 특수 블록 밖을 의미하지 미할당을 의미하지 않습니다. 테스트가 실제 호스트에 도달해서는 안 된다면 문서화 범위 192.0.2.0/24와 2001:db8::/32를 사용하세요.
- 100.64.0.0/10입니다. RFC 1918 사설 공간은 아니지만 전 세계적으로 라우팅되지도 않으므로 분류 로직에서 사설로 취급하세요.
- fe80::/10 범위는 모든 링크에 별도로 존재하므로 같은 주소가 다른 호스트를 가리킬 수 있습니다. 퍼센트 기호 뒤에 인터페이스 이름이 오는 영역 식별자는 어떤 링크를 의미하는지 알려줍니다.
- 문서화된 네 가지 IPv6 범위를 생성합니다. ::ffff:192.0.2.1 같은 IPv4 매핑 형식은 전환 표현이므로 일반 픽스처로 사용하지 말고 파서에서 처리해야 합니다.
생성기는 어떤 범위를 생성할 수 있나요?+
생성된 공인 IP 주소에 접속해도 안전한가요?+
어떤 IPv4 블록이 통신사급 NAT인가요?+
IPv6 링크 로컬 주소에 영역 인덱스가 필요한 이유는 무엇인가요?+
생성기가 IPv4 매핑 IPv6 주소를 만들 수 있나요?+
예시는 합성 데이터입니다. 생성된 주소를 신원 확인, 계정 등록 또는 배송에 사용하지 마세요.