기술 가이드

FreeBSD 12.0에서 OpenVPN 서버 설치 및 인증서 기반 설정

6 min read 네트워킹 업데이트됨 17 Oct 2025
FreeBSD 12에서 OpenVPN 설치 및 인증서 기반 설정
FreeBSD 12에서 OpenVPN 설치 및 인증서 기반 설정

TL;DR

이 가이드는 FreeBSD 12.0에서 OpenVPN을 설치하고, easy-rsa로 인증서를 생성하여 인증서 기반 VPN 서버를 구성하는 단계별 절차를 제공합니다. PF 방화벽 설정, 포트 포워딩 활성화, 클라이언트 .ovpn 파일 생성 및 연결 테스트까지 포함합니다. 핵심 명령과 점검 체크리스트, 문제 해결 팁도 함께 제공합니다.


소개

OpenVPN은 공개 인터넷 상에서 안전한 사설 네트워크(VPN)를 구성하는 오픈소스 소프트웨어입니다. OpenSSL을 사용해 암호화를 제공하며 인증 방식으로는 인증서 기반, 사전 공유 키, 사용자명/비밀번호 등을 지원합니다. 이 문서는 FreeBSD 12.0에서 인증서 기반 인증을 사용하는 OpenVPN 서버를 구축하는 방법을 상세히 설명합니다.

중요 용어 한 줄 정의:

  • PKI: 공개 키 기반 구조(Public Key Infrastructure). 인증서 발급·검증 체계.

대상 독자

  • FreeBSD 기반 서버 운영자
  • 네트워크 엔지니어 및 시스템 관리자
  • 자체 VPN 구축을 원하는 개발자

사전 준비

  • FreeBSD 12.0 최신 패치 적용 권장
  • 최소 512MB RAM, 1 CPU 권장(실 운영 환경은 더 높게 권장)
  • root 권한 또는 sudo 사용 가능 계정
  • PF 방화벽 동작 환경(또는 방화벽 구성 가능 권한)

중요: 실제 서비스에서는 2048비트 이상 키, 안전한 패스프레이즈, 최신 TLS 구성, 로그 수집·모니터링을 적용하세요.


수행 개요

  • OpenVPN 설치
  • easy-rsa 변수 설정
  • CA / 서버 / 클라이언트 인증서 생성
  • OpenVPN 서버 설정
  • PF 방화벽 및 NAT 설정
  • FreeBSD에서 포트 포워딩(패킷 전달) 활성화
  • 클라이언트 구성 및 연결 테스트

H2: 단계별 안내

1단계 — OpenVPN 설치

패키지 저장소를 갱신하고 OpenVPN을 설치합니다:

pkg update
pkg install openvpn

설치 완료 후 부팅 시 OpenVPN 서비스 자동 시작과 가상 인터페이스 유형(tun)을 설정합니다:

sysrc openvpn_enable="YES"
sysrc openvpn_if="tun"

이제 OpenVPN이 시스템에 설치되었습니다.

OpenVPN 설치 완료 스크린샷

2단계 — 인증서 변수 설정 (easy-rsa)

easy-rsa 환경을 OpenVPN 구성 폴더로 복사하고 vars 파일을 편집해 기본값을 설정합니다.

mkdir -p /usr/local/etc/openvpn/
cp -R /usr/local/share/easy-rsa /usr/local/etc/openvpn/

cd /usr/local/etc/openvpn/easy-rsa/
vim vars

vars 파일 예시는 다음과 같습니다(환경에 맞게 수정):

set_var EASYRSA             "$PWD"
set_var EASYRSA_PKI         "$EASYRSA/pki"
set_var EASYRSA_DN          "cn_only"
set_var EASYRSA_REQ_COUNTRY "DE"
set_var EASYRSA_REQ_PROVINCE "Frankfurt"
set_var EASYRSA_REQ_CITY    "Frankfurt"
set_var EASYRSA_REQ_ORG     "hakase-labs CERTIFICATE AUTHORITY"
set_var EASYRSA_REQ_EMAIL   "[email protected]"
set_var EASYRSA_REQ_OU      "HAKASE-LABS EASY CA"
set_var EASYRSA_KEY_SIZE    2048
set_var EASYRSA_ALGO        rsa
set_var EASYRSA_CA_EXPIRE   7500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_SUPPORT  "no"
set_var EASYRSA_NS_COMMENT  "HAKASE-LABS CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR     "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF    "$EASYRSA/openssl-1.0.cnf"
set_var EASYRSA_DIGEST      "sha256"

실행 권한을 부여합니다:

chmod +x vars

easy-rsa vars 편집 화면

설명: EASYRSA_KEY_SIZE(키 길이), EASYRSA_CERT_EXPIRE(인증서 유효기간) 등은 보안 정책에 맞게 조정하세요.

3단계 — 인증서 생성

PKI를 초기화하고 CA, 서버, 클라이언트 인증서를 생성·서명합니다.

cd /usr/local/etc/openvpn/easy-rsa/
./easyrsa.real init-pki

CA 생성:

./easyrsa.real build-ca

CA 키에 대한 패스프레이즈를 입력합니다.

서버 인증서 생성 및 서명:

./easyrsa.real gen-req openvpn-bsd nopass
./easyrsa.real sign-req server openvpn-bsd

openssl로 인증서 검증:

openssl verify -CAfile pki/ca.crt pki/issued/openvpn-bsd.crt

클라이언트 인증서 생성 및 서명:

./easyrsa.real gen-req client01 nopass
./easyrsa.real sign-req client client01
openssl verify -CAfile pki/ca.crt pki/issued/client01.crt

DH 파라미터와 CRL 생성:

./easyrsa.real gen-crl
./easyrsa.real gen-dh

생성된 주요 파일을 복사합니다:

mkdir -p /usr/local/etc/openvpn/{server,client}
cp pki/ca.crt /usr/local/etc/openvpn/server/
cp pki/issued/openvpn-bsd.crt /usr/local/etc/openvpn/server/
cp pki/private/openvpn-bsd.key /usr/local/etc/openvpn/server/
cp pki/dh.pem /usr/local/etc/openvpn/server/
cp pki/crl.pem /usr/local/etc/openvpn/server/

cp pki/ca.crt /usr/local/etc/openvpn/client/
cp pki/issued/client01.crt /usr/local/etc/openvpn/client/
cp pki/private/client01.key /usr/local/etc/openvpn/client/

인증서 생성 완료 스크린샷 서버 인증서 서명 화면 클라이언트 인증서 생성 확인

설명: cert/key 파일은 안전한 권한(예: root:wheel, 600)으로 저장하세요.

4단계 — OpenVPN 서버 구성

서버 구성 파일 생성:

cd /usr/local/etc/openvpn/
vim openvpn.conf

예시 구성(환경에 맞게 수정):

# OpenVPN Port, Protocol, and the Tun
port 1194
proto udp
dev tun

# OpenVPN Server Certificate - CA, server key and certificate
ca /usr/local/etc/openvpn/server/ca.crt
cert /usr/local/etc/openvpn/server/openvpn-bsd.crt
key /usr/local/etc/openvpn/server/openvpn-bsd.key

#DH and CRL key
dh /usr/local/etc/openvpn/server/dh.pem
crl-verify /usr/local/etc/openvpn/server/crl.pem

# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.5.5.0 255.255.255.0
push "redirect-gateway def1"

# Using the DNS from https://dns.watch
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"

#Enable multiple clients to connect with the same certificate key
duplicate-cn

# TLS Security
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache

# Other Configuration
keepalive 20 60
explicit-exit-notify 1
persist-key
persist-tun
comp-lzo yes
daemon
user nobody
group nobody

# OpenVPN Log
log-append /var/log/openvpn.log
verb 3

파일을 저장하고 서비스를 시작합니다:

service openvpn start
service openvpn status

OpenVPN이 UDP 1194 포트에서 리스닝 중인지 확인:

sockstat -l4

OpenVPN 프로세스 확인

설명: 운영 환경에서는 TLS 인증에 더 강한 구성(예: tls-auth/tls-crypt, tls-version-min 1.2/1.3 권장)과 로그 수준 조정(verb)을 권장합니다.

5단계 — PF 방화벽 설정

PF 규칙을 추가하여 VPN 트래픽을 허용하고 NAT를 구성합니다. 예시 pf.conf 위치는 /usr/local/etc/pf.conf입니다.

cd /usr/local/etc/
vim pf.conf

pf.conf 주요 내용(환경 변수는 실제 인터페이스명으로 바꿔주세요):

# vpn interface
vpn_if="tun0"
vpn_net = "10.5.5.0/24"

# reassemble all fragmented packets before filtering them
scrub in on $ext_if all fragment reassemble

# route traffic from VPN interface out to the internet
nat on ! $vpn_if from $vpn_net to any -> $ext_ip

# Allow Connection to VPN Server
pass in on $ext_if proto udp from any to ($ext_if) port 1194 keep state

# Pass all connection on the VPN Interface
pass in on $vpn_if from any to any

검사 및 재로드:

service pf check
service pf reload

규칙 확인:

pfctl -sr
pfctl -sn

PF 규칙 확인 화면 pfctl 규칙 출력 예시

설명: ext_if, ext_ip 등의 변수는 실제 WAN 인터페이스명과 공인 IP로 바꿔야 합니다. NAT 규칙을 적용할 때 소스 네트워크를 정확히 지정하세요.

6단계 — 포트 포워딩(패킷 전달) 활성화

다음 sysctl과 rc 설정으로 IPv4/IPv6 전달을 활성화합니다.

vim /etc/sysctl.conf

# 파일에 추가
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

# 적용
sysctl -f /etc/sysctl.conf

# 게이트웨이로 동작하도록 설정
sysrc gateway_enable="YES"

# 재부팅 권장
reboot

sysctl 설정 스크린샷

설명: 재부팅 후 net.inet.ip.forwarding 값이 1인지 확인하세요.

7단계 — 클라이언트 구성 생성

클라이언트 설정 파일(client01.ovpn)을 생성하고 서버 IP와 인증서 파일 경로를 참조합니다.

cd /usr/local/etc/openvpn/client/
vim client01.ovpn

예시 client01.ovpn:

client
dev tun
proto udp

remote xxx.xxx.xxx.xxx 1194

ca ca.crt
cert client01.crt
key client01.key

cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

resolv-retry infinite
compress lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

클라이언트로 CA/CRT/KEY 및 .ovpn 파일을 안전하게 전송합니다(예: scp, SFTP). 권한을 600으로 유지하세요.

클라이언트 설정 파일 스크린샷

8단계 — 연결 테스트

클라이언트에서 OpenVPN에 연결합니다:

openvpn --config client01.ovpn

새 터미널에서 tun 인터페이스 확인:

ifconfig tun0

서버 내부 IP 핑 테스트:

ping -c3 10.5.5.1

인터넷 경로 확인(외부 IP 확인):

curl ipinfo.io

연결 테스트 스크린샷

성공하면 클라이언트가 서버를 통해 인터넷 트래픽을 라우팅합니다.


보안 권장사항 및 운영 팁

  • tls-auth 또는 tls-crypt를 추가하여 TLS 핸드셰이크를 보호하세요.
  • 인증서 폐기를 위해 CRL을 주기적으로 관리하세요.
  • 로그(예: /var/log/openvpn.log)를 중앙화하여 모니터링하세요.
  • 인증서 만료를 자동으로 알리는 스크립트를 도입하세요.
  • 가능한 경우 AES-GCM 계열과 TLS1.2/1.3을 사용하세요.

운영 체크리스트 (롤 기반)

  • 시스템 관리자

    • OpenVPN 및 easy-rsa 패키지 설치 확인
    • openvpn.conf 권한 및 소유권 설정
    • 서비스 자동시작 등록 확인
  • 네트워크 엔지니어

    • PF 규칙 및 NAT 검증(pfctl -sr/-sn)
    • 포워딩(sysctl) 및 gateway_enable 확인
    • 외부 포트(1194 UDP) 접근성 검사
  • 보안 담당자

    • CA 키 오프라인 보관 여부 확인
    • 인증서 유효기간 및 CRL 정책 검토
    • TLS 암호 모음과 키 길이 검토

장애 대응 플레이북 (간단)

  1. 연결 불가 보고 접수
  2. 서버 측 서비스 상태 확인: service openvpn status
  3. 포트 리스닝 확인: sockstat -l4 | grep 1194
  4. PF 규칙 확인: pfctl -sr
  5. 라우팅/포워딩 확인: sysctl net.inet.ip.forwarding
  6. 클라이언트 로그에서 오류(예: TLS key negotiation failed) 수집
  7. 인증서 만료/CRL 확인
  8. 문제 해결 후 변경 기록과 재발 방지 조치 문서화

수락 기준

  • OpenVPN 서비스가 부팅 후 자동 시작되며 UDP 1194 포트에서 수신
  • 클라이언트가 TLS 핸드셰이크 및 인증서 검증에 성공
  • 클라이언트에 10.5.5.0/24 대역의 IP가 할당되고 내부 서버에 ping 가능
  • 인터넷 접속 시 서버 공인 IP가 확인되어 트래픽이 서버를 통해 라우팅됨
  • PF 규칙이 적용되어 NAT가 동작함

점검 및 테스트 케이스(예시)

  • TC1: 서버가 포트 1194에서 수신 중인지 확인(snap: sockstat)
  • TC2: 클라이언트 인증서로 연결 성공(openvpn 로그에 Initialization Sequence Completed)
  • TC3: 클라이언트에서 내부 IP(10.5.5.1) 핑 성공
  • TC4: 외부 IP 확인(curl ipinfo.io)으로 NAT 확인
  • TC5: 인증서 폐기 후 접근 차단(리보크 테스트)

트러블슈팅 팁

  • “TLS key negotiation failed” 오류: 클라이언트/서버 시간 동기화(NTP) 확인, tls-auth/crypt 미스매치 여부 확인
  • 인증서 관련 오류: openssl verify로 CA 경로와 인증서 체인 확인
  • 라우팅 문제: server 지시어로 설정된 서브넷과 PF NAT 규칙의 네트워크가 일치하는지 확인
  • 방화벽 문제: 외부에서 UDP 1194 포트 접근 가능한지(공인 방화벽/클라우드 보안 그룹 포함) 확인

핵심 수치(팩트 박스)

  • 기본 포트: 1194/UDP
  • 서버 내부 네트워크 예시: 10.5.5.0/24
  • 권장 키 길이: 2048 비트(예시), 가능한 경우 3072/4096 검토
  • 사용된 암호: AES-256-CBC, 인증 해시 SHA512
  • CA 유효기간 예시: 7500일, 인증서 유효기간 예시: 365일

간단 의사결정 흐름 (Mermaid)

flowchart TD
  A[클라이언트 연결 시도] --> B{OpenVPN 서버가 실행 중?
  }
  B -- 예 --> C{포트'1194' 열려있음?}
  B -- 아니오 --> D[서비스 시작: service openvpn start]
  C -- 예 --> E{TLS 핸드셰이크 성공?}
  C -- 아니오 --> F[방화벽/NAT 설정 확인]
  E -- 예 --> G[클라이언트에 내부 IP 할당 및 라우팅]
  E -- 아니오 --> H[인증서/시간/암호 모음 확인]
  H --> I[CA 및 클라이언트 인증서 검증]
  F --> J[pfctl, 외부 방화벽, 클라우드 보안 그룹 확인]

배포 템플릿(간단)

  • 서버 준비: FreeBSD 12.0 최신화
  • 패키지 설치: openvpn, easy-rsa
  • PKI 생성: easyrsa init-pki -> build-ca -> gen-req -> sign-req
  • 서버 구성: /usr/local/etc/openvpn/openvpn.conf 작성
  • 방화벽: /usr/local/etc/pf.conf 수정 및 reload
  • 포워딩: /etc/sysctl.conf에 forwarding 설정
  • 클라이언트: .ovpn 파일 및 인증서 전달
  • 테스트: 연결, ping, 외부 IP 확인

FAQ

Q: OpenVPN 포트를 변경하려면 어떻게 하나요? A: 서버(openvpn.conf)와 PF 규칙에서 port 지시자와 포트 번호를 동일하게 변경하세요. 외부 방화벽에서 해당 포트를 허용해야 합니다.

Q: 인증서를 폐기하려면? A: easyrsa 명령으로 CRL을 갱신 후 pki/crl.pem을 서버에 복사하고 OpenVPN을 재시작하세요. 예: ./easyrsa.real gen-crl

Q: 클라이언트가 내부 IP를 받지 못해요. A: server 지시어의 서브넷과 클라이언트 구성의 tun 종류, 그리고 PF 규칙의 vpn_net 값이 일치하는지 확인하세요.


참고 자료

요약

  • 이 가이드는 FreeBSD 12.0에서 OpenVPN 서버를 인증서 기반으로 설치·구성하는 전체 흐름을 제공합니다. 인증서 생성, 서버/클라이언트 구성, PF 방화벽 및 포트 포워딩 설정까지 다룹니다. 운영 시에는 TLS 강화, 인증서 관리, 로그 모니터링을 반드시 병행하세요.
공유하기: X/Twitter Facebook LinkedIn Telegram
저자
편집

유사한 자료

Windows 10 자동 로그인 설정 가이드
Windows

Windows 10 자동 로그인 설정 가이드

Outlook.exe 위치 찾기 — Windows 10/11 빠른 가이드
Windows

Outlook.exe 위치 찾기 — Windows 10/11 빠른 가이드

Windows 8.1 Preview에서 최종 버전으로 업데이트하는 방법
Windows

Windows 8.1 Preview에서 최종 버전으로 업데이트하는 방법

Ubuntu 16.04에 GitLab CE 설치 방법
DevOps

Ubuntu 16.04에 GitLab CE 설치 방법

YouTube Vanced 계속 중단됨 오류 해결 가이드
앱 가이드

YouTube Vanced 계속 중단됨 오류 해결 가이드

BOINC 설치 및 사용 가이드 — 컴퓨팅 기부 시작하기
가이드

BOINC 설치 및 사용 가이드 — 컴퓨팅 기부 시작하기