옛날부터 쓰던 VPN 클라이언트가 어느샌가 유료화되어 못쓰게 되었다.
속도가 너무 느리기도 했고 이 참에 내가 직접 구축하는게 낫겠다 싶어 EC2에 OpenVPN 서버를 만들게 되었다.
다음과 같은 순서로 진행하였다.
0. EC2 설정
1. EasyRSA로 인증서 및 키 발급
2. 클라이언트 인증서 발급
3. OpenVPN 서버 설정
4. OpenVPN 서버 시작
5. 클라이언트 설정
0. EC2 설정
0-1. EC2 인스턴스 생성
프리티어 EC2를 하나 생성해준다. Ubuntu를 사용해서 EC2를 구성할 계획이다.
VPN 서버의 위치는 EC2의 리전에 따라 결정되기 때문에, 원하는 리전에 생성하면 된다.
필자는 버지니아 북부로 선택하였다.
우측 상단의 주황색 인스턴스 시작 버튼을 클릭하여 인스턴스를 설정한다.
필자는 인스턴스를 다음과 같이 설정하였다.
Ubuntu를 통해 OpenVPN을 구축하기 위해 Ubuntu 22.04 Server 이미지를 선택했고,
443 포트를 열어 OpenVPN 서버와 클라이언트가 연결될 수 있게 하였다.
OpenVPN 서버의 기본값은 1194/UDP 인데, VPN 클라이언트를 설정할 안드로이드 스마트폰에서 이 포트를 개방하려면 루트 권한이 필요한 것 같았다.
그래서 일반적으로 자주 사용되는 HTTPS의 443 포트를 통해 서버와 클라이언트가 통신할 수 있도록 설정하였다.
이후 인스턴스에 고정 IP를 할당해주기 위해 탄력적 IP를 생성하고 인스턴스를 연결한다.
우측 상단의 주황색 탄력적 IP 주소 할당 버튼을 클릭하여 IP를 발급받는다.
발급받은 IP에 약 10분간 인스턴스를 연결하지 않을 시 사용 요금이 과금되니, 생성 즉시 인스턴스와 연결해준다.
0-2. EC2 접속
발급받은 키페어로 SSH에 접속한다. Windows 사용자라면 명령프롬프트/터미널 프로그램을 통해 EC2에 접속할 수 있다. 만약 키페어를 .pem 파일이 아닌 .ppk 파일로 발급 받았다면, PuTTY나 MobaXterm을 사용해도 무방하다.
터미널을 통해 접속하려면 다음과 같은 명령어로 접속할 수 있다.
ssh ubuntu@[인스턴스의 퍼블릭DNS 혹은 퍼블릭IP주소] -i [발급받은 키페어의 경로]
만약 접속이 되지 않는다면 키페어 파일의 접근 권한을 변경해야할 수 있다.
0-3. OpenVPN 및 유틸리티 설치
접속 이후 OpenVPN과 유틸리티를 설치해준다.
OpenVPN은 EC2에 기본적으로 설치되어있는것 같았지만, 다음과 같이 설치할 수 있다.
sudo apt install openvpn -y
다른 에디터를 사용해도 되지만 필자는 vim을 사용하였다.
sudo apt install vim -y
1. EasyRSA로 인증서 및 키 발급
1-1. EasyRSA 다운로드
EasyRSA라고 OpenVPN이 사용하는 인증서를 간편하게 발급받을 수 있게 해주는 유틸리티라고 한다.
홈 디렉토리에 이를 다운받고 압축을 풀어준다.
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz tar
xvf EasyRSA-3.0.8.tgz
1-2. 사용자 정보 수정
vars를 수정해서 사용자의 기본 정보를 수정할 수 있다.
cd ~/EasyRSA-3.0.8/
cp vars.example vars
vim vars
*vars 파일 주석 해제 및 정보 입력
set_var EASYRSA_REQ_COUNTRY "KR"
set_var EASYRSA_REQ_PROVINCE "Seoul"
set_var EASYRSA_REQ_CITY "Seoul"
set_var EASYRSA_REQ_ORG "MyCompany"
set_var EASYRSA_REQ_EMAIL "malachai@mycom.co.kr"
set_var EASYRSA_REQ_OU "Personal Use"
1-3. EasyRSA CA 서버 구축, 인증서 및 각종 키 생성
PKI 시스템을 초기화해준 다음, 필요한 각종 키를 생성한다. easyrsa라는 실행파일이 이 작업을 대신해준다.
과정을 진행하며 몇가지 질문을 하는데, passphrase를 묻는 질문에는 기억하기 쉬운 비밀번호, yes를 입력하는 질문에는 yes를 타이핑하면 된다.
이 과정을 마치면 pki라는 디렉토리 내에 각종 인증서들이 생성된다.
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req my-server nopass
./easyrsa sign-req server my-server
./easyrsa gen-dh
openvpn --genkey secret ta.key
1-4. 생성된 파일 보관
OpenVPN에게 이 인증서들을 제공해준다.
/etc/openvpn 폴더에 넣어주면 된다.
sudo cp ~/EasyRSA-3.0.8/pki/private/my-server.key /etc/openvpn/
sudo cp ~/EasyRSA-3.0.8/pki/issued/my-server.crt /etc/openvpn/
sudo cp ~/EasyRSA-3.0.8/pki/ca.crt /etc/openvpn/
sudo cp ~/EasyRSA-3.0.8/ta.key /etc/openvpn/
sudo cp ~/EasyRSA-3.0.8/pki/dh.pem /etc/openvpn/
2. 클라이언트 인증서 발급
2-1. 클라이언트 인증서 디렉토리 생성
서버의 인증서로 접근 가능 한 클라이언트 인증서를 생성해야 한다.
먼저 이 인증서들을 저장할 client-configs란 디렉토리를 생성한다.
mkdir -p ~/client-configs/keys
chmod -R 700 ~/client-configs
2-2. EasyRSA 키 생성
클라이언트 인증서 또한 EasyRSA로 생성할 수 있다. 먼저 키를 생성해준다.
cd ~/EasyRSA-3.0.8/
./easyrsa gen-req my-client nopass
2-3. 생성된 키로 인증서 발급
생성된 클라이언트 키로 인증서를 발급받는다.
cp pki/private/my-client.key ~/client-configs/keys
./easyrsa sign-req client my-client
2-4. 생성된 파일 보관
과정을 완료하면 .crt 인증서가 생성된다. 이후 클라이언트 설정에 필요한 몇가지 인증서 파일을 미리 복사해둔다.
sudo cp pki/issued/my-client.crt ~/client-configs/keys/
sudo cp ~/EasyRSA-3.0.8/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/
3. OpenVPN 서버 설정
3-1. 샘플 config 복사 및 수정
OpenVPN에서는 서버 설정파일 샘플을 제공한다. 이를 openvpn 디렉토리로 복사하여 서버 설정을 진행하면 된다.
세미콜론으로 시작하는 각종 주석들이 샘플에 포함되어있으며, 필요에 따라 삭제/주석해제 하며 다음과 같이 수정해준다.
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/
sudo vim /etc/openvpn/server.conf
*server.conf 파일 수정
port 443
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "route 10.8.0.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 0 # 0 for TCP, 1 for UDP
key-direction 0
3-2. IP forwarding 설정
터널링용 네트워크 인터페이스(tun0)에서 이더넷 네트워크 인터페이스(eth0)로 IP 포워딩을 허용하기 위해 /etc/sysctl.conf 파일을 수정하여준다.
sudo vim /etc/sysctl.conf
*sysctl.conf 파일 주석 해제
net.ipv4.ip_forward=1
3-3. 방화벽 설정
iptable을 통해 tun0와 eth0 간 규칙을 추가해준다.
sudo iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo iptables -I INPUT 1 -i tun0 -j ACCEPT
sudo iptables -I FORWARD 1 -i eth0 -o tun0 -j ACCEPT
sudo iptables -I FORWARD 1 -i tun0 -o eth0 -j ACCEPT
또한, 우분투의 방화벽인 UFW(Uncomplicated Firewall) 규칙을 수정해 포워딩을 허용한다.
sudo vim /etc/default/ufw
*ufw 파일 변경
DEFAULT_FORWARD_POLICY="ACCEPT"
마지막으로 SSH와 443 포트를 허용해주고 UFW를 재시작한다.
sudo ufw allow 443/tcp
sudo ufw allow OpenSSH
sudo ufw disable
sudo ufw enable
4. OpenVPN 서버 시작
OpenVPN 서버 데몬을 시작한다. status 확인 시, 초록색 Active 상태가 나타나야 오류없이 잘 실행된것이다.
오류가 발생했다면 journalctl로 로그를 확인할 수 있다.
sudo systemctl start openvpn@server
sudo systemctl status openvpn@server
sudo systemctl enable openvpn@server
5. 클라이언트 설정
5-1. 클라이언트 설정 샘플파일 및 키 복사
서버 설정파일과 같이 클라이언트 설정 샘플파일도 제공한다.
샘플파일과 몇가지 key를 먼저 client-configs디렉토리에 복사해준다.
mkdir -p ~/client-configs/files
sudo cp ~/client-configs/keys/ta.key ~/client-configs/files/
sudo chmod 644 ~/client-configs/files/ta.key
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
5-2. 클라이언트 설정
클라이언트 설정은 서버 설정할 떄와 같은 방법으로 다음과 같이 수정한다.
sudo vim ~/client-configs/base.conf
*base.conf 파일 수정
client
dev tun
proto tcp
remote [서버 주소] 443
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert my-client.crt
key my-client.key
tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
verb 3
key-direction 1
base.conf 파일을 my-client.ovpn 파일로 이름을 바꾸고 ta.key, ca.crt, my-client.crt, my-client.key 파일과 함께 한 디렉토리에 집어넣으면 서버에 접속하기 위한 준비가 끝난다.
안드로이드 스마트폰에 OpenVPN Connect 애플리케이션을 설치하고 위의 5개의 파일을 모두 불러오면 VPN 서버에 접속할 수 있다.
PC에서 터미널을 통해선 다음과 같이 서버에 접속할 수 있다.
openvpn --config my-client.ovpn
(선택) 5-3. ovpn 파일 생성 스크립트
클라이언트 설정 파일인 .ovpn 파일 내부에 key를 포함하면 .ovpn 파일 하나만으로 OpenVPN 서버에 접속할 수 있다.
이를 위해 간단한 파일 생성 스크립트를 만들어 .ovpn 파일 생성을 자동화할 수 있다.
sudo vim ~/client-configs/make_config.sh
*make_config.sh 파일 추가
#!/bin/bash
# First argument: Client identifier
KEY_DIR=./client-configs/keys
OUTPUT_DIR=./client-configs/files
BASE_CONFIG=./client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn
이 스크립트를 다음과 같이 실행하면 my-client.ovpn 파일이 생성된다.
cd ~/client-configs
sudo ./make_config.sh my-client
생성된 .ovpn 파일은 PC 터미널을 통한 서버 접속에서 추가적인 키와 인증서 없이 단독으로 사용할 수 있다.
'Today I Learned > AWS' 카테고리의 다른 글
Linux 파일 권한 (0) | 2022.06.28 |
---|---|
PPA (0) | 2022.06.28 |
apt 명령어 (0) | 2022.06.28 |
EC2 (0) | 2022.06.28 |
AWS 접속 시 사용자 명(PuTTY) (0) | 2022.06.28 |