요건
- Reverse Proxy 서버를 구축하여 설정된 프록시 값에 따라 다른 서버의 웹페이지 확인
환경
- Ubuntu 20.04 서버 3대
프로세스
- 프록시에 대하여
- 환경 준비
- 프록시 구성
- 웹 서버 설치 및 실행
- 접속 확인
1. 프록시에 대하여
프록시의 종류에는 포워드 프록시와 리버스 프록시가 있으며 특징은 다음과 같습니다.
포워드 프록시(Forward Proxy)는 클라이언트와 인터넷 사이에 위치하여 클라이언트의 요청을 대신하여 인터넷 서버에 접속하는 중개 서버입니다. 클라이언트는 포워드 프록시에 요청을 보내면, 프록시는 해당 요청을 인터넷 서버로 전달하고, 서버의 응답을 클라이언트에게 다시 전달합니다.
포워드 프록시의 주요 목적은 클라이언트의 신원을 숨기고, 인터넷 접근을 제한하거나 제어하는 것입니다. 예를 들어, 회사 내부에서 직원들이 인터넷에 접근할 때 포워드 프록시를 사용하면, 회사는 인터넷 사용을 모니터링하고, 악성 사이트나 비인가된 웹 사이트 접근을 차단하는 등의 보안 및 제어 정책을 적용할 수 있습니다.
또한, 포워드 프록시는 캐싱 기능을 제공하여 인터넷 서버의 응답을 클라이언트에게 바로 전달하는 대신, 이전에 요청한 데이터를 저장하고 있다가 동일한 요청이 있을 경우에는 저장된 데이터를 제공함으로써 네트워크 대역폭을 절약할 수 있습니다. 이는 웹 페이지나 다운로드 파일 등을 반복적으로 요청하는 경우에 유용합니다.
요약하자면, 포워드 프록시는 클라이언트의 요청을 받아 인터넷 서버로 전달하고, 서버의 응답을 클라이언트에게 전달하는 중개 서버이며 클라이언트의 신원 보호, 인터넷 접근 제어, 캐싱 기능 등을 제공합니다.
리버스 프록시(Reverse Proxy)는 클라이언트와 서버 사이에 위치하여 클라이언트의 요청을 대신 받아서 적절한 서버로 전달하는 중개 서버입니다. 일반적인 프록시와는 반대로, 클라이언트가 리버스 프록시에 요청을 보내면, 프록시는 해당 요청을 적절한 서버로 전달하고, 서버의 응답을 클라이언트에게 전달합니다.
리버스 프록시의 주요 목적은 여러 가용 서버 사이에서 부하 분산(load balancing) 및 고가용성(high availability)을 제공하는 것입니다. 클라이언트는 리버스 프록시에게 요청을 보내면, 프록시는 이 요청을 여러 대의 서버로 분산하여 처리하고, 서버의 응답 중에서 가장 적절한 응답을 클라이언트에게 전달합니다. 이를 통해 서버의 부하를 분산시키고, 고가용성을 확보할 수 있습니다.
또한, 리버스 프록시는 보안 기능을 제공하기도 합니다. 클라이언트와 서버 사이에서 데이터를 전달할 때, 프록시는 중간에서 요청과 응답을 검사하고, 보안 정책을 적용할 수 있습니다. 예를 들어, 웹 애플리케이션 방화벽(Web Application Firewall, WAF) 기능을 갖춘 리버스 프록시는 악성 트래픽, 공격 시도, SQL 인젝션 등을 탐지하고 차단하여 웹 애플리케이션의 보안을 강화할 수 있습니다.
요약하자면, 리버스 프록시는 클라이언트의 요청을 받아 적절한 서버로 전달하는 중개 서버이며 부하 분산과 고가용성을 제공하고, 보안 기능을 갖추어 클라이언트와 서버 사이의 트래픽을 검사하고 보호합니다.
오늘 구축을 진행해볼 내용은 "리버스 프록시" 입니다.
2. 환경 준비
3대의 Ubuntu 20.04 서버를 준비합니다.(클라우드 서버를 이용하거나 로컬 PC에 가상 머신을 설치해도 좋습니다.)
저는 Naver Cloud Platform에서 3대의 서버를 준비하였습니다.
3. 프록시 구성
프록시 서버 구축을 위해 먼저 proxy-temp 서버에 Apache2 설치를 진행합니다.
apt update
apt install apache2 -y
프록시 설정을 위해 site-available 에 있는 000-default.conf 값을 수정합니다.
vi /etc/apache2/site-available/000-default.conf
....
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /proxy01 http://10.0.20.13:80/
ProxyPassReverse /proxy01 http://10.0.20.13:80/
ProxyPass /proxy02 http://10.0.20.14:80/
ProxyPassReverse /proxy02 http://10.0.20.14:80/
....
프록시 설정에 사용된 값에 대한 내용은 다음과 같습니다.
ProxyRequests : On으로 설정할 경우 포워드 프록시, Off로 설정할 경우 리버스 프록시 입니다.
ProxyPreserveHost : Apache가 원래 호스트 헤더를 백엔드 서버로 전달하도록 합니다. 이것은 백엔드 서버가 응용프로그램에 액세스하는 데 사용되는 주소를 인식하도록 하기 때문에 유용합니다.
<proxy *> ~ </proxy> : 이 설정은 프록시 서버에 대한 기본적인 접근 규칙을 정의하는 것으로, 모든 IP 주소로부터의 액세스를 허용합니다. 이 설정은 보안 상의 이유로 사용되는 경우가 많으며, 필요에 따라 클라이언트의 IP 주소 또는 특정 IP 주소 범위에 대한 액세스 제한을 추가로 설정할 수 있습니다.
ProxyPass : 클라이언트의 요청을 프록시 서버로 전달하는 역할을 하며, 이 지시문은 원본 서버의 주소와 프록시 서버의 주소를 연결해줍니다.
예를 들어, ProxyPass / http://localhost:8080/와 같이 설정하면 클라이언트의 요청이 http://localhost:8080/으로 전달됩니다.
ProxyPassReverse : ProxyPass와 동일한 구성이어야 하며, 프록시 서버에서 받은 응답을 클라이언트에게 전달하기 전에 응답 헤더의 내용을 조정하는 역할을 합니다. 또한 원본 서버에서 전달된 응답 헤더의 주소나 위치 정보를 프록시 서버로 조정하여 클라이언트에게 올바른 주소나 위치 정보를 제공합니다.
예를 들어, 원본 서버에서 응답 헤더에 포함된 Location: http://localhost:8080/와 같은 주소를 Location: http://example.com/로 변경하여 클라이언트에게 전달할 수 있습니다.
이후 변경된 config값 적용 및 proxy mod 활성화를 위해 명령어를 입력합니다.
a2enmod proxy
a2enmod proxy_http
systemctl restart apache2
4. 웹 서버 설치 및 실행
ww-temp 서버와 ww-temp2 서버에 apache2를 설치하고 index.html 파일을 수정합니다.
index.html 파일에서 php 코드를 사용할 예정이므로 php도 함께 설치를 진행합니다.
apt update
apt install apache2 -y
apt install php -y
index.html 파일에서 php 코드를 인식시키기 위해 mime.conf 설정을 변경한 후, apache2를 재시작합니다.
vi /etc/apache2/mods-enabled/mime.conf
....
AddType application/x-httpd-php .html
....
systemctl restart apache2
기존에 있던 index.html 파일 명을 변경하고, 새로운 index.html 파일을 생성합니다.
mv /var/www/html/index.html /var/www/html/index.html.bak
vi /var/www/html/index.html
<p>서버 이름 : <?php $hostname = gethostname(); echo $hostname; ?>
<p>서버 IP 주소: <?php echo $_SERVER['SERVER_ADDR']; ?></p>
<p>서버 접속 도메인:: <?php echo $_SERVER['HTTP_HOST']; ?></p>
5. 접속 확인
프록시 서버에 설정된 경로를 브라우저에 입력하여 프록시 서버가 제대로 구동되고 있는지, 웹 서버가 정상동작하는지 확인합니다.
proxy-temp 서버 -> ww-temp2 (/proxy01)
proxy-temp 서버 -> ww-temp (/proxy02)
정상적으로 설정된 프록시에 의해 웹 서버로 접속되는 것을 확인할 수 있습니다.