Proxy 서버 생성

Proxy 서버란?

Proxy는 자신을 통해서 다른 네트워크에 간접적으로 접속할 수 있도록 해주는 컴퓨터 혹은 프로그램을 가리킨다.

요청을 중계하는 프로그램. proxy 프로그램은 서버로서 작동하기 때문에 일반적으로 proxy 서버라고 한다.

Proxy 서버를 구축하는 이유

  • 보안 : 익명의 사용자가 서버에 직접 접근하는 것을 막는다.
  • 속도 : proxy 서버는 사용자의 요청을 cache해서, 동일한 요청이 들어오면 cache의 지원을 반환한다. 이는 속도를 높여준다.
  • ACL : 사이트 접근에 대한 접근 정책을 정의할 수 있다.
  • Log/Audit : 회사 내 직원의 인터넷 사용을 레포팅할 수 있다. 반대로 인트라넷 사용을 레포팅할 수도 있다.
  • 지역 네트워크의 제한을 우회하기 위해서 : 보안상의 이유로 80번 외에는 포트를 막아놓는 경우가 있는데, 이러한 제한을 우회해서 원하는 다른 서비스를 이용할 수 있다.

Proxy 종류

Foward Proxy

클라이언트와 애플리케이션 서버 사이에 위치한다. 클라이언트가 타겟 서버인 애플리케이션에 서비스를 요청할 때, proxy 서버로 요청을 보낸다. 그러면 프록시 서버가 타겟 서버로 요청을 중계한다.

Reverse Proxy

외부에서 접근할 수 없는 애플리케이션 서버를 Proxy 서버를 통하여 접근 가능하다. 클라이언트는 mail.a.com이 아닌 Proxy 서버의 URL인 www.abc.com을 요청한다. 요청을 받은 Proxy 서버는 URL에 맵핑된 애플리케이션 서버로 중계를 한다.

애플리케이션 서버의 정보가 외부로 감취어진다는 이점 외에, 분산 처리 시스템을 만들수 있다는 장점도 있다. Proxy 서버가 요청을 분산하는 역할을 할 수 있기 때문이다.

Open Proxy

모든 인터넷 사용자가 액세스할 수 있는 Proxy 서버이다. Open Proxy를 이용하면 자신의 IP를 숨길 수 있다.

ex) 중국같은 나라는 정치적 이유로 외부 사이트 접근을 막는 경우가 있다. Open Proxy를 이용하면 접근할 수 있다.

이번 포스트에서는 Foward Proxy 를 구축해 볼 것이다.

서버구성

Docker에 client, proxy1(8080), proxy2(8888)라는 3개의 container를 생성하여 구성하였다.

client - proxy1(8080) - proxy2(8888) - target(www.naver.com)

proxy1과 proxy2는 내 로컬의 8080과 8888로 접근 가능하다.

내 로컬 IP : 192.168.40.134

Docker IP : 172.17.0.1

proxy1(8080)의 /httpd/apache2/conf/httpd.conf파일 수정

[hadoop@07e75475864c ~/httpd/apache2/conf]$ diff original/httpd.conf httpd.conf
52c52
< Listen 80
---
> Listen 8080  # 8080 포트로 데이터 수신 대기중
117,118c117,118
< #LoadModule proxy_module modules/mod_proxy.so
< #LoadModule proxy_connect_module modules/mod_proxy_connect.so
---
> LoadModule proxy_module modules/mod_proxy.so  # proxy 관련 모듈
> LoadModule proxy_connect_module modules/mod_proxy_connect.so  # proxy 관련 모듈(https)
120c120
< #LoadModule proxy_http_module modules/mod_proxy_http.so
---
> LoadModule proxy_http_module modules/mod_proxy_http.so  # proxy 관련 모듈(http)
194c194
< #ServerName www.example.com:80
---
> ServerName localhost:8080
503a504,514
> # forwarding proxy server 설정
> ProxyRequests On
> ProxyVia On
>
> ProxyRemote * http://192.168.40.134:8888 # 현재 proxy에 대한 원격 proxy를 정의
>
> <Proxy *>
> Order deny,allow
> Deny from all
> Allow from 172.17.0.1  # 해당 IP에서 들어오는 요청만 허용
> </Proxy>

proxy2(8888)의 /httpd/apache2/conf/httpd.conf파일 수정

[hadoop@e33cb2ebb52c ~/httpd/apache2/conf]$ diff original/httpd.conf httpd.conf
52c52
< Listen 80
---
> Listen 8888  # 8888 포트로 데이터 수신 대기중
117,118c117,118
< #LoadModule proxy_module modules/mod_proxy.so
< #LoadModule proxy_connect_module modules/mod_proxy_connect.so
---
> LoadModule proxy_module modules/mod_proxy.so  # proxy 관련 모듈
> LoadModule proxy_connect_module modules/mod_proxy_connect.so  # proxy 관련 모듈(https)
120c120
< #LoadModule proxy_http_module modules/mod_proxy_http.so
---
> LoadModule proxy_http_module modules/mod_proxy_http.so  # proxy 관련 모듈(http)
194c194
< #ServerName www.example.com:80
---
> ServerName localhost:8888
504a505,512
> # forwarding proxy server 설정
> ProxyRequests On
> ProxyVia On
>
> <Proxy *>
> Order deny,allow
> Deny from all
> Allow from 172.17.0.1  # 해당 IP에서 들어오는 요청만 허용
> </Proxy>

client 서버에서

curl --proxy http://192.168.40.134:8080 https://www.naver.com

요청을 보내서 네트워크 연결이 되었는지 확인한다.

다음은 proxy서버들을 경유했는지 확인한다.

proxy1서버의 /httpd/apache2/logs/access_log에 아래와 같은 로그가 출력되면 정상이다.

172.17.0.1 - - [19/Feb/2021:06:46:53 +0000] "CONNECT www.naver.com:443 HTTP/1.1" 200 -

proxy2서버의 /httpd/apache2/logs/access_log에 아래와 같은 로그가 출력되면 정상이다.

172.17.0.1 - - [19/Feb/2021:06:46:53 +0000] "CONNECT www.naver.com:443 HTTP/1.0" 200 -

Leave a comment