TCP / IP 프로토콜 스택 계층 간, 특히 DNS와 응용 프로그램 계층 프로토콜 간 정보 흐름에 대한 생각에 혼란을 겪고 있습니다.
하나의 공개 IP 주소가 있습니다. 귀하의 DNS는 확실히 모두 해결할 수 mail.example.com
와 example.com
같은 공용 IP 주소에 있습니다.
일반적으로 방화벽의 외부 인터페이스에서 수신 할 공용 IP 주소에 대한 요청을 포함하는 IP 데이터 그램에는 원격 클라이언트가 액세스하려는 호스트 이름이 포함되어 있지 않습니다. 두 호스트 이름이 모두 동일한 IP 주소로 확인되므로 방화벽은 원격 클라이언트가 확인한 호스트 이름을 마술처럼 "인식"할 수 없습니다. IP 계층은 응용 프로그램 계층에서 사용 된 호스트 이름을 인식하지 못합니다.
TCP 및 UDP 프로토콜은 포트 번호를 사용하여 호스트가 제공하는 특정 서비스를 차별화합니다. 예를 들어, NAT 방화벽의 포트 전달 (포트 주소 변환 또는 PAT라고도 함) 기능을 사용하여 인바운드 TCP 포트를 보내는 동안 들어오는 요청을 웹 서버로 TCP 포트 80 (HTTP)으로 보내는 것이 가능할 수 있습니다. 이메일 서버로 25 (SMTP).
그러나 두 시스템에서 동일한 서비스를 호스팅하려는 경우이 전략에 문제가 있습니다. 웹 서버의 보안 웹 사이트 (고객 액세스 용)와 전자 메일 서버의 보안 웹 사이트 (웹 메일 용)를 모두 호스팅한다고 가정합니다. NAT 방화벽의 공용 IP 주소에서 TCP 포트 443 (HTTPS)으로 들어오는 요청은 한 서버 또는 다른 서버로만 라우팅 될 수 있습니다.
이 상황에 대한 일반적인 해결책은 더 많은 공용 IP 주소를 갖는 것입니다. IPv4 주소가 부족해지기 때문에 문제가 될 수도 있습니다.
애플리케이션 계층의 일부 프로토콜에서는 공개 IP 주소의 부족 문제를 해결하기 위해 노력합니다 . 예를 들어, HTTP / 1.1은 Host:
헤더를 추가하여 웹 서버가 동일한 공용 IP 주소에서 여러 웹 사이트를 호스팅 할 수 있도록합니다. TLS는 SNI ( Server Name Indication ) 확장을 추가하여 원격 클라이언트가 입력 한 호스트 이름을 기반으로 적절한 인증서를 선택할 수 있도록합니다.
응용 프로그램 계층에서 이러한 종류의 해결 방법을 사용하면 모든 응용 프로그램 계층 프로토콜에 고유 한 "수정"이 필요합니다 (그리고 모든 서버 및 클라이언트 소프트웨어가 해당 "수정"을 구현해야 함). 큰 주문입니다.
응용 프로그램 계층 프로토콜을 수정하는 대신 일부 프로토콜은 요청을 "라우팅"할 수있는 소프트웨어를 사용하여 여러 호스트간에 "멀티플렉싱"될 수 있습니다. 응용 프로그램 계층에서 패킷을 검사해야하므로 단순한 NAT 방화벽의 기능을 넘어 설 가능성이 있습니다. nginx와 같은 리버스 프록시를 사용하는 것은 HTTP 프로토콜에 대한 이러한 종류의 "멀티플렉싱"(또는 Microsoft 환경에서 Forefront TMG 또는 ISA Server의 웹 게시 규칙)에 대한 좋은 예입니다 . 이론적으로 모든 프로토콜은 리버스 프록시를 통해 멀티플렉싱 될 수 있지만 프로토콜이 더 난해할수록 사용자 정의 코드 작성에 대해 이야기 할 가능성이 높습니다.
단일 공용 IP 주소의 서로 다른 두 호스트에서 동일한 서비스를 제공해야하는 경우 항상 호스트 중 하나를 비표준 포트로 이동하는 옵션이 있습니다. 그러나 클라이언트는 비표준 포트를 알고 있어야합니다. HTTP (S)의 경우, http://example.com:XXX
표기법 ( XXX
비표준 포트 번호) 이있는 URL이 생성됩니다 . 이것이 당신의 상황에서 문제가 될지 여부는 당신 만이 결정할 수있는 것입니다. (제 경험에 따르면 실제로 최종 사용자는 :XXX
직접 입력해야하는 URL에서 포트 표기법 을 처리 할 수 없습니다 .)