안녕하세요. 이 글은 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
'전공영역 공부 기록' 카테고리의 다른 글
Docker로 MySQL 컨테이너 실행 및 Sakila 샘플 데이터 불러오는 방법 (0) | 2025.03.08 |
---|---|
mTLS 프로토콜과 패킷 분석 (1) | 2025.03.01 |
TCP라더니 HTTPS?! 예상치 못한 디버깅 여정(feat, openssl TLS인증서 추출방법) (0) | 2025.02.16 |
쿠버네티스 node not ready이면 어떤 일이 일어날까? (1) | 2025.02.09 |
NestJS HttpHealthIndicator를 사용하다가 만난 오류 (2) | 2025.02.04 |