전공영역 공부 기록

curl에서 hosts 파일 변경 없이 테스트하는 방법

악분 2025. 2. 16. 18:43
반응형

안녕하세요. 이 글은 curl로 프록시를 테스트할 때, hosts파일을 변경하지 않고 host를 수정하는 방법을 소개합니다.

 

1.  요약

  • 7계층 프록시(예: nginx)에서는 `-H "Host: example.com"` 옵션을 사용하여 HTTP 헤더의 Host 값을 변경
  • 4계층 프록시(예: TCP 기반)에서는 `--resolve 'host:IP:port'` 옵션을 사용하여 특정 도메인의 DNS 해석을 직접 지정

 

2.  배경지식

프록시는 Virtual Host 개념을 사용하여 요청을 구분하고 라우팅합니다. Virtual Host는 하나의 서버에서 여러 도메인(호스트)의 요청을 처리할 수 있도록 하는 기술입니다.

 

예를 들어, nginx에서 Virtual Host를 어떻게 활용하는지 살펴보겠습니다. 하나의 서버(IP)가 여러 도메인의 요청을 받을 수 있는 이유는 HTTP 헤더의 Host 필드 덕분입니다. 클라이언트가 요청을 보낼 때, HTTP 헤더에 포함된 Host 필드를 nginx가 확인하여, 설정 파일에 등록된 server_name과 매칭되는 서버 블록으로 요청을 전달합니다.

 

즉, nginx에서는 Host 필드가 곧 Virtual Host의 역할을 하며, 이를 기반으로 nginx는 요청을 적절한 서버 블록으로 라우팅하는 것입니다.

server {
    server_name myserver.com www.myserver.com email.myserver.com ;
    ...
}

 

curl은 저희가 입력한 주소로 요청을 할 때, Host필드를 자동으로 입력한 주소로 설정합니다.

curl example.com

 

3.  7계층에서 사용방법

curl이 요청하는 프록시가 7계층(예: nginx)이라면 http헤더의 Host를 수정하여 host를 변조할 수 있습니다. curl은 -H 인자를 사용하여 http헤더를 변조합니다.

 

아래 예제는 example.com을 호출할 때 Host필드를 test.com으로 변조합니다. example.com에서는 test.com으로 host를 인식하기 때문에 당연히 에러 응답을 줍니다.

curl -H "Host: test.com" example.com -v

 

로컬에서 테스트할 때는 hosts파일을 변조하지 않고 아래처럼 사용합니다.

curl -H "Host: example.com" 127.0.0.1

 

4.  4계층에서 사용 방법

4계층(전송 계층)은 7계층(애플리케이션 계층)을 직접 다룰 수 없기 때문에, HTTP 헤더를 변조할 수 없습니다. 따라서, Host 헤더를 직접 수정하는 대신 DNS 응답을 활용하는 방법을 사용해야 합니다.

 

curl에서는 --resolve 옵션을 사용하여 특정 도메인의 DNS 해석을 직접 지정할 수 있습니다. 이를 통해 DNS를 변경하지 않고도 특정 도메인을 원하는 IP 주소로 매핑할 수 있습니다.

curl --resolve '{매핑할 host}:{매핑할 IP}:{port}' 호출 주소

 

hosts파일이 아래처럼 설정되어 있다고 가정해봅시다.

$ cat /etc/hosts
127.0.0.1 myserver.com

 

위 hosts가 설정하는 DNS설정을 curl --resolve로 변경하면 아래와 같습니다.

curl --resolve 'myserver.com:127.0.0.1' myserver.com

 

반응형