RHEL 10 계열 서버에 EPEL 의 OpenVPN 2.7.7[1] 을 설치하고, Easy-RSA 로 PKI 를 만들어 인증서 기반 Road Warrior 서버를 올리는 절차다. 클라이언트는 내부망 192.168.0.0/24 에 접근하고 인터넷은 자기 회선으로 나가는 split tunnel 구성이다. 전체 트래픽을 VPN 으로 보내려면 push "redirect-gateway def1" 한 줄만 더한다.
RHEL 9 계열은 EPEL 이 2.5.11 을 주는데[2], 아래 설정은 2.5 에서도 그대로 동작한다.
vpn.example.com.10.8.0.0/24 가 내부망과 겹치지 않아야 한다.dnf install -y epel-release
dnf install -y openvpn easy-rsa
openvpn --version | head -1
# OpenVPN 2.7.7 ...
cat > /etc/sysctl.d/99-openvpn.conf <<'EOF'
net.ipv4.ip_forward = 1
EOF
sysctl --system
Easy-RSA[3] 는 OpenSSL 을 감싼 스크립트다. CA 키는 VPN 서버가 아니라 별도 장비에 두는 것이 원칙이지만, 여기서는 같은 서버의 root 전용 디렉터리에 만든다.
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa
cat > vars <<'EOF'
set_var EASYRSA_REQ_COUNTRY "KR"
set_var EASYRSA_REQ_PROVINCE "Seoul"
set_var EASYRSA_REQ_CITY "Seoul"
set_var EASYRSA_REQ_ORG "Example Inc."
set_var EASYRSA_REQ_EMAIL "admin@example.com"
set_var EASYRSA_REQ_OU "VPN"
set_var EASYRSA_ALGO ec
set_var EASYRSA_CURVE secp384r1
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 825
EOF
./easyrsa init-pki
./easyrsa build-ca # CA 키 비밀번호를 물어본다. 꼭 건다
./easyrsa build-server-full server nopass
./easyrsa build-client-full client1 nopass
./easyrsa gen-crl
EASYRSA_ALGO ec 로 타원곡선 키를 만든다. RSA 가 필요하면 rsa 와 EASYRSA_KEY_SIZE 2048.nopass 는 서버 · 클라이언트 키에 비밀번호를 걸지 않는다는 뜻이다. 클라이언트 키에 걸고 싶으면 빼면 된다.gen-dh)는 만들지 않는다. 2.7 은 dh none 이 기본이고 ECDH 를 쓴다[4].cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn/server/
openvpn --genkey secret /etc/openvpn/server/ta.key
chmod 600 /etc/openvpn/server/server.key /etc/openvpn/server/ta.key
/etc/openvpn/server/server.conf
port 1194
proto udp4
dev tun
topology subnet
ca ca.crt
cert server.crt
key server.key
dh none
tls-crypt ta.key
crl-verify crl.pem
# 2.7: data-ciphers 로 협상한다. cipher 는 무시된다
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
tls-version-min 1.2
remote-cert-tls client
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/lib/openvpn/ipp.txt
# split tunnel — 내부망만 터널로
push "route 192.168.0.0 255.255.255.0"
push "dhcp-option DNS 192.168.0.53"
# full tunnel 로 바꾸려면
# push "redirect-gateway def1 bypass-dhcp"
keepalive 10 120
explicit-exit-notify 1
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mkdir -p /var/log/openvpn /var/lib/openvpn
chown nobody:nobody /var/log/openvpn /var/lib/openvpn
openvpn-server@ 유닛이 /etc/openvpn/server 를 작업 디렉터리로 잡는다.compress · comp-lzo 는 넣지 않는다. 2.7 은 송신 압축을 하지 않으며 옛 클라이언트와의 호환은 allow-compression 없이도 프레임 헤더만 맞춘다.client-to-client 는 필요할 때만 켠다. 켜면 클라이언트끼리 서버 방화벽을 거치지 않고 통신한다.openvpn --config /etc/openvpn/server/server.conf --mode server --verb 1 --test-crypto 2>&1 | tail -3
systemctl enable --now openvpn-server@server
systemctl status openvpn-server@server
tail -20 /var/log/openvpn/openvpn.log
# Initialization Sequence Completed
firewall-cmd --permanent --add-service=openvpn # 1194/udp
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
firewall-cmd --list-all
trusted 존에 tun0 를 넣으면 VPN 에서 들어오는 트래픽이 서버와 내부망으로 포워딩된다. 내부망 쪽 라우터가 10.8.0.0/24 의 경로를 모르면 masquerade 가 그것을 서버 IP 로 바꿔 주므로 별도 라우팅이 필요 없다.
인증서 · 키 · ta.key 를 하나의 .ovpn 에 인라인으로 넣어 배포한다.
cd /etc/openvpn/easy-rsa
cat > /root/client1.ovpn <<EOF
client
dev tun
proto udp4
remote vpn.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
verb 3
<ca>
$(cat pki/ca.crt)
</ca>
<cert>
$(openssl x509 -in pki/issued/client1.crt)
</cert>
<key>
$(cat pki/private/client1.key)
</key>
<tls-crypt>
$(cat /etc/openvpn/server/ta.key)
</tls-crypt>
EOF
chmod 600 /root/client1.ovpn
Windows 는 OpenVPN GUI 또는 OpenVPN Connect, Linux 는 openvpn --config client1.ovpn 또는 NetworkManager 로 가져온다.
서버에서.
cat /var/log/openvpn/openvpn-status.log
ip addr show tun0
클라이언트에서.
ip route | grep 10.8.0 # 터널 경로
ping 10.8.0.1 # 서버 터널 IP
ping 192.168.0.1 # 내부망 게이트웨이
핸드셰이크는 되는데 내부망 ping 이 안 되면 IP 포워딩 · masquerade · 내부망 리턴 경로 순으로 본다.
cd /etc/openvpn/easy-rsa
./easyrsa revoke client1
./easyrsa gen-crl
cp pki/crl.pem /etc/openvpn/server/crl.pem
# crl-verify 는 접속 때마다 파일을 다시 읽으므로 재시작이 필요 없다
최신 버전 2.7.7 — 2026-09-20 확인. https://openvpn.net/community-downloads/ · https://github.com/OpenVPN/openvpn/releases/latest ↩︎
Fedora Packages — openvpn: epel9 2.5.11, epel10 2.7.7. 2026-09-20 확인. https://packages.fedoraproject.org/pkgs/openvpn/openvpn/ ↩︎
Easy-RSA 최신 3.2.7 — 2026-09-20 확인. https://github.com/OpenVPN/easy-rsa/releases/latest · Quick start https://github.com/OpenVPN/easy-rsa/blob/master/README.quickstart.md ↩︎
OpenVPN Changes.rst (release/2.7) — data-ciphers · 압축 제거 · dh none · topology subnet. 2026-09-20 확인. https://raw.githubusercontent.com/OpenVPN/openvpn/release/2.7/Changes.rst · Hardening guide https://openvpn.net/community-docs/hardening-openvpn-security.html ↩︎