클라우드 환경에서 내부망에 접근하기 위해 openVPN을 이용하고 있었다.

하지만 기존 설치된 버전은 상업용 버전인 OpenVPN Access Server 으로, 무료 버전에서는 동시 접속이 2명까지만 지원되었다.
현재 내부망에 위치하는 Grafana에서 로그를 확인하며 디버깅을 진행하고 있었기에, BE, AI 개발팀 4명이 동시에 로그를 확인할 수 없는 문제가 발생하였고, 동시 접속자 제한이 없는 오픈소스 에디션인 OpenVPN Community Edition 으로 전환하게 되었다.
| 항목 | Community Edition (CE) | Access Server (AS) |
|---|---|---|
| 라이선스 | GPLv2 (오픈소스, 무료) | 상용 라이선스 (2명까지 무료, 이후 유료) |
| 설치 방식 | 직접 구성 (CLI 중심) | 자동 설치 스크립트 및 UI 기반 설정 지원 |
| 관리 인터페이스 | 없음 (CLI, 수동 설정) | 웹 기반 Admin UI 제공 |
| 클라이언트 구성 배포 | .ovpn 파일 수동 배포 | 웹 포털 통해 자동 다운로드 가능 |
| 업데이트 및 패치 | 수동으로 직접 관리 | 자동 업데이트 지원 |
sudo apt-get update
sudo apt-get install -y openvpn easy-rsa
# 작업 디렉토리 생성
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
# PKI 디렉터리 초기화
./easyrsa init-pki
# CA 생성
./easyrsa build-ca nopass
# 서버 키·CSR 생성 및 서명
./easyrsa gen-req server nopass
./easyrsa sign-req server server
# 클라이언트 키·CSR 생성 및 서명
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
# DH 및 CRL 생성
./easyrsa gen-dh
./easyrsa gen-crl
# 생성된 파일들을 복사
sudo cp pki/ca.crt /etc/openvpn/
sudo cp pki/issued/server.crt /etc/openvpn/
sudo cp pki/private/server.key /etc/openvpn/
sudo cp pki/dh.pem /etc/openvpn/
sudo cp pki/crl.pem /etc/openvpn/
cd /etc/openvpn
# 서버용 키 생성
sudo openvpn --genkey tls-crypt-v2-server tls-crypt-v2-server.key
# 클라이언트용 래핑 키 생성
sudo openvpn \
--tls-crypt-v2 tls-crypt-v2-server.key \
--genkey tls-crypt-v2-client tls-crypt-v2-client.key
sudo chown root:root tls-crypt-v2-*.key
sudo chmod 600 tls-crypt-v2-*.key
port 1194
proto udp
dev tun
# 인증서와 키 파일 경로
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
# 제어 채널 암호화 (TLS-Crypt v2)
tls-crypt-v2 /etc/openvpn/tls-crypt-v2-server.key
cipher AES-256-CBC
# vpn 네트워크 설정
server 172.27.224.0 255.255.240.0
ifconfig-pool-persist ipp.txt
# 사설망 라우팅
push "route 10.30.1.3 255.255.255.255"
push "route 10.10.1.0 255.255.255.0"
push "route 10.10.2.0 255.255.255.0"
push "route 10.20.10.0 255.255.255.0"
push "route 10.20.11.0 255.255.255.0"
push "route 10.20.20.0 255.255.255.0"
push "route 10.20.21.0 255.255.255.0"
push "route 10.30.1.0 255.255.255.0"
push "route 10.30.2.0 255.255.255.0"
# DNS
push "dhcp-option DNS 8.8.8.8"
# MTU 관련 설정
tun-mtu 1400
mssfix 1360
# 연결 유지 및 사용자 권한
keepalive 10 30
persist-key
persist-tun
# 상태 및 로깅
status openvpn-status.log
# log-append /var/log/openvpn.log
verb 3
explicit-exit-notify 1
# 데이터 채널 암호화 설정
data-ciphers AES-256-GCM:AES-256-CBC
data-ciphers-fallback AES-256-CBC
client
dev tun
proto udp
remote (서버 public ip) 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA256
cipher AES-256-CBC
verb 3
data-ciphers AES-256-GCM:AES-256-CBC
data-ciphers-fallback AES-256-CBC
keepalive 10 30
# 서버만 지정한 사설망만 라우팅
data-ciphers AES-256-GCM:AES-256-CBC
data-ciphers-fallback AES-256-CBC
<ca>
# ~/openvpn-ca/pki/ca.crt
…CA 인증서…
</ca>
<cert>
# ~/openvpn-ca/pki/issued/client1.crt
…클라이언트 인증서…
</cert>
<key>
# ~/openvpn-ca/pki/private/client1.key
…클라이언트 개인키…
</key>
<tls-crypt-v2>
-----BEGIN OpenVPN tls-crypt-v2 client key-----
# /etc/openvpn/tls-crypt-v2-client.key 내용 전체
…생성된 client key…
-----END OpenVPN tls-crypt-v2 client key-----
</tls-crypt-v2>
sudo nano /etc/sysctl.conf
#net.ipv4.ip_forward=1 주석 제거 후 저장
# 적용
sudo sysctl -p
# 패키지 설치
sudo apt update
sudo apt install iptables -y
# 외부 네트워크 인터페이스 확인
ip a
# NAT 룰 추가
sudo iptables -t nat -A POSTROUTING -s 172.27.224.0/20 -o ens4 -j MASQUERADE
# iptables 세팅 영구 저장
sudo apt install iptables-persistent -y

ens4가 10.30.1.4/32(내부망)에 연결된 네트워크 인터페이스 임을 확인
vpn 사용자들은 tun0을 통해 들어오므로 172.27.244.0/20 대역을 연결해줌
# 서버 재시작 (VM 내부)
sudo systemctl start openvpn@server
# 클라이언트 연결 (사용자 터미널)
sudo openvpn --config ~/cafeboo.ovpn --verb 4
혹은 OpenVPN Connect 에서 연결

Done.