버전 기준: OPNsense 26.1.x "Witty Woodpecker" (Community Edition)
대상 시나리오: Road Warrior (OPNsense = 서버, 외부 클라이언트 = .ovpn 프로파일 사용)
전제 조건: CA · Server Certificate · Server Private Key 가 이미System ▸ Trust에 등록되어 있음
복구 과정에서 OpenVPN 서버 인스턴스가 소실된 것으로 보이는 상황에서, 기존 클라이언트가 계속 사용 중인 .ovpn 파일(변경 금지)에 1:1 매칭되도록 서버 측 구성을 재현한다. OPNsense 23.7 이후 도입된 Instances UI는 OpenVPN 업스트림 옵션 명명을 그대로 따르며, Legacy Servers/Clients 메뉴 대비 장기 유지보수성이 더 좋다.
.ovpn 파라미터 → OPNsense 필드 매핑.ovpn 지시어 |
값 (기존) | OPNsense (VPN ▸ OpenVPN ▸ Instances) 필드 |
비고 |
|---|---|---|---|
dev tun |
tun | Device type | tun 선택 |
client / (서버 측은 server) |
— | Role | Server 선택 |
remote <host> 61194 udp4 |
vpn.host.net 61194 udp4 |
Protocol / Port number | UDP (IPv4) + 61194 |
| (암시: 외부 바인딩) | — | Bind address | 공란(=모든 IP) 또는 WAN IP |
data-ciphers-fallback AES-256-GCM |
AES-256-GCM | Data ciphers fallback | AES-256-GCM |
| (NCP 자동협상) | — | Data ciphers | AES-256-GCM, CHACHA20-POLY1305 권장 |
auth SHA256 |
SHA256 | Auth digest | SHA256 |
remote-cert-tls server |
활성 | (서버 측 대응 조치) | 서버 인증서 타입이 Server Certificate 이어야 함 — 이미 그렇게 등록됨 확인 |
verify-x509-name "..." subject |
C=KR, ST=Seoul, L=Seoul, O=www.host.net, emailAddress=$EMAIL, CN=www.host.net |
(서버 측 대응 조치) | 서버 인증서의 Subject 가 .ovpn 이 기대하는 문자열과 완전히 일치해야 함 (§5 참조) |
auth-user-pass |
활성 | Authentication | Local Database (또는 RADIUS 등) 선택 |
<tls-crypt>...</tls-crypt> |
(정적키 본문) | TLS static key | Static Keys에 tls-crypt 모드로 동일 키 등록 |
compress stub |
stub | Compression | Stub (frame only) — §6 주의 참고 |
persist-tun, persist-key |
활성 | — | 인스턴스 기본값에 포함됨 |
resolv-retry infinite / lport 0 |
활성 | — | 클라이언트 전용, 서버에는 불필요 |
민감정보 안내: 원본 인증서 Subject 에 이메일 주소가 포함되어 있으나, 본 문서에서는
verify-x509-name문자열은 클라이언트 측.ovpn에만 존재하므로 서버에서는 변경/노출할 필요가 없다.
Lobby ▸ Dashboard → Firmware Status 가 26.1.x 인지 확인 (낮을 경우 System ▸ Firmware ▸ Updates 에서 패치)System ▸ Trust ▸ Authorities : 기존 CA 존재 확인System ▸ Trust ▸ Certificates : Server Certificate(Type=Server Certificate) 존재 확인.ovpn 의 verify-x509-name 와 자, 띄어쓰기, 순서까지 완전히 일치하는지 확인 (§5)System ▸ Configuration ▸ Backups ▸ Download configuration — 복구 실패 시 되돌릴 수 있는 최신 스냅샷 확보System ▸ Configuration ▸ Backups 하단 Backups 목록에 OpenVPN 섹션이 살아 있는 과거 config 가 있다면, 해당 백업을 로컬 파일로 다운로드 후 <openvpn> 섹션만 참조용으로 활용 가능 (전체 복원은 비권장).vpn.host.net-tls-crypttls-crypt (※ auth 아님).ovpn 의 <tls-crypt>...</tls-crypt> 블록 내부 내용(아래 형식)을 그대로 붙여넣기-----BEGIN OpenVPN Static key V1-----
(...32 lines of hex...)
-----END OpenVPN Static key V1-----
#) 포함 여부는 무관하다. 파싱은 BEGIN/END 블록만 읽는다.| Property | Value |
|---|---|
| Role | Server |
| Enabled | ✓ |
| Description | vpn.host.net-server (임의) |
| Protocol | UDP (IPv4) |
| Port number | 61194 |
| Bind address | (공란 = 모든 인터페이스) 또는 WAN IP |
| Device type | tun |
| Topology | subnet (권장, 기본값) |
| Server (IPv4) | 기존 사용 터널 서브넷 (예: 10.8.0.0/24) — 기존 클라이언트 라우팅과 충돌 없게 동일 값 사용 |
| Certificate | 이미 등록된 Server Certificate 선택 |
| TLS static key | §4.1 에서 만든 vpn.host.net-tls-crypt 선택 |
| Authentication | Local Database (기본) — 필요 시 RADIUS/LDAP 서버로 교체 |
| Strict User/CN Matching | ✓ (단일 공용 인증서 공유 시 체크 해제) |
| Username as Common Name | 정책에 따라 결정 (CN 검증을 공통 인증서로 대체하고 싶다면 체크) |
| Data ciphers | AES-256-GCM, CHACHA20-POLY1305 (복수 선택) |
| Data ciphers fallback | AES-256-GCM |
| Auth digest | SHA256 |
| Compression | Stub (frame only) — 컨트롤 채널만, 실압축 없음 |
| Local network(s) | VPN 클라이언트에게 라우팅 푸시할 내부망 (예: 192.168.10.0/24) |
| Redirect gateway | 필요 없으면 공란. 전체 트래픽을 VPN으로 보내야 하면 IPv4 체크 + Outbound NAT 규칙 추가 |
| Keepalive interval / timeout | 10 / 60 기본값 유지 |
Save → 목록 상단 Apply 버튼 클릭.
다음 경우에 권장:
Interfaces ▸ Assignments 이동 → ovpns1 (또는 신규 tun_ovpns...) 포트가 목록에 나타남OVPNS_RW 입력 → + → Saveauth-user-pass 가 지정되어 있으므로 OpenVPN 접속 시 인증서 + 사용자/비밀번호 이중 확인이 이루어진다.
System ▸ Access ▸ Users → +WAN 수신 허용:
Firewall ▸ Rules ▸ WAN → +
| Property | Value |
|---|---|
| Action | Pass |
| Interface | WAN |
| Protocol | UDP |
| Source | any (또는 알려진 지역 제한) |
| Destination | WAN address |
| Destination port range | 61194 – 61194 |
| Description | Allow OpenVPN UDP 61194 |
OpenVPN 터널 트래픽 허용:
Firewall ▸ Rules ▸ OpenVPN → +
| Property | Value |
|---|---|
| Action | Pass |
| Interface | OpenVPN |
| Protocol | any |
| Source | any (또는 터널 서브넷) |
| Destination | LAN net (또는 필요한 서브넷) |
| Description | Allow tunnel to LAN |
§4.3 에서 인터페이스를 별도 할당했다면,
Firewall ▸ Rules ▸ OVPNS_RW탭에 동일 규칙을 두는 것이 더 명시적이다.
verify-x509-name)클라이언트 .ovpn 은 서버 인증서의 Subject 문자열을 정확히 문자 단위로 검증한다. 복구 과정에서 인증서를 재발급했다면, 새 Subject 가 기존 .ovpn 의 verify-x509-name 와 완전 일치해야 한다. 확인 방법:
System ▸ Diagnostics ▸ Command Prompt)openssl x509 -in /path/to/server.crt -noout -subject -nameopt RFC2253,-esc_msb
.ovpn 의 verify-x509-name "..." subject 문자열과 대조불일치 시 선택지:
.ovpn 의 verify-x509-name 라인을 새 CN 에 맞게 수정 (클라이언트 재배포 필요 → "기존 설정 유지" 조건과 상충)compress 옵션이 취약점(VORACLE) 문제로 deprecation 대상이다. 그러나 compress stub (=프레이밍만, 실압축 없음) 은 안전한 형태이며, 기존 .ovpn 유지를 위해 서버도 반드시 동일 설정을 해야 한다.auth-nocache, replay-window, explicit-exit-notify 사용자 지정값)은 Instances UI에 노출되지 않는 케이스가 있다. 해당 옵션이 필요한 경우 Advanced mode 의 Additional options 필드(존재 시)에 원문 라인 추가. 26.1 에서도 이 영역은 계속 확장되는 중이므로, 최신 docs.opnsense.org 를 재확인할 것.duplicate-cn 허용이 필요할 수 있다.Interfaces ▸ [WAN] ▸ Block private networks 해제 필요(운영망에서는 유지 권장).VPN ▸ OpenVPN ▸ Connection Status → 인스턴스가 Running 상태여야 함System ▸ Log Files ▸ General 또는 VPN ▸ OpenVPN ▸ Log File 에서 기동 에러 확인sockstat -4 -l | grep 61194
openvpn 이 *:61194 로 바인딩되어 있어야 함.ovpn 파일로 외부 단말에서 접속 → Connection Status 에 세션 노출 확인 → 바이트 카운터 증가 확인| 증상 | 우선 점검 항목 |
|---|---|
| 클라이언트 timeout | WAN 방화벽 규칙(§4.5), ISP NAT/포트포워딩, WAN 실제 공인 IP 확인 |
TLS Error: TLS handshake failed |
tls-crypt 키 불일치 여부 확인(키 본문 단 1자라도 다르면 실패) |
VERIFY ERROR: ... verify-x509-name |
§5 — Subject 문자열 완전 일치 여부 재확인 |
AUTH_FAILED |
System ▸ Access ▸ Users 비번 또는 사용자-인증서 링크 확인 |
cipher negotiation failed |
Instances Data ciphers 목록에 AES-256-GCM 포함 여부 확인 |
| LAN 도달 불가(인증 OK) | Firewall ▸ Rules ▸ OpenVPN 터널 통과 규칙, LAN 측 라우팅 존재 여부 |
| 간헐적 끊김 | keepalive 값, ISP 의 UDP 세션 타임아웃 확인 |
System ▸ Configuration ▸ Backups ▸ Restore configuration 에서 복원System ▸ Reboot (일부 변경은 재부팅 후 반영)