AWS EC2 프록시 서버 만들기

헤외 티켓 예매를 위한 프록시(Proxy) 서버를 만들어 보자

written by tiaz0128

해외 티켓 예매


여행 가기 전에 꼭 해야하는게 있습니다. 필요한 예약을 해두는 것이죠. 일본 지브리 파크나 스페인 기차 예약 등, 반대로 해외에서 국내 OTT 서비스를 보고 싶을 때가 있습니다. 하지만 서비스를 사용 할 수 없는 경우도 자주 있습니다.

지브리

> 지브리 박물관은 두달 전에 예약을 해야한다.

해당 서비스 서버가 IP를 확인해서 자국 IP가 아닌, 해외에서 들어오는 공인 IP를 확인하고 차단하기 때문입니다. 그래서 우리는 또 이걸 우회한다고 미국 / 일본 IP로 변환해주는 VPN 앱을 사용합니다.

VPN (Virtual Private Network)과 전용 회선


전용 회선

먼저 전용 회선에 대해서 알아보겠습니다. 말 그대로 종단과 종단을 물리적으로 직접 연결하는 것을 말합니다. AWS도 Direct Connect 같은 서비스가 있습니다.

VPN(Virtual Private Network)

반면 VPN(Virtual Private Network)은 이름에서도 알 수 있듯, 공중망에 직접 연결되는 것 같은 가상의 통로를 만드는 터널링 기술입니다. 거기다 추가적인 보안 프로토콜(IPsec, SSL)을 제공해 줍니다.

AWS VPN

> 단일 Site-to-Site VPN 연결

프록시(Proxy)


여기서는 VPN을 대신해, AWS EC2를 이용하여 간단하게 프록시(Proxy) 서버를 만들어서 IP를 우회하는 것을 해보겠습니다. 그렇다면 프록시는 어떤 기술일까요?

proxy

  1. 대리/위임(권)
  2. 대리인

프록시는 단어의 뜻 그대로 네트워크 통신에서 중개자 역할을 수행합니다. 클라이언트와 서버 사이에서 요청(Request)과 응답(Response)을 중계합니다. 클라이언트는 프록시에 요청을 보내고, 프록시가 서버에 요청을 전달합니다.

architecture-beta
    service server(custom:chrome)[Browser]

    service server3(custom:server)[Proxy]

    service server4(custom:internet)[Ticket Server]

    server:R -- L:server3
    server3:R -- L:server4

신뢰할 수 있는 프록시 사용

인터넷에 프록시를 검색해보면 다양한 프록시 서버가 나옵니다. 하지만 해당 프록시 서버가 신뢰할 수 있는지는 본인의 책임입니다. 반드시 사용 시 주의가 필요합니다. 그래서 AWS EC2를 이용하여 본인만 사용할 수 있는 안전한 프록시를 만들어 봅시다.

프록시의 종류

NGINX가 서버 앞에서 먼저 요청을 받아서 서버에 전달하는 대표적인 리버스 프록시입니다. 우리가 만들 프록시는 클라이언트에서 동작하는 포워드 프록시 입니다.

프록시 구성방법 두 가지


두 가지 방법으로 EC2를 프록시로 사용해 보겠습니다.

SSH 터널링 프록시


EC2를 SSH 터너링을 사용해서 프록시로 만들어 보겠습니다. 이 방식은 아래 그림 1.과 같이 동작 합니다.

  1. 로컬 컴퓨터와 EC2 간에 SSH Tunnel 생성
  2. 브라우저에서 SSH Tunnel로 프록시를 설정

브라우저의 요청이 SSH Tunnel을 통해 실제 트래픽이 EC2를 통해 나가고 들어와서 다시 브라우저로 전달되는 방식 입니다.

architecture-beta
    group client(custom:computer)[Local Computer]
        service server(custom:chrome)[Browser] in client
        service server2(custom:tunnel)[SSH Tunnel] in client

    service server3(aws:ec2)[EC2]

    service server4(custom:internet)[Ticket Server]

    server:R -- L:server2
    server2:R -- L:server3
    server3:R -- L:server4

> 그림 1. SSH 터널링 프록시

EC2 설정

인터넷 게이트웨이가 연결되어 있는 Public 서브넷에 아래와 같은 설정으로 EC2를 세팅 하도록 하겠습니다.

MobaXterm 터널링

여기서는 MobaXterm을 사용하여 터널링을 생성해 보겠습니다. 상단에 Tunneling 메뉴를 선택하겠습니다.

MobaXterm

New SSH tunnel

MobaSSHTunnel 창에서 하단에 New SSH tunnel 버튼을 선택하여 터널링을 생성하겠습니다. 상단에 Dynamic port forwarding (SOCKS proxy) 선택하고 아래의 정보를 입력 합니다.

  1. Forwarded port : 8080 입력
  2. SSH 서버(EC2) 정보 입력
    • SSH server : EC2 public ip
    • SSH login : ec2-user
    • SSH port : 22

New SSH tunnel > 그림 2. SSH 터널링 프록시

tunnel start

만들어둔 tunnel을 실행하겠습니다. 로컬 컴퓨터와 프록시로 사용 할 EC2 간에 터널링을 생성 됐습니다. 로컬 컴퓨터에서 8080 포트를 사용하면 SSH tunnel을 통해 EC2로 트래픽이 전달됩니다.

New SSH tunnel

Chrome Extension : Proxy SwitchyOmega

그럼 이제 크롬 브라우저가 생성된 SSH tunnel을 사용할 수 있게 8080 포트로 웹 프록시 설정을 해줘야 합니다. 웹 프록시는 Proxy SwitchyOmega 확장 프로그램을 사용하겠습니다.

New SSH tunnel

변경된 아이피 확인

크롬 브라우저가 SSH tunnel을 통해서 EC2를 프록시 서버로 사용하는 구성이 완성됐습니다. 이제 변경된 아이피를 확인해보겠습니다. 아래의 명령으로 공인 IP를 확인해 볼 수 있습니다. 또는 네이버에서 내 아이피로 검색해 프록시 서버로 사용되는 EC2의 IP와 동일한지 확인해보시면 됩니다!

$ curl -x http://localhost:8080 https://ifconfig.me

SOCKS5


위에서 프록시를 설정할때 SOCK5라는 형태로 프록시를 설정했는데 이게 뭘까요?

SOCKS5는 범용 프록시 프로토콜로, 어플리케이션 레이어 프로토콜에 독립적인 특성을 가집니다. 따라서 HTTP, HTTPS, FTP, SMTP 등 다양한 프로토콜을 지원합니다.

SOCKS5 특징

SOCKS5 프록시는 대부분의 경우 HTTP와 HTTPS 트래픽을 효과적으로 처리할 수 있지만, 특정 사용 사례에 따라 HTTP 전용 프록시가 더 적합할 수 있습니다. 상항을 고려하여 프록시 프로토콜을 선택할 필요가 있습니다.

GOST(Go Simple Tunnel) 사용


이번에는 SSH 터널을 직접 사용하지 않고, GOST(Go Simple Tunnel)라는 서버를 EC2에 만들어서 사용해 보도록 하겠습니다.

architecture-beta
    group client(custom:computer)[Local Computer]
        service server(custom:chrome)[Browser] in client

    group EC2(aws:ec2)[EC2]
        service server3(custom:server)[GOST Proxy] in EC2

    service server4(custom:internet)[Ticket Server]

    server:R -- L:server3
    server3:R -- L:server4

EC2 설정

이전 EC2에 보안그룹 인바운드 규칙만 추가해도 상관없습니다.

GOST(Go Simple Tunnel) 서버 실행

우선 도커를 설치 하겠습니다. GOST 이미지를 풀 받아서 제대로 동작하는지 확인 해보는 것 까지 해보겠습니다.

$ sudo yum install docker

$ sudo systemctl start docker

$ sudo docker run --rm ginuerzh/gost -V
gost 2.12.0 (go1.23.2 linux/amd64)

GOST 컨테이너를 실행해 8080 포트를 매핑 해놓고 웹 브라우저에서 트래픽이 오는지 기다리고 있겠습니다.

$ sudo docker run --rm -p 8080:8080 ginuerzh/gost -L=:8080

웹 프록시 세팅

Proxy SwitchyOmega를 이용하여 프록시 서버를 EC2의 Public IP로 세팅 하겠습니다.

Web Proxy

변경된 아이피 확인

이제 로컬 컴퓨터의 공인 IP가 EC2의 Public IP로 변경됐는지 확인해 보시길 바랍니다!

$ curl -x http://13.231.193.59:8080 https://ifconfig.me

실무에서 쓰는 프록시


여기까지 두 가지 방법으로 EC2를 프록시로 사용해 보았습니다. 여기 마무리를 해도 좋겠지만, 프록시가 실제 업무에서 사용되는 경우가 있기 때문에 프록시 관련 세팅을 좀더 알아 보겠습니다.

언제 쓰나

프록시를 실무에서 쓰는 상황은 매우 특수한 경우에 사용될 수 있습니다. 바로 폐쇠망 환경에서 프록시 서버를 구성해야 하는 경우가 있습니다. 예를 들어 폐쇠망 환경에서 서드파티(Third Party) 제품을 사용하는 경우에 프록시를 통해 트래픽을 관리 합니다.

폐쇄망 환경에서 프록시를 사용하여 외부와의 연결 포인트를 하나로 통합하는데 사용 할 수 있습니다. 하나의 지점만 관리하면 되므로, 네트워크 보안과 관리 효율성을 크게 향상시킬 수 있습니다.

트래픽 확인

이때까지 실습의 경우는 브라우저에서 웹 프록시를 써서 웹 트래픽만 EC2로 전달했습니다. 프록시를 세팅해 두고 아래의 명령으로 테스트 해보면, 브라우저가 아닌 경우는 트래픽이 프록시로 전달되지 않는 것을 확인 할 수 있습니다.

$ curl https://ifconfig.me

모든 트래픽을 프록시로

폐쇠망 환경에서 모든 트래픽이 프록시를 거쳐야 한다면 이렇게 해서는 안돼겠죠? 그래서 이번에는 OS의 설정을 변경하여 로컬 컴퓨터에서 발생하는 모든 트래픽을 프록시로 보낼수 있게 해봅시다.

Windows에서 프록시 설정


Windows에서는 ‘수동 프록시 서버 설정 변경’으로 검색합니다. 수동 프록시를 적용해서 간단하게 모든 트래픽을 프록시로 보낼 수 있습니다.

수동 프록시

Linux에서 프록시 설정


일시적 설정

export 명령어로 임시로 환경변수를 등록 할 수 있습니다. all_proxySOCKS5 프록시 환경변수 입니다. http / https 등의 프로토콜 별로 환경변수를 등록해서 사용 할 수도 있습니다.

$ export all_proxy=socks5://127.0.0.1:8080
$ export http_proxy=http://127.0.0.1:8080
$ export https_proxy=https://127.0.0.1:8080
$ export ftp_proxy=ftp://127.0.0.1:8080
$ export no_proxy="localhost,127.0.0.1,::1"

일부 애플리케이션은 대문자 변수를 사용하기 때문에, 대문자 변수도 함께 설정하는 것이 좋습니다.

$ export ALL_PROXY=$all_proxy

아래의 curl 명령을 통해 트래픽이 프록시로 전달 되는 것을 확인 할 수 있습니다.

$ curl -v google.com

프록시를 해제 하기 위해서는 쉘을 재시작하거나 unset 명령어로 환경변수를 해제 할 수 있습니다.

$ unset all_proxy

영구적 설정

environment 파일을 수정하여 영구적으로 프록시를 사용하게 만들 수 있습니다.

$ sudo vim /etc/environment
/etc/environment
all_proxy=socks5://127.0.0.1:8080
ALL_PROXY=$all_proxy

변경된 환경변수가 적용될 수 있게 쉘을 재접속하거나 아래의 명령으로 쉘을 재시작 해줍니다.

source ~/.bashrc

마무리


프록시는 클라이언트와 서버 사이에서 ‘중개자’ 역할을 수행하는 서버입니다. 프록시 서버는 상황에 따라 유용하게 사용할 수도 있지만, IP를 변경 가능하기 때문에 악의적인 용도로도 사용 가능합니다. 반드시 주의해서 사용해야 합니다.

웹 프록시만 설정하거나, 환경변수로 OS 전체 트래픽을 프록시로 변경해 봤습니다. 좀더 현대적인 방법으로 프록시를 설정 할 수 있는 방법 중에 NetworkManager를 공부해 보면 좋을것 같습니다.

AWS Proxy

tiaz0128

Eat Sleep Coding.

Never Never Giveup.

💫 Python  |  BackEnd  |  Cloud Architect  |  DevOps