사설 네트워크 안에 있는 웹서버의 Apache VirtualHost 문의
안녕하세요? 네트워크 고수 분들의 조언을 좀 얻고자 합니다.
저는 몇 대의 컴퓨터를 가지고 웹 서비스를 하는 시스템을 만들고 있습니다.
먼저 공인 IP 주소를 가지고 외부 네트워크에 연결된 서버 'A'가 있습니다. (편의상 공인 IP 주소는 111.222.333.444 라고 하겠습니다.)
이 'A'는 또 하나의 네트워크 인터페이스 카드를 가지고 있어서 사설 IP 주소도 가지고 있습니다. (편의상 10.10.10.1 라고 하겠습니다.)
'A'는 방화벽 역할을 하며, 적절할 포트 리다이렉션을 통하여 외부에서 들어오는 요청에 대해 사설 네트워크에 있는 다른 서버에 전달해
주는 역할을 합니다.
도메인도 있습니다. 편의상 abc.com 이라고 하죠. 내부에 DNS 서버를 따로 돌리고 있지는 않지만, 외부에서 abc.com을 요청하면
111.222.333.444로 응답을 할 수 있도록 외부의 어떤 DNS에 등록을 해 놓았습니다.
그리고 웹 서버의 역할을 하는 'B' 서버가 내부 네트워크에 10.10.10.2의 주소를 가지고 있습니다. 여기서 apache를 돌리고 있습니다.
즉, 외부에서 웹 브라우저로 abc.com으로 요청을 하면 먼저 외부에 있는 DNS 서버를 통해 111.222.333.444로 요청이 들어오고
이 요청을 방화벽 서버인 'A'가 받아 웹 서버인 'B'로 전달을 하게되고 'B'가 적절한 웹 서비스 응답을 하게 됩니다.
여기서 'B'의 apache 설정파일을 다음과 같이 하면 문제 없이 동작을 합니다.
<Location "/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE test0.settings PythonDebug On PythonPath "['/web', '/web/test0'] + sys.path" </Location> (django와 mod_python 모듈을 사용하여 일반 설정 파일과 조금은 다릅니다.)
문제는 apache의 VirtualHost 기능을 사용하고 싶은데 방법을 잘 모르겠습니다.
abc.com 아래 vhost라는 가상 호스트를 동작 시키고 싶다고 가정하겠습니다.
아래의 어떤 설정을 통해서도 예상대로 동작을 하지 않는군요.
NameVirtualHost * <VirtualHost *> ServerName vhost.abc.com SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE test0.settings PythonDebug On PythonPath "['/web', '/web/test0'] + sys.path" </VirtualHost>
NameVirtualHost * <VirtualHost *> ServerName vhost.abc.com <Location "/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE test0.settings PythonDebug On PythonPath "['/web', '/web/test0'] + sys.path" </Location> </VirtualHost>
NameVirtualHost * <VirtualHost *> ServerName vhost <Location "/"> SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE test0.settings PythonDebug On PythonPath "['/web', '/web/test0'] + sys.path" </Location> </VirtualHost>
여기서 궁금한 것이 있습니다. 이미 웹서버에 요청이 들어온다는 것은 DNS 서버를 통해 호스트 이름이 IP 주소로 바뀌었다는 것인데,
어떻게 이런 기능이 가능한 것인지, 또 제 네트워크 상황(내부에 DNS 서버가 따로 없는 사설 네트워크)에서도 apache의 VirtualHost
기능이 사용 가능한 것인지, 그렇다면 해결책은 무엇인지...
KLDP에 계시는 고수분들의 조언을 좀 부탁 드리겠습니다.
DNS 에 hostname
DNS 에 hostname 추가하고 apache 의 name based virtual host 설정 똑바로 하시면 됩니다.
name based virtual host 는 클라이언트가 서버로 보내는 http request 의 헤더에 의존합니다.
ip 주소와는 상관없습니다.
+
바로 이 이유 때문에 name based virtual host 에서 https 를 사용하기가 뭣 같습니다.
ssl 을 형성하는 시점에선 ip 주소로만 하기 때문에
서버쪽에서 어떤 host 의 증명서를 보내줘야 할 지 판단할 수 없습니다.
http 는 ssl 이 형성된 이후에 가능하므로 닭과 달걀의 문제처럼 모순이 생기는거죠.
(tls 를 사용하는 방법이 있긴 한데 IE6 에선 불가능하다니, 국내에선 그림의 떡입니다.)
그래서 port based virtual host 로 https 를 사용해왔는데,
http://kldp.org/node/107147 에 따르면 IE8은 포트번호를 hostname 의 일부로 간주한다는군요.
이게 bug 인지 feature 인지는 아직 모르겠습니다.
OTL
댓글 달기