이번 포스팅에서는 Docker을 사용해서 간단하게 OpenVPN을 설치 및 사용하는 방법에 대하여 다루어보겠다. 포스팅 순서는 아래와 같다.
- VPN이란 무엇인가?
- Docker를 통한 OpenVPN 서버 만들기
- OpenVPN client 설치 및 사용하기
- 안전한 퍼블릭 인터넷 액세스 가능
- 검색 기록을 프라이빗으로 유지 가능
- 전 세계에서 스트리밍 서비스에 액세스 가능 (* 꿀 기능)
- 신원을 보호 가능
위와 같은 장점들로 인해 많은 인터넷 사용자들이 현재도 VPN을 사용하고 있으며, 현재도 VPN은 활발하게 사용되고 있다. 하지만 여러 사용자들 VPN을 사용하기 때문에 VPN 제공사들 또한 성능에 제한을 두기 위해 여러 유료 요금제를 통해 해당 기능을 제공하고 있다. 따라서 만약 본인이 VPN을 정말 많이 광범위 하게 사용하는 헤비 유저라면 매달 지불해야하는 VPN 요금 또한 부담이 될 수도 있다. 반대로 정말 간단한 용도로 사용하는 라이트 유저 입장에서도 매번 새로운 무료 VPN을 찾아 헤매는것도 상당히 귀찮은 일이다. 만약 이러한 경우 자신만의 VPN서버를 손쉽게 구성할 수 있다면 상당히 유용할 것 같아 해당 포스팅을 작성하게되었다.
OpenVPN을 설치하는 방법은 여러 방법이 있지만, Docker을 통해서 진행하는 이유는 가장 간단하기 때문이다. 사실 VPN 서버를 생성하기 위해서는 도메인 / CA인증서등이 필요하지만 개인이 이를 갖고 관리하는 경우는 많지 않다. 때문에 이렇게 필요한 리소스들을 자동으로 생성 가능해주며, 필요한 리소들이 컨테이너화 되어 있는 Docker 이미지를 사용하여 간단하게 설치하는 방법을 가이드하려 한다.
- OpenVPN을 설치 할 서버 준비
- 서울 리전에 아래와 같은 EC2 Instance를 준비하였다.
- Instance type : t3.small
- VPC / Subnet : Public Subnet 준비 후 해당 Subnet에 인스턴스 생성
- OS : Amazon Linux 2023 (* 테스트는 안해보았지만 Docker만 사용할 수 있다면, 다른 OS인 Amazon Linux 2 및 ubuntu 20.04LTS 등에서도 정상 작동 할 것으로 보임.)
- VPN 접속이 가능하도록 보안 그룹의 inbound 그룹은 1194/UDP 및 80/TCP 오픈
- Instance 접속 후 Docker 설치
$ sudo yum install docker -y
- Docker 설치 후 아래의 명령어를 통해 간단하게 OpenVPN 설치
$ 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 dockovpn alekslitvinenk/openvpn
- 명령어 정리
- --cap-add=”MKNOD” --cap-add=”NET_ADMIN”처럼 설정합니다. 모든 Capability 목록은 다음 링크를 참조하기 바랍니다. Capabilities Man Page
- Port 1194/UDP 80/TCP 사용
- Host IP 주소는 curl -s https://api.ipify.org 명령어로 불러옴
- 컨테이너 Name 은 dockovpn 으로
- 아래 명령어를 통해 해당 인스턴스에 정상적으로 OpenVPN이 설치되었는지 확인
$ docker ps -a
더 많은 도커 명령어 보기
- 명령어 결과 :
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6aa53038c8f alekslitvinenk/openvpn "dumb-init ./start.s…" 2 hours ago Up 2 hours 0.0.0.0:1194->1194/udp, :::1194->1194/udp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp dockovpn
- 인증서 생성
- OpenVPN서버에서 사용할 CA 인증서 및 Private key를 아래의 명령어를 통해 생성한다.
(* 해당 파일을 통해 OpenVPN Cient 설치 후 구성한 OpenVPN 서버에 대한 액세스 인증을 진행한 후 VPN을 사용할 수 있다.)
$ docker exec dockovpn ./genclient.sh o > client.ovpn
$ ll
total 12
-rw-r--r--. 1 root root 8414 May 7 07:40 client.ovpn
이제 OpenVPN을 사용할 준비가 전부 끝났다.
OpenVPN 서버를 만들었으니, 해당 서버를 통해 VPN을 사용할 EC2 Instance를 생성하여 OpenVPN Client를 설치해준다. 나 같은 경우 VPN 사용을 통해 IP 변경이 되는 것을 조금 더 명확하게 하기 위해 다른 리전 (싱가폴)에 Window Instance를 생성해주었다.
- 서울 리전 (OpenVPN 서버가 존재하는 리전)이 외에 다른 리전(OpenVPN client를 사용해 VPN을 이용할)에 Instance 생성
- 인스턴스 접속 / 윈도우 Instance 접속
- 윈도우 인스턴스 접속 후 OpenVPN Client 다운로드 / 다운로드 링크 / * Mac으로 접속 시 tunnelblick 사용
- 아래와 같이 윈도우 인스턴스에 OpenVPN Client를 성공적을 설치하였다면, 우측 하단에서 Client 확인 가능
- OpenVPN 서버 인스턴스에 생성해 놓은 CA 인증서 및 Private Key의 정보를 갖고 있는 "client.ovpn" 파일 정보 복사
- 윈도우의 NotePad를 실행 후 복사한 정보를 붙여 넣고 아래와 같이 *.ovpn 형식의 VPN client 액세스 인증 파일을 만들어주자. 정상적으로 생성되었다면 아래와 같은 파일이 생성되었을 것이다.
- 해당 ovpn 파일을 OpenVPN GUI에 Import 해준다.
- Import가 성공적으로 진행되면, VPN 서버에 정상적으로 연결되며, IP가 변경된다.
- 성공적으로 연결 되었을때
싱가폴 리전의 Client 인스턴스에서 VPN 접속 후 VPN 서버와 같은 리전의 서브넷에 존재하는 인스턴스가 있다면 해당 인스턴스에 VPN 서버를 통해 접속이 가능하다. VPN 서버를 단순히 VPN 용도가 아닌 Bastion 서버용으로도 사용이 가능하다는 것이다.
테스트
- VPN 서버가 존재하는 서브넷에 Private instance 생성 (Private IP 10.0.0.148)
- Client 측에서 VPN 연결 후 위의 Private IP로 Ping 테스트
- 명령어 : $ ping 10.0.0.148 -n 10
성공 (VPN 연결시)
Pinging 10.0.0.148 with 32 bytes of data:
Reply from 10.0.0.148: bytes=32 time=99ms TTL=125
Reply from 10.0.0.148: bytes=32 time=100ms TTL=125
Reply from 10.0.0.148: bytes=32 time=99ms TTL=125
....
....
실패 (VPN 연결 안함시)
Pinging 10.0.0.148 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
....
....
간단하게 OpenVPN을 설치하고 사용해보는 내용에 대한 포스팅을 진행해보면서 VPN의 Workflow에 대해 약간의 이해력을 얻을 수 있었으며, 나만의 Private VPN을 만들어 사용할 수 있는 면에서 흥미를 느낄 수 있었다.