본문 바로가기
Projects/AWS

EC2에서 OpenVPN 서버 Docker container로 구축하기

by yingtao 2025. 4. 7.

OpenVPN

OpenVPN은 가상 네트워크 인터페이스(TUN/TAP) 를 생성하여 사용자의 트래픽을 VPN 서버로 우회시키는 방식으로 작동한다.

  • UDP 1194 포트를 기본 사용 (포트 변경 가능)
  • 클라이언트는 .ovpn 설정 파일을 통해 서버와 TLS 기반으로 통신
  • 사설망 자원(RDS, EC2 등)에 안전하게 접근 가능

이전에는 AWS Marketplace에서 제공하는 OpenVPN 솔루션을 사용했지만,
사용자 수에 제한이 있고 새로운 방식으로 시도해보고자 이번에는 Docker 기반으로 구성했다.
다만 ovpn 파일을 직접 관리해야 한다는 점에서 보안상 취약하다는 단점이 존재한다.

하지만 현재 상황은.. 소수의 인원이 단기간 사용하는 목적이고 일정 기간 이후에는 VPN 서버를 삭제할 계획이기 때문에 나쁘지 않은 방법이라고 생각했다.

 

EC2 생성

  • OS : Amazon Linux
  • 사이즈 : t3.micro
  • 퍼블릭 서브넷에 생성 / 퍼블릭 IP 할당 필요

 

OpenVPN용 EC2 보안그룹 수정

보안 > 보안그룹 > 인바운드 규칙 편집

OpenVPN이 사용할 1194(UDP)
인스턴스에 접속할 때 사용할 22(TCP) 를 허용해준다.

 

RDS 보안그룹 수정 (OpenVPN과 연결 설정)

RDS 보안그룹 > 인바운드 규칙 편집

1194(OpenVPN 기본 포트)와 EC2 보안그룹 추가

 

인스턴스 접속 후 Docker 설치

sudo install docker -y

docker 시작하기

# 상태 확인
sudo systemctl status docker

# 만약 Active:inactive 라면
sudo systemctl enable --now docker

 

 

OpenVPN 설치

alekslitvinenk/openvpn 이미지 사용

sudo docker run -it -d --cap-add=NET_ADMIN \
  -p 1194:1194/udp -p 80:8080/tcp \
  -e HOST_ADDR=$(curl -s https://api.ipify.org) \
  --name openvpn alekslitvinenk/openvpn

 

확인

sudo docker ps -a

 

인증서 생성

 

OpenVPN 서버에 접속할 클라이언트 인증서 및 설정 파일(client.ovpn) 을 생성

sudo docker exec -it openvpn ./genclient.sh client > client.ovpn

해당 url로 접속하면 ovpn 파일 다운 가능


트러블슈팅

.ovpn 파일로 접속을 시도했으나 TLS handshake timeout 등 오류 발생

학교 Wifi 환경에서 접속 중이라 다른 포트로 재연결을 시도했다.

1. EC2 인바운드에 UDP 5353 (새롭게 사용할 포트) 추가

2. Docker 컨테이너 포트 변경

sudo docker stop openvpn
sudo docker rm openvpn
sudo docker run -it -d --cap-add=NET_ADMIN \
  -p 5353:1194/udp -p 80:8080/tcp \
  -e HOST_ADDR=$(curl -s https://api.ipify.org) \
  --name openvpn alekslitvinenk/openvpn
sudo docker exec -it openvpn ./genclient.sh client > client.ovpn

 3. .ovpn 파일에서 remote 항목 수정
(docker 컨테이너 내의 ovpn 파일이 아닌 브라우저에서 다운받은 ovpn 파일 직접 수정!)

# 기존
remote 43.201.xxx.xxx 1194

# 변경
remote 43.201.xxx.xxx 5353