IP Search 데이터 수집 - 전 세계 26만 IP 블록과의 싸움
한국 데이터는 쉬웠다
공공데이터포털에 WHOIS OpenAPI가 있다. 잘 정리된 JSON으로 응답이 온다.
APNIC에서 한국 IP 블록 목록을 가져오고, 각 블록에 대해 API를 호출하면 끝.
총 블록: 2,408개
수집 완료: 2,148개
상세정보 미제공: 260개
IP 커버리지: 1억 290만 개 (92%)
하루 만에 한국 데이터 수집 완료.
글로벌은 다른 문제
5개 RIR 각각 WHOIS 서버가 있다:
- APNIC (아시아-태평양): whois.apnic.net
- RIPE (유럽): whois.ripe.net
- ARIN (북미): whois.arin.net
- LACNIC (남미): whois.lacnic.net
- AFRINIC (아프리카): whois.afrinic.net
총 블록 수: 257,938개
각 서버마다 rate limit이 있다. 너무 빠르게 요청하면 차단.
병렬 수집 전략
5개 RIR을 병렬로 수집하면 속도가 5배.
[Worker 1] → APNIC (53,748 블록)
[Worker 2] → RIPE (98,277 블록)
[Worker 3] → ARIN (79,573 블록)
[Worker 4] → LACNIC (20,477 블록)
[Worker 5] → AFRINIC (5,863 블록)
각 워커가 초당 1건씩 요청. 전체 예상 시간: 약 14시간.
WHOIS 응답 파싱의 고통
각 RIR마다 응답 형식이 다르다. APNIC은 이렇고:
inetnum: 1.0.0.0 - 1.0.0.255
netname: APNIC-LABS
descr: APNIC Labs
country: AU
ARIN은 이렇다:
NetRange: 1.0.0.0 - 1.0.0.255
CIDR: 1.0.0.0/24
NetName: LVLT-ORG-1-0
OrgName: Level 3 Parent, LLC
각 RIR별로 파서를 따로 만들어야 했다. Claude Code가 대부분 해줬지만, 엣지 케이스는 수동으로 수정했다.
저장 구조
기존 한국 스키마에 필드 추가:
ALTER TABLE ip_ranges
ADD COLUMN rir VARCHAR(10), -- APNIC, RIPE, ARIN, LACNIC, AFRINIC
ADD COLUMN country_code CHAR(2); -- KR, US, JP, etc.
인덱스도 추가:
CREATE INDEX idx_ip_ranges_country ON ip_ranges(country_code);
CREATE INDEX idx_ip_ranges_rir ON ip_ranges(rir);
수집 자동화
매일 새 블록 체크, 매월 전체 갱신 예정:
# 매일 0시 10분: 신규 블록
10 0 * * * /path/to/collector --mode=incremental
# 매월 1일 3시: 전체 갱신
0 3 1 * * /path/to/collector --mode=refresh
현재 상태
한국 데이터: 완료 글로벌 데이터: 수집 중
2025년 1월 초에 글로벌 버전 런칭 예정. 전 세계 IP를 검색할 수 있게 된다.
예상 결과
수집 완료 후:
- 전 세계 IP → 기관 검색
- 기관 → IP 대역 역검색
- 국가별 필터링
- 4개 언어 지원 (한/영/일/중)
"Google이 보유한 IP는 몇 개?" 같은 질문에 답할 수 있게 된다.