웹 서버는 직접 IP 주소 액세스를 사용하고 있는지 어떻게 알 수 있습니까?


64

일부 웹 서버는 IP 주소를 사용하여 액세스하면 직접 IP 주소 액세스가 허용되지 않는다는 오류를 반환합니다.

나는 이것이 어떻게 작동하는지 궁금 해왔다. 브라우저가 항상 IP 주소를 확인하여 연결하지는 않습니까? "직접 IP 주소 액세스"가 단순히 DNS를 건너 뛰지 않습니까? 원격 서버는 DNS를 건너 뛴 것을 어떻게 수 있습니까?


2
내가 기억하는 것처럼, 그가 실제로 요청한 것은 동일한 실제 호스트에 가상 서버를 제공하기 위해 http 프로토콜에 아주 일찍 추가되었습니다.
JDługosz

3
기본적으로 단일 서버가 다른 가상 호스트를 구별 할 수 있도록하는 동일한 프로세스입니다. 실제 서버는 URL을 가상 호스트 중 하나에 매핑합니다. 대부분의 서버에는 매핑되지 않은 URL에 대한 대체 또는 설계 상 기본 설정이 없습니다.
Manngo

호스트 파일에 문제의 도메인 이름에 대한 항목을 작성하는 경우 DNS를 건너 뛸 수 있지만이 오류를 피하십시오. 브라우저가 도메인 이름을 찾고 Host : 헤더에 포함하지만 hosts 파일 항목으로 인해 DNS 쿼리가 수행되지 않습니다.
Monty Harder

이런 종류의 질문에 대한 대답은 대개 당신이 그들에게 말했기 때문 입니다.
Thomas

답변:


91

그것이 어떻게 아는지에 대한 질문에 대답하려면 브라우저가 서버를 보내는 것과 관련이 있습니다.

시스템은 항상 IP 주소로 시스템을 확인하지만 브라우저는 HTTP 헤더에서 액세스하려는 URL을 보냅니다.

다음은 온라인에서 찾은 샘플 헤더입니다. Windows에서 Firefox를 사용 apple.com하고 주소 표시 줄에 입력 한 것처럼 수정되었습니다 .

GET / HTTP/1.1
Host: apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

IP 주소를 사용한 경우 헤더는 다음과 같습니다.

GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

둘 다 소켓을 통해 동일한 IP 주소로 전송되지만 브라우저는 서버에 액세스 한 내용을 서버에 알려줍니다.

왜? IP 주소가 동일한 웹 서버는 여러 사이트를 호스팅하고 각 사이트마다 다른 페이지를 제공 할 수 있습니다. IP 주소별로 페이지를 원하는 사용자를 모두 구별 할 수는 없지만 HTTP 헤더로 페이지를 구별 할 수 있습니다.


7
아, 이제 훨씬 더 이해가됩니다! 따라서 기본적으로 브라우저는 IP 또는 도메인이있는 헤더를 IP로 전송하며 사이트는 그에 대한 가정을합니다. 실제로 이러한 제한은 무시하기 쉽습니다.
Joseph A.

7
우회하는 것이 제한이 아니라 공을 치지 않고 이상한 결과를 얻을 수 있다는 것입니다.
iAdjunct

이 HTTP 요청은 프록시를 사용하는 경우 얻을 수 있습니다. 프록시가 없으면 정보가 host헤더에 제공됩니다 . 이 예제를 참조하십시오 .
0xFE

2
bytec0de :이 중 다른 부분은 웹 서버 구성이 종종 호스트 이름을 기반으로 설정된다는 것입니다. IP 패킷은 IP 주소를 지정하고 TCP 세그먼트는 포트 번호를 지정하며 HTTP 헤더는 호스트 이름을 지정합니다. 따라서 일반적으로 서버는 "클라이언트 / 브라우저가 example.com을 요청하면이를 제공합니다."라고 말하도록 구성됩니다. IP 주소 나 와일드 카드에도 응답하도록 설정할 수 있지만 (예 : 무엇이든 응답) 많은 사람들이 예제를 복사하기 만하며 기존의 많은 예제는 브라우저에서 제공 한 도메인 이름을 기반으로합니다.
TOOGAM

14
@ bytec0de 제한 이 아닙니다 . 올바른 전화 번호를 사용하는 것과 비슷하지만 잘못된 내선 번호는 올바른 건물을 호출했지만 올바른 사람은 아닙니다. 그리고 그 도입 이유는 전화와 거의 동일합니다. 따라서 동일한 IP 주소 (및 TCP 포트)에서 여러 개의 개별 사이트를 호스팅 할 수 있습니다. 예를 들어, 개발 서버는 동시에 수백 개의 개별 웹 사이트를 호스팅했으며 많은 웹 호스팅 솔루션이 동일한 접근 방식을 사용합니다 ( "도메인 등록, IP 주소 지정, 나머지는 처리합니다"). .
Luaan

21

HTTP 1.1 프로토콜을 사용하면 (이전 HTTP 1.0 버전은 오랫동안 사용되지 않아 최신 버전의 브라우저에서 사용되지 않을 수 있음) host헤더가 도입되었습니다. 들어 HTTP 1.1 브라우저에서 발급 한 것이어야합니다 필요한 헤더 행입니다 . 도메인 이름은 브라우저에서 해당 행에 포함됩니다 (예 :) Host: example.com. 따라서 웹 서버는 브라우저가 해당 라인에서 액세스하려는 웹 사이트를 알고 있습니다. 웹 서버는 수십 개의 웹 사이트를 지원할 수 있으므로 요청 된 페이지가있는 웹 사이트를 결정하는 데 중요합니다. 브라우저가 example.com의 사이트 홈 페이지에 액세스하려고한다고 가정하면, 서버에 연결될 때 서버에 다음 행을 발행합니다.

GET / HTTP/1.1

이 줄은 브라우저가 웹 사이트의 루트 문서 (예 : "/")를 가져 오도록 지정합니다. 액세스를 원한다면 /somedir/testpage.html, GET /somedir/testpage.html은 "수"라인에있을 것입니다. 행 뒤에는 다음 행이 있습니다.

Host: example.com

따라서 웹 서버가 example.com, someothersite.com, yetanothersite.org 등의 웹 사이트를 지원하는 경우 example.com의 기본 페이지를 반환해야한다는 것을 알고 있습니다. 해당 줄을 얻지 못하거나 해당 줄에 도메인 이름 Host이 없으면 어떤 웹 사이트의 홈페이지를 반환해야하는지 알 수 없습니다. 따라서 대신 오류 메시지를 표시하거나 서버의 "기본"사이트에 대한 홈 페이지를 리턴 할 수 있습니다.

텔넷 프로토콜을 사용하여 브라우저에서 실행하는 것과 동일한 명령을 실행할 수 있습니다 ( 예 : telnet example.com 80Linux 쉘 프롬프트 또는 Apple OS X 터미널 창). 기본 HTTP 포트, 포트 80에 연결- 단계는 PuTTY사용하여 웹 사이트에 대한 액세스 테스트를 참조 하십시오 Windows 시스템에서 PuTTY를 사용하여이를 수행합니다.


3
참고 사항 : 호스트 헤더는 HTTP 1.0에서도 사용되었으며 필요 하지 않았습니다 . HTTP 1.1은 필드를 필수로 설정했습니다. 실제로, 브라우저가 호스트 헤더를 보내지 않으면 (위에 설명 된 모든 이유로) 많은 HTTP 1.0 서버가 작동하지 않아 대부분의 브라우저가 어쨌든 보냈습니다.
Luaan

6

이것은 Host:HTTP 헤더 때문입니다. 동일한 IP 주소로 여러 사이트를 호스팅 할 때 매우 유용합니다. 예를 들어 http://www.k7dxs.net/http://www.philipgrimes.com/ 은 모두 동일한 IP 주소에 있습니다. 그러나 Host:헤더로 인해 서로 다른 두 사이트를 표시 할 수 있습니다.

@Toothbrush가 지적한 HTTPS의 경우 Host 헤더는 암호화 된 요청의 일부이므로 서버는이 인증서가 없으면 어떤 인증서를 제공할지 알지 못하므로 TLS 서버 이름 표시를 사용합니다.

재미있는 실험 : Firefox 용 변조 데이터 가져 오기 (Chrome과 동등한 기능을 찾지 못함)를 변경합니다. http://slipstation.com/을 열고 Host:요청 에서 헤더를 http://www.zombo.com/으로 편집 하십시오 . 가능한 모든 것이 가능한 친숙한 웹 사이트가 표시됩니다.


실제로 해당 사이트는 서버 이름 표시를 사용 합니다. 서버가 사용할 인증서를 모르기 때문에 두 사이트가 SNI없이 HTTPS를 통해 동일한 서버에서 호스팅되는 경우 어떤 사이트를 표시할지 알 수있는 방법이 없습니다.
칫솔

아, 흥미 롭습니다. 실험이 계속 작동합니까?
Duncan X Simpson

예, HTTP를 통해 동일한 IP 주소로 호스팅되는 두 개의 사이트를 찾으면
칫솔

그러나 HTTPS는 내가 요구 한 것이 아닙니다.
Duncan X Simpson

아니요, HTTPS를 통해 작동하지 않아야합니다. 그렇다면 웹 서버에 보안 취약점이있는 것입니다.
칫솔

5

웹 서버는 특정 도메인 또는 하위 도메인에 대한 연결 만 허용하도록 구성 할 수 있습니다. 여러 도메인을 호스팅 할 수 있습니다.

직접 IP 주소를 사용할 때 웹 서버가 수행하는 작업을 구성 할 수 있습니다. Apache의 경우 기본적으로 활성화 된 사이트에서 이름이 지정된 vhost (알파벳순으로 정렬 됨)로 이동합니다.

이것은 빠른 검색 후 찾은 Apache 설명서에서 가장 관련성이 높은 부분입니다.

https://httpd.apache.org/docs/current/vhosts/name-based.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.