iOS에서 hosts 파일을 수정하듯 DNS 해석을 커스터마이즈하는 방법
저는 이전 회사에서 DNS 해석 문제로 골치를 앓은 적이 있습니다.
당시 회사 프로젝트는 운영 환경과 테스트 환경에서 동일한 도메인을 사용하고 있었고, 앱의 트래픽을 테스트 환경으로 보내려면 도메인 해석을 변경해야 했습니다. PC에서는 시스템 hosts 파일만 살짝 수정하면 간단히 해결됩니다. 하지만 iOS 모바일 기기에서는 샌드박스와 보안 제한 때문에 hosts 파일을 직접 수정할 수 없습니다.
당시에는 Wi-Fi DNS 서버를 커스텀 DNS 서버로 설정해서 우회했지만, 다음과 같은 문제들이 끊임없이 발생했습니다:
- DNS 캐시 때문에 변경할 때마다 캐시를 지우고 앱을 재시작해야 함
- 캐시 탓에 DNS 해석이 제대로 반영됐는지 API 응답을 보고서야 확인 가능
- 매번 Wi-Fi DNS 서버 설정을 변경하는 게 번거로움
- 변경 후 스마트폰의 다른 앱 사용에도 영향을 줄 수 있음
이런 문제들을 해결하기 위해, 우리는 ApiCatcher에 DNS 스푸핑 기능인 「DNS 매핑」 을 추가했습니다. 덕분에 iOS에서도 "커스텀 hosts"를 실현하여, 지정한 도메인을 원하는 IP로 리디렉션할 수 있게 되었습니다.
DNS 매핑 작동 원리
iOS 시스템의 hosts 를 수정할 수 없는 상황에서, ApiCatcher는 어떻게 도메인의 해석 결과를 바꿀 수 있는 걸까요?
그 핵심은 프록시 계층의 TCP 연결 수립 단계에서 트래픽을 가로채고 리디렉션하는 데 있습니다:
- 트래픽 가로채기:ApiCatcher에서 패킷 캡처를 시작하면, 스마트폰의 앱이 보내는 HTTP/HTTPS 요청은 모두 로컬 VPN 터널을 통과하여 ApiCatcher가 시작한 로컬 프록시 서버를 경유합니다.
- 프록시 계층 Host 가로채기:앱이 대상 도메인(예:
echo.apicatcher.net)에 연결을 시도할 때, 프록시 서버는 실제 TCP 연결을 시작하기 전에 로컬 DNS 매핑 규칙 테이블을 우선 확인합니다. - 물리적 IP 치환:설정한 매핑 규칙과 일치하면, 프록시 서버는 공용 DNS 조회를 건너뛰고 바로 지정한 IP 주소로 TCP 연결을 수립합니다.
- TLS 핸드셰이크에 완전 투명:IP 치환은 오직 TCP 물리적 연결 수립 단계에서만 이루어지므로, HTTP 패킷의
Host헤더와 TLS 핸드셰이크 시의 SNI(Server Name Indication) 정보는 원래 그대로 유지됩니다. 따라서 엄격한 HTTPS 핸드셰이크 상황에서도 클라이언트 인증서 검증이 정상적으로 통과되며, 앱 입장에서는 완전히 투명하고 자연스럽습니다.
설정 방법
-
ApiCatcher 앱을 열고, 홈 화면 상단의 「+」 버튼을 탭한 후 팝업 메뉴에서 DNS 매핑을 선택하여 「DNS 매핑」 설정 페이지로 들어갑니다.
-
오른쪽 상단의 「+」 버튼을 탭해 새 규칙을 만듭니다:
- 도메인:매핑할 도메인을 입력합니다. 와일드카드를 지원합니다(예:
*.apicatcher.net은 모든 서브도메인에 매칭됩니다). - IP 주소:연결하려는 대상 서버 또는 로컬 PC의 IP 주소를 입력합니다.
- 도메인:매핑할 도메인을 입력합니다. 와일드카드를 지원합니다(예:
-
캡처 시작 즉시 적용 홈 화면으로 돌아가 캡처 시작 버튼을 눌러 프록시 서비스를 시작합니다. 이제 스마트폰에서 규칙과 일치하는 모든 요청은 자동으로 설정한 대상 IP로 라우팅됩니다. DNS 매핑 기능만 사용하고 패킷 캡처는 원하지 않는다면, 호스트 화이트리스트/블랙리스트 규칙을 설정할 수도 있습니다.
DNS 매핑 규칙의 변경은 캡처가 켜져 있는 한 즉시 반영됩니다.
