1. Proxy 서버란
Proxy 서버(proxy server )는 클라이언트를 대신해서 간접적으로 인터넷에 접속할 수 있는 중계기 역할을 하는 서버입니다. 예를 들어, 집에 있는 PC에서 google.com 서버의 웹 페이지 접속 시 중간에 proxy 서버를 거쳐가면 서버 입장에서는 접속 IP는 Proxy server에서 접속하는 것으로 인식합니다.
인터넷 속도가 느린 시절에서는 Proxy 서버로 요청된 내용들을 '캐시'에 저장해 놓고, 동일한 웹 페이지에 재 접속 시 원격 서버 접속 대신 Proxy 서버의 캐시를 전송하여 웹 접속 시간을 줄이는 방법으로 사용되었습니다. 이는 외부와의 트래픽을 줄여 네트워크 병목 현상을 방지하는 효과도 얻을 수 있습니다.
GCP에서는 Proxy 서버의 활용은 외부 네트워크 접속 access 권한을 제어하거나, 여러 로컬 IP를 묶어 하나의 공용(외부) IP 주소를 사용하여 비용을 줄이고자 하는 경우에도 유용합니다.
Proxy 서버의 사용 목적은 잠재적으로 다양합니다. 대표적은 활용 예를 다음과 같습니다. 아이러니하게도 회사 내 보안 정책 적용을 위해서 사용할 수 있고, 반대로 보안 정책을 회피하기 위해서도 사용 가능합니다.
- Cache로 성능 개선: Proxy Server의 캐시를 사용하여 웹 Proxy 웹 서버로부터 웹 페이지를 캐시로 저장하여 접속 속도 개선. 최근 인터넷 속도 개선으로 접속 속도는 개선은 크게 의미는 없습니다.
- IP 익명성 보장: 컴퓨터의 IP는 개인정보입니다. Proxy 서버를 사용해서 익명성을 보장, IP 역추적을 피하기 위해서 사용합니다. Proxy 를 사용하더라도 고급 기술을 사용하면 IP 역 추적이 가능하기 때문에 익명성은 100% 보장되지 않습니다.
- IP 지역 우회: Proxy 서버를 외국에 두고 접속하면 컴퓨터의 접속 지역을 외국으로 인식합니다. 지역 제한이 있는 경우 우회 사용
- 회사 내 보안 회피: Proxy 서버를 통해서 회사 보안 정책을 우회할 수 있습니다. Proxy 서버에는 https 443 port를 사용하여 Request 하기 때문에 보안 팀에서는 일반적인 Request와 구분이 쉽지 않습니다.
- 외부 접속 권한 제어 : 사용 기록 확인, 네트워크 서비스나 콘텐츠로의 접근 정책을 적용하기 위해. (이를테면 원치 않는 사이트를 차단), 사용률을 기록하고 검사하기 위해 (이를테면 회사는 인터넷 이용을 파악)
2. Proxy 서버의 종류: Forward Proxy vs Reverse Proxy
Proxy 서버의 종류는 Forward Proxy와 Reverse Proxy 가 있습니다. 일반적으로 개인 목적으로 사용하는 Proxy는 Forward Proxy로 Client 인터넷의 접속 요청을 Proxy가 대신하여 원격 서버의 웹페이지를 요청합니다. 서버 입장에서는 Proxy가 접속한 것으로 인식합니다. Reverse Proxy는 Backend의 서버의 IP를 숨기 위해서 사용되며 Proxy가 서버의 Respose를 대신 전달합니다. 상세 설명은 동영상 설명을 참고해주세요.
- Forward Proxy: 클라이언트의 IP 주소를 숨김. Client에서 Proxy 서버에 Request 요청
- Revere Proxy: 서버의 IP 주소를 숨김. 서버의 Response를 Proxy 서버를 통해서 전달
3. Proxy 서버의 동작 방식: Transparent Proxy vs Anonymous Proxy
Proxy 서버에도 동작 방식은 Http 헤더의 VIA와 X_FORWARD_FOR를 설정 방법에 따라서 다음과 같은 4가지 유형이 있습니다. (출처: 나무위키)
- Transparent Proxy : HTTP 헤더의 VIA, X_FORWARD_FOR 영역에 원래 IP를 전달
- Simple anonymous Proxy : HTTP 헤더의 VIA, X_ FORWARD_FOR 영역에 Proxy 서버의 IP를 저장해서 Proxy임을 알린다. 원래 IP는 제공되지 않는다.
- Distorting Proxy : HTTP 헤더의 VIA 영역에는 자신의 IP, X_FORWARD_FOR 영역에는 랜덤으로 생성된 값을 박아서 자신이 Proxy임을 알린다. 원래 IP는 제공되지 않는다.
- High Annonymity Proxy(또는 Elite) : Proxy를 사용하지 않는 것과 동일하게 동작한다. HTTP 헤더의 VIA, X_ FORWARD_FOR 영역을 IP를 저장하지 않는다. Proxy임을 숨긴다. (http 표준은 아님)
Transparent Proxy 설정 시 Http Header 예제:
Proxy Server를 통해서 Web server에서 Http 헤더를 확인하면 아래와 같이 Via와 X-Forwarded-For에 원본 IP 설정해서 전달됩니다. 단, Proxy 서버를 익명인 Elite로 설정하는 경우 Via와 X-Forwarded-For 없이 서버에 전달됩니다.
If-Modified-Since: Fri, 09 Oct 2020 00:10:17 GMT
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) ... 중략....Chrome/85.0.4183.121 Safari/537.36
Accept: text/html,application/xhtml+xml,.. 중략.... application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
If-None-Match: "1602202217.8904505-7256-3328445520"
Host: ***.***.***.*** → 서버 주소
Via: 1.1 ubuntu18-gcp (squid/3.5.27) → Proxy 사용 중임을 알 수 있음
X-Forwarded-For: 112.***.***.*** → 자신의 IP 주소
Cache-Control: max-age=0
Connection: keep-alive
4. GCP에서 Squid를 사용한 Proxy 서버 설정
GCP에서 Proxy 서버 설정에 대한 전체적인 flow는 아래 그림과 같습니다. 앞서 설명한 내용의 Fowward Proxy 서버로 구성하고, 설치 툴로는 'Squid'를 사용할 예정입니다. PC (윈도우/ 우분투)에서 GCP 방화벽을 거쳐 Proxy 서버에 데이터 패킷을 전달하고 인터넷 망으로 접속할 예정입니다. 각 항목별로 아래와 같은 단계를 거쳐 설명합니다.
- GCP VM에 Squid 설치 및 접속 권한 설정 (각 VM 단위 보안 정책 설정임)
- GCP에서 방화벽 설정 (가상 네트워크 단위로 설정 가능)
- Client (우분투, Windows 10, 안드로이드 스마트폰)에서 Proxy 연결 설정
- Proxy 서버 동작 확인
4.1. Squid 설치
GCP VM에 SSH로 접속해서 apt로 squid를 설치합니다. 설치 버전 및 $ systemctl status squid와 $ netstat -antp 명령어로 squid가 정상 동작하는지 확인합니다. 특히 netstat 은 3128 포트를 listen하도록 설정되어 있어야 합니다.
$ sudo apt install squid
$ squid -version
$ sudo systemctl status squid
$ netstat -antp
4.2. Squid 환경 파일 수정
Squid를 정상적으로 설치했으면 환경 파일을 수정해야 합니다. Squid는 환경 파일은 /etc/squid/squid.conf 이며, 기본 설정 값은 squid.conf에 rule이 없으면 접속을 허용하지 않습니다. Squid의 여러 설정 값 중에서 http_port, http_access, request_header를 설정해야 합니다. 세부적인 설정 내용은 링크1, 링크2를 참고해주세요.
Squid 기본 설정: " Deny, unless rules exist in squid.conf."
#http_port 3128 → Squid Proxy 서버의 서비스 포트를 지정해주는 부분입니다. 변경 시 주석을 풀고 값을 변경할 수 있습니다.
http_access deny all → Squid Proxy 서버의 사용 권한. 기본 값을 모두 거부함
request_header_access → Squid Proxy 서버에서 http request 전달 시 header 추가 여부. 기본 값을 모두 허용함
http_access 기본 설정 확인
$ cat /etc/squid/squid.conf | grep http_access
http_access allow all로 수정합니다. 이는 모든 네트워크에서 proxy를 허용하는 것입니다. 보안 측면에서는 squid에서는 모든 리소스에 대해서 접속을 허용하고 GCP에 방화벽에서 보안 설정을 할 수 있습니다.
$ vi /etc/squid/squid.conf
http_access deny all을 커멘트 처리하고 http_access allow all로 수정합니다.
High Annonymity Proxy(또는 Elite)로 설정을 하는 경우에는 아래와 같은 조건을 추가합니다. (default는 모두 허용되어 있음)
$ vi /etc/squid/squid.conf
request_header_access From deny all
request_header_access Referer deny all
request_header_access User-Agent deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
4.3 GCP에서 방화벽 설정
Squid에서는 모든 IP에 대해서 접속을 허용했고, GCP 방화벽에 proxy server 프로토콜의 방화벽 규칙을 추가하여 외부 접속 권한을 조정할 수 있습니다. VM에 접속해서 VPC 네트워크 → 방화벽 →방화벽 규칙 만들기를 선택하여 방화벽 규칙을 추가합니다.
방화벽 규칙 만들기 메뉴에서 1) 방화벽 이름 입력, 2) 수신 (inbound) 방향, 3) IP 소스 범위 확정 (0.0.0.0/0 모든 IP 허용임 or 특정 IP 설정), 4) tcp/udp의 3128 포트 허용으로 설정하여 방화벽 규칙을 추가합니다. 특정 IP만 접속을 허용하는 경우에 3) IP 소스 범위에 IP address를 추가하면 특정 IP만 접속을 허용합니다.
5. Client에서 Poxy 연결 설정
우분투와 Windows 10, 안드로이드 스마트 폰에 각각 네트워크 Proxy를 설정합니다.
- 우분투: 시스템 설정 메뉴 > 네트워크 > 네트워크 프록시 : 수동 설정으로 변경하고 Proxy 서버의 IP와 포트 입력
- 윈도우10: 시스템 설정 > 프록시 설정 : 프록시 서버 설정을 on으로 변경하고 Proxy 서버의 IP와 포트를 입력
- Android 폰: WiFi 설졍 > SSID 편집 > 고급 설정에서 Proxy 서버 주소를 입력
6. Poxy Server 동작 확인
공인 IP를 확인할 수 있는 https://ko.infobyip.com/에 접속해서 접속 PC의 공인 IP 주소를 확인합니다. 네트워크 Proxy를 설정하는 경우에는 IP 가 미국 ( Oregon, Dalles)로 인식되고, Proxy server의 IP 주소로 인식되는 것을 확인할 수 있습니다.
관련 글:
[개발환경/Oracle Cloud] - 오라클 클라우드 '평생' 무료 VM 만들기 (Google Cloud 무료 조건 비교)
[개발환경/Web Server] - 우분투 20.04에서 lighttpd Web Server 설치 (Embedded용으로 활용 가능)
[개발환경/Web Server] - 우분투 20.04에서 Apache와 Tomcat 완전 삭제 방법
[개발환경/Google Cloud Platform] - GCP(Google Cloud) 하드 디스크 추가하기 (영구 디스크는 30GB까지 무료)
[개발환경/Google Cloud Platform] - Google Cloud Platform을 활용하여 평생 '무료' PC 만들기
[개발환경/Google Cloud Platform] - GCP(Google Cloud) 방화벽 설정: 프로토콜과 포트를 사용 허용 또는 거부하기
[개발환경/Oracle Cloud] - Oracle Cloud 방화벽 설정 (http/https 특정 포트 열기)
댓글