Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
openvpn-install — 자신만의 OpenVPN 서버를 Debian, Ubuntu, Fedora, CentOS, Arch Linux 등에서 설정하세요 | Kitploit
도구/GitHubGitHub/angristan/openvpn-install
Encryption/Decryption ToolsScripting & AutomationNetwork SecurityPrivacy
GitHubangristan/openvpn-install

openvpn-install

자신만의 OpenVPN 서버를 Debian, Ubuntu, Fedora, CentOS, Arch Linux 등에서 설정하세요

저장소 보기
16.1k3.3k521개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

openvpn-install

Say Thanks!

Debian, Ubuntu, Fedora, openSUSE, CentOS, Amazon Linux, Arch Linux, Oracle Linux, Rocky Linux 및 AlmaLinux용 OpenVPN 설치 프로그램입니다.

이 스크립트를 사용하면 몇 초 만에 자신만의 안전한 VPN 서버를 설정하고 관리할 수 있습니다.

이게 무엇인가요?

이 스크립트는 VPS, 전용 서버, 또는 집에 있는 컴퓨터 등 자신의 서버에서 실행하도록 설계되었습니다.

설정이 완료되면 연결하려는 모든 기기에 대한 클라이언트 구성 파일을 생성할 수 있습니다.

각 클라이언트는 완전히 암호화된 상태로 서버를 통해 인터넷 트래픽을 라우팅할 수 있습니다.```mermaid graph LR A[Phone] -->|Encrypted| VPN B[Laptop] -->|Encrypted| VPN C[Computer] -->|Encrypted| VPN

VPN[OpenVPN Server]

VPN --> I[Internet]

root@kitploit:~
## OpenVPN을 사용하는 이유?

이 스크립트가 생성될 당시 OpenVPN은 오픈소스 VPN의 사실상 표준이었습니다. WireGuard는 나중에 나왔으며 대부분의 사용 사례에서 더 간단하고 빠릅니다. [wireguard-install](https://github.com/angristan/wireguard-install)을 확인하세요.

그러나 OpenVPN은 다음과 같은 경우에 여전히 유효합니다:

- **TCP 지원**: UDP가 차단된 제한적인 환경(회사 네트워크, 공항, 호텔 등)에서 작동
- **비밀번호로 보호된 개인 키**: WireGuard 구성은 개인 키를 평문으로 저장
- **레거시 호환성**: 구형 시스템을 포함한 거의 모든 플랫폼에 클라이언트 존재

## Features

- 사용 가능한 OpenVPN 서버를 설치하고 구성합니다
- 자동화 및 스크립팅을 위한 CLI 인터페이스 (JSON 출력을 지원하는 비대화형 모드)
- 클라이언트 및 서버 인증서 갱신
- 연결된 클라이언트 목록 및 모니터링
- 인증서 폐기 시 즉시 클라이언트 연결 해제 (관리 인터페이스를 통해)
- 가능하면 최신 안정 릴리스를 위해 [공식 OpenVPN 저장소](https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos) 사용
- 방화벽 규칙 및 포워딩을 원활하게 관리 (네이티브 firewalld 및 nftables 지원, iptables 폴백)
- VPN 서브넷 구성 가능 (IPv4: 기본 `10.8.0.0/24`, IPv6: 기본 `fd42:42:42:42::/112`)
- 터널 MTU 구성 가능 (기본값: `1500`)
- 필요한 경우 스크립트가 구성 및 방화벽 규칙을 포함한 OpenVPN을 깔끔하게 제거
- 암호화 설정 사용자 정의 가능, 향상된 기본 설정 (아래 [보안 및 암호화](#security-and-encryption) 참조)
- 가능한 경우 최신 OpenVPN 기능 사용 (아래 [보안 및 암호화](#security-and-encryption) 참조)
- 클라이언트에 푸시할 다양한 DNS 리졸버
- Unbound를 사용한 자체 호스팅 리졸버 선택 가능 (기존 Unbound 설치 지원)
- TCP와 UDP 중 선택
- 유연한 IPv4/IPv6 지원:
  - IPv4 또는 IPv6 서버 엔드포인트 (클라이언트 연결 방식)
  - IPv4 전용, IPv6 전용 또는 듀얼 스택 클라이언트 (VPN 주소 지정 및 인터넷 액세스)
  - 모든 조합 지원: 4→4, 4→4/6, 4→6, 6→4, 6→6, 6→4/6
  - 자동 누출 방지: 단일 스택 모드에서 원하지 않는 프로토콜 차단
- 권한 없는 모드: `nobody`/`nogroup`으로 실행
- Windows 10에서 DNS 누출 차단
- 무작위 서버 인증서 이름
- 비밀번호로 클라이언트 보호 선택 가능 (개인 키 암호화)
- 여러 장치가 동시에 동일한 클라이언트 프로필을 사용할 수 있는 옵션 (고정 IP 주소 비활성화)
- **피어 지문 인증** (OpenVPN 2.6+): CA 없이 간소화된 WireGuard 스타일 인증
- 기타 여러 작은 기능들!

## Compatibility

이 스크립트는 다음 Linux 배포판을 지원합니다:

|                     | 지원 |
| ------------------- | ------- |
| AlmaLinux >= 8      | ✅ 🤖   |
| Amazon Linux 2023   | ✅ 🤖   |
| Arch Linux          | ✅ 🤖   |
| CentOS Stream >= 8  | ✅ 🤖   |
| Debian >= 11        | ✅ 🤖   |
| Fedora >= 40        | ✅ 🤖   |
| openSUSE Leap >= 16 | ✅ 🤖   |
| openSUSE Tumbleweed | ✅ 🤖   |
| Oracle Linux >= 8   | ✅ 🤖   |
| Rocky Linux >= 8    | ✅ 🤖   |
| Ubuntu >= 18.04     | ✅ 🤖   |

참고 사항:

- 스크립트는 🤖로 표시된 배포판에서만 정기적으로 테스트됩니다.
  - `amd64` 아키텍처에서만 테스트되었습니다.
- 스크립트는 `systemd`를 필요로 합니다.

### Recommended providers

- [Vultr](https://umami.stanislas.cloud/q/1HH9Thp8i): 전 세계 위치, IPv6 지원, 월 \$2.5부터
- [Hetzner](https://umami.stanislas.cloud/q/HdzaOJWq7): 전 세계 위치, IPv6, 20TB 트래픽, 월 €3.59부터
- [Digital Ocean](https://umami.stanislas.cloud/q/sEVh1l79B): 전 세계 위치, IPv6 지원, 월 \$4부터

## Usage

먼저 서버에서 스크립트를 다운로드하고 실행 가능하게 만드세요:```bash
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh

스크립트를 루트로 실행하고 TUN 모듈이 활성화되어 있어야 합니다.

대화형 모드

시작하는 가장 쉬운 방법은 대화형 메뉴입니다:```bash ./openvpn-install.sh interactive

root@kitploit:~
이 가이드는 설치 및 클라이언트 관리를 안내합니다.

홈 디렉토리에는 `.ovpn` 파일이 있습니다. 이 파일들은 클라이언트 구성 파일입니다. 서버에서 (예: `scp`를 사용하여) 다운로드한 후 선호하는 OpenVPN 클라이언트를 사용하여 연결하세요.

질문이 있으시면 먼저 [FAQ](#faq)를 확인하세요. 도움이 필요하면 [토론](https://github.com/angristan/openvpn-install/discussions)을 열 수 있습니다. 기존 이슈 및 토론을 먼저 검색해 주세요.

### CLI 모드

> [!WARNING]
> API 호환성은 보장되지 않습니다. 버전 간에 호환되지 않는 변경이 발생할 수 있습니다. 이 스크립트를 프로그래밍 방식(예: 자동화 또는 CI/CD)으로 사용하는 경우 master 브랜치 대신 특정 커밋에 고정하세요.

자동화 및 스크립팅을 위해 CLI 인터페이스를 사용하세요:```bash
# Install with defaults
./openvpn-install.sh install

# Add a client
./openvpn-install.sh client add alice

# List clients
./openvpn-install.sh client list

# Revoke a client (immediately disconnects if connected)
./openvpn-install.sh client revoke alice

명령어```text

openvpn-install [options]

Commands: install Install and configure OpenVPN server uninstall Remove OpenVPN server client Manage client certificates server Server management interactive Launch interactive menu

Global Options: --verbose Show detailed output --log Log file path (default: openvpn-install.log) --no-log Disable file logging --no-color Disable colored output -h, --help Show help

root@kitploit:~
Run `./openvpn-install.sh <command> --help`를 실행하여 명령별 옵션을 확인하세요.

#### 클라이언트 관리```bash
# Add a new client
./openvpn-install.sh client add alice

# Add a password-protected client
./openvpn-install.sh client add bob --password

# Revoke a client
./openvpn-install.sh client revoke alice

# Renew a client certificate
./openvpn-install.sh client renew bob --cert-days 365

모든 클라이언트 나열:```text $ ./openvpn-install.sh client list ══ Client Certificates ══ [INFO] Found 3 client certificate(s)

Name Status Expiry Remaining


alice Valid 2035-01-15 3650 days bob Valid 2035-01-15 3650 days charlie Revoked 2035-01-15 unknown

root@kitploit:~
스크립팅을 위한 JSON 출력:```text
$ ./openvpn-install.sh client list --format json | jq
{
  "clients": [
    {
      "name": "alice",
      "status": "valid",
      "expiry": "2035-01-15",
      "days_remaining": 3650
    },
    {
      "name": "bob",
      "status": "valid",
      "expiry": "2035-01-15",
      "days_remaining": 3650
    },
    {
      "name": "charlie",
      "status": "revoked",
      "expiry": "2035-01-15",
      "days_remaining": null
    }
  ]
}

서버 관리```bash

Renew server certificate

./openvpn-install.sh server renew

Uninstall OpenVPN

./openvpn-install.sh uninstall

root@kitploit:~
연결된 클라이언트 표시 (데이터는 60초마다 새로고침됩니다):```text
$ ./openvpn-install.sh server status
══ Connected Clients ══
[INFO] Found 2 connected client(s)

   Name    Real Address          VPN IP      Connected Since   Transfer
   ----    ------------          ------      ---------------   --------
   alice   203.0.113.45:52341    10.8.0.2    2025-01-15 14:32  ↓1.2M ↑500K
   bob     198.51.100.22:41892   10.8.0.3    2025-01-15 09:15  ↓800K ↑200K

[INFO] Note: Data refreshes every 60 seconds.

설치 옵션

install 명령어는 다양한 사용자 지정 옵션을 지원합니다:```bash

Custom port and protocol

./openvpn-install.sh install --port 443 --protocol tcp

Custom DNS provider

./openvpn-install.sh install --dns quad9

Custom encryption settings

./openvpn-install.sh install --cipher AES-256-GCM --cert-type rsa --rsa-bits 4096

Custom VPN subnet

./openvpn-install.sh install --subnet-ipv4 10.9.0.0

Enable dual-stack (IPv4 + IPv6) for clients

./openvpn-install.sh install --client-ipv4 --client-ipv6

IPv6-only clients (no IPv4)

./openvpn-install.sh install --no-client-ipv4 --client-ipv6

IPv6 endpoint (server listens on IPv6, clients connect via IPv6)

./openvpn-install.sh install --endpoint-type 6 --endpoint 2001:db8::1

Custom IPv6 subnet for dual-stack setup

./openvpn-install.sh install --client-ipv6 --subnet-ipv6 fd00🔢5678::

Skip initial client creation

./openvpn-install.sh install --no-client

Full example with multiple options

./openvpn-install.sh install
--port 443
--protocol tcp
--dns cloudflare
--cipher AES-256-GCM
--client mydevice
--client-cert-days 365

root@kitploit:~
**네트워크 옵션:**

- `--endpoint <host>` - 클라이언트용 공개 IP 또는 호스트명 (기본값: 자동 감지)
- `--endpoint-type <4|6>` - 엔드포인트 IP 버전 (기본값: `4`)
- `--ip <addr>` - 서버 수신 IP (기본값: 자동 감지)
- `--client-ipv4` - VPN 클라이언트에 IPv4 활성화 (기본값: 활성화)
- `--no-client-ipv4` - VPN 클라이언트에 IPv4 비활성화
- `--client-ipv6` - VPN 클라이언트에 IPv6 활성화 (기본값: 비활성화)
- `--no-client-ipv6` - VPN 클라이언트에 IPv6 비활성화
- `--subnet-ipv4 <x.x.x.0>` - IPv4 VPN 서브넷 (기본값: `10.8.0.0`)
- `--subnet-ipv6 <prefix>` - IPv6 VPN 서브넷 (기본값: `fd42:42:42:42::`)
- `--port <num>` - OpenVPN 포트 (기본값: `1194`)
- `--port-random` - 무작위 포트 사용 (49152-65535)
- `--protocol <udp|tcp>` - 프로토콜 (기본값: `udp`)
- `--mtu <size>` - 터널 MTU (기본값: `1500`)

**DNS 옵션:**

- `--dns <provider>` - DNS 제공자 (기본값: `cloudflare`). 옵션: `system`, `unbound`, `cloudflare`, `quad9`, `quad9-uncensored`, `fdn`, `dnswatch`, `opendns`, `google`, `yandex`, `adguard`, `nextdns`, `custom`
- `--dns-primary <ip>` - 사용자 지정 기본 DNS (`--dns custom` 필요)
- `--dns-secondary <ip>` - 사용자 지정 보조 DNS (`--dns custom` 필요)

**보안 옵션:**

- `--cipher <cipher>` - 데이터 암호 (기본값: `AES-128-GCM`). 옵션: `AES-128-GCM`, `AES-192-GCM`, `AES-256-GCM`, `AES-128-CBC`, `AES-192-CBC`, `AES-256-CBC`, `CHACHA20-POLY1305`
- `--cert-type <ecdsa|rsa>` - 인증서 유형 (기본값: `ecdsa`)
- `--cert-curve <curve>` - ECDSA 곡선 (기본값: `prime256v1`). 옵션: `prime256v1`, `secp384r1`, `secp521r1`
- `--rsa-bits <2048|3072|4096>` - RSA 키 크기 (기본값: `2048`)
- `--hmac <alg>` - HMAC 알고리즘 (기본값: `SHA256`). 옵션: `SHA256`, `SHA384`, `SHA512`
- `--tls-sig <mode>` - TLS 모드 (기본값: `crypt-v2`). 옵션: `crypt-v2`, `crypt`, `auth`
- `--auth-mode <mode>` - 인증 모드 (기본값: `pki`). 옵션: `pki` (CA 기반), `fingerprint` (피어 지문, OpenVPN 2.6+ 필요)
- `--tls-version-min <1.2|1.3>` - 최소 TLS 버전 (기본값: `1.2`)
- `--tls-ciphersuites <list>` - TLS 1.3 암호 제품군, 콜론으로 구분 (기본값: `TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256`)
- `--tls-groups <list>` - 키 교환 그룹, 콜론으로 구분 (기본값: `X25519:prime256v1:secp384r1:secp521r1`)
- `--server-cert-days <n>` - 서버 인증서 유효 기간 (일) (기본값: `3650`)

**클라이언트 옵션:**

- `--client <name>` - 초기 클라이언트 이름 (기본값: `client`)
- `--client-password [pass]` - 클라이언트 키를 암호로 보호 (기본값: 암호 없음)
- `--client-cert-days <n>` - 클라이언트 인증서 유효 기간 (일) (기본값: `3650`)
- `--no-client` - 초기 클라이언트 생성 건너뛰기

**기타 옵션:**

- `--multi-client` - 동일 인증서를 여러 장치에서 허용 (기본값: 비활성화)

#### 자동화 예시

**일괄 클라이언트 생성:**```bash
#!/bin/bash
for user in alice bob charlie; do
  ./openvpn-install.sh client add "$user"
done

파일에서 클라이언트 생성하기:```bash #!/bin/bash while read -r user; do ./openvpn-install.sh client add "$user" done < users.txt

root@kitploit:~
**스크립팅을 위한 JSON 출력:**```bash
# Get client list as JSON
./openvpn-install.sh client list --format json | jq '.clients[] | select(.status == "valid")'

# Get connected clients as JSON
./openvpn-install.sh server status --format json

포크

이 스크립트는 Nyr와 그 기여자의 훌륭한 작업을 기반으로 합니다.

2016년 이후로 두 스크립트는 달라져서, 특히 내부적으로는 더 이상 비슷하지 않습니다. 이 스크립트의 주요 목표는 향상된 보안이었습니다. 그러나 그 이후로 스크립트는 완전히 다시 작성되었고 많은 기능이 추가되었습니다. 하지만 이 스크립트는 최신 배포판에서만 호환되므로, 매우 오래된 서버나 클라이언트를 사용해야 하는 경우 Nyr의 스크립트를 사용하는 것이 좋습니다.

FAQ

더 많은 Q&A는 FAQ.md에서 확인하세요.

Q: 어떤 제공업체를 추천하나요?

A: 다음을 추천합니다:

  • Vultr: 전 세계 위치, IPv6 지원, 월 $2.5부터
  • Hetzner: 전 세계 위치, IPv6, 20TB 트래픽, 월 €3.59부터
  • Digital Ocean: 전 세계 위치, IPv6 지원, 월 $4부터

Q: 어떤 OpenVPN 클라이언트를 추천하나요?

A: 가능하다면 공식 OpenVPN 2.4 클라이언트를 사용하세요.

  • Windows: 공식 OpenVPN 커뮤니티 클라이언트.
  • Linux: 배포판의 openvpn 패키지. Debian/Ubuntu 기반 배포판을 위한 공식 APT 저장소가 있습니다.
  • macOS: Tunnelblick, Viscosity, OpenVPN for Mac.
  • Android: OpenVPN for Android.
  • iOS: 공식 OpenVPN Connect 클라이언트.

Q: 이 스크립트를 사용하면 NSA로부터 안전한가요?

A: 위협 모델을 검토하세요. 이 스크립트가 보안을 염두에 두고 최신 암호화를 사용하더라도, NSA로부터 숨으려면 VPN을 사용해서는 안 됩니다.


Q: OpenVPN 문서가 있나요?

A: 네, 모든 옵션을 참조하는 OpenVPN 매뉴얼을 확인하세요.


더 많은 Q&A는 FAQ.md에서 확인하세요.

기여

변경 사항 논의

PR을 제출하기 전에 변경 사항, 특히 큰 변경 사항을 논의하려면 이슈를 열어주세요.

보안 및 암호화

[!NOTE] 이 스크립트는 OpenVPN의 기본값이 상당히 취약했던 2016년에 만들어졌습니다. 그 당시에는 안전한 설정을 위해 암호화 설정을 사용자 지정하는 것이 필수적이었습니다. 그 이후 OpenVPN의 기본값이 크게 개선되었지만, 스크립트는 여전히 사용자 지정 옵션을 제공합니다.

OpenVPN 2.3 및 그 이전 버전은 Blowfish(BF-CBC), TLS 1.0, SHA1과 같은 오래된 기본값과 함께 제공되었습니다. 이후의 각 주요 릴리스는 상당한 개선을 가져왔습니다:

  • OpenVPN 2.4 (2016): ECDSA, ECDH, AES-GCM, NCP(암호 협상), tls-crypt 추가
  • OpenVPN 2.5 (2020): 기본 암호가 BF-CBC에서 AES-256-GCM:AES-128-GCM으로 변경, ChaCha20-Poly1305, tls-crypt-v2, TLS 1.3 지원 추가
  • OpenVPN 2.6 (2023): TLS 1.2 최소 기본값, 압축 기본 차단, PKI 없는 설정을 위한 --peer-fingerprint, DCO 커널 가속

아래 언급된 옵션에 대한 자세한 정보는 OpenVPN 매뉴얼을 참조하세요. 매우 완벽합니다.

인증서 및 PKI 관리는 Easy-RSA에서 처리합니다. 기본 매개변수는 vars.example 파일에 있습니다.

압축

이 스크립트는 한때 LZ4 및 LZO 압축 알고리즘을 지원했지만, VORACLE 공격 취약점으로 인해 그 사용을 권장하지 않았습니다.

OpenVPN 2.6+는 --allow-compression의 기본값을 no로 설정하여 서버에서 푸시된 압축까지 차단합니다. 이제 OpenVPN이 압축 지원을 완전히 제거함에 따라 이 스크립트는 더 이상 압축을 지원하지 않습니다.

TLS 버전

[!NOTE] OpenVPN 2.6+는 TLS 1.2를 최소 기본값으로 사용합니다. 이전 버전은 기본적으로 TLS 1.0을 허용했습니다.

OpenVPN 2.5 및 이전 버전은 기본적으로 TLS 1.0을 허용했으며, 이는 거의 20년이 된 버전입니다.

이 스크립트는 모든 OpenVPN 2.4+ 클라이언트와의 호환성을 위해 tls-version-min 1.2를 기본값으로 사용합니다. 모든 클라이언트가 TLS 1.3을 지원하는 환경에서는 선택적으로 tls-version-min 1.3을 설정할 수 있습니다.

TLS 1.3 지원은 OpenVPN 2.5에서 추가되었으며 OpenSSL 1.1.1+가 필요합니다. TLS 1.3은 단순화된 핸드셰이크로 향상된 보안과 성능을 제공합니다.

스크립트는 --tls-ciphersuites를 통해 TLS 1.3 암호 제품군을 구성합니다 (TLS 1.2의 --tls-cipher 옵션과 별개). 기본 TLS 1.3 암호 제품군은 다음과 같습니다:

  • TLS_AES_256_GCM_SHA384
  • TLS_AES_128_GCM_SHA256
  • TLS_CHACHA20_POLY1305_SHA256

TLS 1.2는 OpenVPN 2.3.3부터 지원됩니다. TLS 1.3은 OpenVPN 2.5부터 지원됩니다.

인증서

OpenVPN은 기본적으로 2048비트 키가 있는 RSA 인증서를 사용합니다.

OpenVPN 2.4는 ECDSA 지원을 추가했습니다. 타원 곡선 암호화는 더 빠르고 가벼우며 더 안전합니다.

이 스크립트는 다음을 제공합니다:

  • ECDSA: prime256v1/secp384r1/secp521r1 곡선
  • RSA: 2048/3072/4096비트 키

기본값은 prime256v1을 사용하는 ECDSA입니다.

OpenVPN은 기본적으로 SHA-256을 서명 해시로 사용하며, 스크립트도 마찬가지입니다. 현재로서는 다른 선택지를 제공하지 않습니다.

인증 모드

스크립트는 두 가지 인증 모드를 지원합니다:

PKI 모드 (기본값)

전통적인 인증 기관(CA) 기반 인증. 서버와 모든 클라이언트는 동일한 CA가 서명한 인증서를 가집니다. 클라이언트 취소는 인증서 폐기 목록(CRL)을 통해 처리됩니다.

이 모드는 다음이 필요한 대규모 배포에 권장됩니다:

  • 중앙 집중식 인증서 관리
  • 표준 CRL 기반 취소
  • 모든 OpenVPN 버전과의 호환성

피어 지문 모드 (OpenVPN 2.6+)

CA 체인 대신 SHA256 인증서 지문을 사용하는 간소화된 WireGuard 스타일 인증 모델. 각 피어(서버 및 클라이언트)는 자체 서명된 인증서를 가지며, 피어는 지문을 확인하여 서로 인증합니다.```bash

Install with fingerprint mode

./openvpn-install.sh install --auth-mode fingerprint

root@kitploit:~
장점:

- 간편한 설정: CA 인프라가 필요 없음
- 이해하기 쉬움: SSH의 `known_hosts` 모델과 유사
- 소규모 설정에 이상적: 홈 네트워크, 연구실, 소규모 팀

작동 방식:

1. 서버가 자체 서명 인증서를 생성하고 지문을 저장
2. 각 클라이언트가 자체 서명 인증서 생성
3. 클라이언트 지문이 서버의 `<peer-fingerprint>` 블록에 추가됨
4. 클라이언트가 서버 지문을 사용하여 서버 확인
5. 해지 시 서버 구성에서 지문 제거 (CRL 불필요)

트레이드오프: 클라이언트 해지 시 OpenVPN을 다시 로드해야 함 (지문이 server.conf에 있음). PKI 모드에서는 새 연결 시 CRL 파일이 자동으로 다시 읽힘.

### 데이터 채널

> [!NOTE]
> 기본 데이터 채널 암호는 OpenVPN 2.5에서 변경되었습니다. 이전 버전은 `BF-CBC`가 기본값이었으나, OpenVPN 2.5 이상에서는 `AES-256-GCM:AES-128-GCM`이 기본값입니다. OpenVPN 2.6 이상에서는 가능한 경우 `CHACHA20-POLY1305`도 기본 암호 목록에 포함됩니다.

기본적으로 OpenVPN 2.4 이하에서는 데이터 채널 암호로 `BF-CBC`를 사용했습니다. Blowfish는 오래된(1993) 취약한 알고리즘입니다. 공식 OpenVPN 문서도 이를 인정합니다.

> 기본값은 BF-CBC로, Cipher Block Chaining 모드의 Blowfish를 의미합니다.
>
> BF-CBC는 64비트 블록 크기 때문에 더 이상 권장되지 않습니다. 이 작은 블록 크기는 SWEET32에서 입증된 것처럼 충돌 기반 공격을 가능하게 합니다. 자세한 내용은 <https://community.openvpn.net/openvpn/wiki/SWEET32>를 참조하세요.
> INRIA의 보안 연구자들은 3DES 및 Blowfish와 같은 64비트 블록 암호에 대한 공격을 발표했습니다. 동일한 데이터가 충분히 자주 전송될 때 평문을 복구할 수 있으며, 크로스 사이트 스크립팅 취약점을 활용하여 관심 있는 데이터를 충분히 자주 전송할 수 있음을 보여주었습니다. 이는 HTTPS뿐만 아니라 HTTP-over-OpenVPN에서도 작동합니다. 더 자세한 설명은 <https://sweet32.info/>를 참조하세요.
>
> OpenVPN의 기본 암호인 BF-CBC는 이 공격의 영향을 받습니다.

실제로 AES는 오늘날의 표준입니다. 현재 사용 가능한 가장 빠르고 안전한 암호입니다. [SEED](https://en.wikipedia.org/wiki/SEED)와 [Camellia](https://github.com/angristan/openvpn-install/blob/master/%3Chttps%3A/en.wikipedia.org/wiki/Camellia_%28cipher)>)는 현재까지 취약점이 발견되지 않았지만 AES보다 느리고 상대적으로 신뢰도가 낮습니다.

> 현재 지원되는 암호 중 OpenVPN은 AES-256-CBC 또는 AES-128-CBC 사용을 권장합니다. OpenVPN 2.4 이상에서는 GCM도 지원합니다. 2.4 이상에서는 AES-256-GCM 또는 AES-128-GCM 사용을 권장합니다.

AES-256은 AES-128보다 40% 느리며, AES에서 128비트 키 대신 256비트 키를 사용해야 할 실질적인 이유는 없습니다. (출처: [1](http://security.stackexchange.com/questions/14068/why-most-people-use-256-bit-encryption-instead-of-128-bit), [2](http://security.stackexchange.com/questions/6141/amount-of-simple-operations-that-is-safely-out-of-reach-for-all-humanity/6149#6149)). 또한 AES-256은 [타이밍 공격](https://en.wikipedia.org/wiki/Timing_attack)에 더 취약합니다.

AES-GCM은 [AEAD 암호](https://en.wikipedia.org/wiki/Authenticated_encryption)로, 데이터에 대해 기밀성, 무결성, 인증을 동시에 제공합니다.

ChaCha20-Poly1305는 AES-GCM과 유사한 보안을 제공하는 또 다른 AEAD 암호입니다. 하드웨어 AES 가속(AES-NI)이 없는 장치(예: 구형 CPU 및 많은 ARM 기반 장치)에서 특히 유용하며, AES보다 훨씬 빠를 수 있습니다.

스크립트는 다음 암호를 지원합니다:

- `AES-128-GCM`
- `AES-192-GCM`
- `AES-256-GCM`
- `AES-128-CBC`
- `AES-192-CBC`
- `AES-256-CBC`
- `CHACHA20-POLY1305` (OpenVPN 2.5+ 필요)

그리고 기본값은 `AES-128-GCM`입니다.

OpenVPN 2.4는 "NCP"(_Negotiable Crypto Parameters_)라는 기능을 추가했습니다. 즉, HTTPS처럼 암호 스위트를 제공할 수 있습니다. 기본적으로 `AES-256-GCM:AES-128-GCM`으로 설정되며, OpenVPN 2.4 클라이언트와 함께 사용하면 `--cipher` 매개변수를 재정의합니다. 단순화를 위해 스크립트는 위에서 선택한 암호로 `--cipher`(NCP가 아닌 클라이언트용 대체), `--data-ciphers`(최신 OpenVPN 2.5+ 명명법), `--ncp-ciphers`(OpenVPN 2.4 호환성을 위한 레거시 별칭)를 설정합니다.

### 제어 채널

OpenVPN 2.4는 기본적으로 최상의 암호를 협상합니다(예: ECDHE+AES-256-GCM).

#### TLS 1.2 암호 (`--tls-cipher`)

스크립트는 인증서에 따라 다음 옵션을 제안합니다:

- ECDSA:
  - `TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256`
  - `TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384`
  - `TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256` (OpenVPN 2.5+ 필요)
- RSA:
  - `TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256`
  - `TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384`
  - `TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256` (OpenVPN 2.5+ 필요)

기본값은 `TLS-ECDHE-*-WITH-AES-128-GCM-SHA256`입니다.

#### TLS 1.3 암호 (`--tls-ciphersuites`)

TLS 1.3이 협상되면 별도의 암호 스위트 세트가 사용됩니다. 이는 `--tls-ciphersuites`를 통해 구성되며 OpenSSL 명명 규칙을 사용합니다:

- `TLS_AES_256_GCM_SHA384`
- `TLS_AES_128_GCM_SHA256`
- `TLS_CHACHA20_POLY1305_SHA256`

기본적으로 세 암호 스위트 모두 활성화됩니다. TLS 1.3 암호 스위트는 키 교환 알고리즘(키 공유를 통해 별도로 협상됨)을 포함하지 않기 때문에 더 간단합니다.

### 키 교환

OpenVPN은 역사적으로 키 교환을 위해 2048비트 DH 매개변수를 기본으로 사용했습니다. 이 스크립트는 예전에 DH(구성 가능한 키 크기 포함)와 ECDH를 대안으로 제공했습니다.

OpenVPN 2.4는 ECDH 지원을 추가했으며, OpenVPN 2.7은 유한체 DH가 더 이상 사용되지 않음에 따라 `dh none`(ECDH)을 기본값으로 만들었습니다. ECDH가 이제 보편적으로 지원되고 선호되므로, 이 스크립트는 더 이상 기존 DH를 제공하지 않습니다.

스크립트는 `tls-groups`를 다음 선호 목록으로 구성합니다:```
X25519:prime256v1:secp384r1:secp521r1
  • X25519: 빠르고 현대적인 곡선(Curve25519), 널리 지원됨
  • prime256v1: NIST P-256, 가장 호환성 좋음
  • secp384r1: NIST P-384, 더 높은 보안
  • secp521r1: NIST P-521, 최고 보안

--tls-groups로 이를 사용자 정의할 수 있습니다.

HMAC 다이제스트 알고리즘

OpenVPN 위키의 --auth 관련 설명:

데이터 채널 패킷과 (활성화된 경우) tls-auth 제어 채널 패킷을 HMAC을 사용하여 인증하며, 메시지 다이제스트 알고리즘 alg을 사용합니다. (기본값은 SHA1입니다.) HMAC은 데이터 문자열, 보안 해시 알고리즘 및 키를 사용하여 디지털 서명을 생성하는 널리 사용되는 메시지 인증 알고리즘(MAC)입니다.

AEAD 암호 모드(예: GCM)를 선택하면 데이터 채널에 대해 지정된 --auth 알고리즘이 무시되고 대신 AEAD 암호의 인증 방법이 사용됩니다. 단, alg는 tls-auth에 사용되는 다이제스트를 계속 지정합니다.

스크립트는 다음 선택지를 제공합니다:

  • SHA256
  • SHA384
  • SHA512

기본값은 SHA256입니다.

tls-auth, tls-crypt, tls-crypt-v2

OpenVPN 위키의 tls-auth 관련 설명:

TLS 제어 채널 위에 HMAC 인증의 추가 계층을 추가하여 DoS 공격 및 TLS 스택 공격을 완화합니다.

간단히 말해, --tls-auth는 OpenVPN의 TCP/UDP 포트에 일종의 "HMAC 방화벽"을 활성화하여 잘못된 HMAC 서명이 있는 TLS 제어 채널 패킷을 응답 없이 즉시 폐기할 수 있습니다.

tls-crypt 관련 설명:

keyfile의 키로 모든 제어 채널 패킷을 암호화하고 인증합니다. (자세한 배경은 --tls-auth를 참조하십시오.)

제어 채널 패킷 암호화(및 인증):

  • TLS 연결에 사용되는 인증서를 숨겨 더 많은 프라이버시 제공
  • OpenVPN 트래픽 식별을 더 어렵게 함
  • 사전 공유 키를 절대 알지 못할 공격자에 대한 "가난한 사람의" 양자 이후 보안 제공 (즉, 순방향 비밀성 없음)

따라서 둘 다 추가 보안 계층을 제공하고 DoS 공격을 완화합니다. OpenVPN에서 기본적으로 사용되지는 않습니다.

tls-crypt는 OpenVPN 2.4 기능으로, 인증 외에도 암호화를 제공합니다(tls-auth와 달리). 더 프라이버시 친화적입니다.

tls-crypt-v2는 OpenVPN 2.5 기능으로, 공유 키 대신 클라이언트별 키를 사용하여 tls-crypt를 확장합니다. 각 클라이언트는 서버 키에서 파생된 고유 키를 받습니다. 다음을 제공합니다:

  • 더 나은 보안: 클라이언트 키가 유출되어도 다른 클라이언트는 영향을 받지 않음
  • 더 쉬운 키 관리: 서버 키를 재생성하지 않고 각 클라이언트 키를 별도로 폐기 가능
  • 확장성: 많은 클라이언트가 있는 대규모 배포에 더 적합

스크립트는 세 가지 옵션을 모두 지원합니다:

  • tls-crypt-v2 (기본값): 더 나은 보안을 위한 클라이언트별 키
  • tls-crypt: 모든 클라이언트에 공유 키, OpenVPN 2.4+와 호환
  • tls-auth: HMAC 인증만 (암호화 없음), 구버전 클라이언트와 호환

인증서 유형 확인 (remote-cert-tls)

서버는 remote-cert-tls client로 구성되어, 연결하는 피어가 "TLS Web Client Authentication" 확장 키 사용(EKU)이 있는 인증서를 보유하도록 요구합니다. 이는 서버 인증서가 클라이언트를 가장하는 데 사용되는 것을 방지합니다.

마찬가지로, 클라이언트는 remote-cert-tls server로 구성되어 유효한 서버 인증서를 제시하는 서버에만 연결하도록 합니다. 이는 유효한 클라이언트 인증서를 가진 공격자가 가짜 서버를 설정하는 것을 방지합니다.

데이터 채널 오프로드 (DCO)

데이터 채널 오프로드 (DCO)는 데이터 채널 암호화/복호화를 커널 공간에 유지하여 각 패킷에 대한 사용자 공간과 커널 공간 간의 비용이 많이 드는 컨텍스트 전환을 없앰으로써 OpenVPN 성능을 크게 향상시키는 커널 가속 기능입니다.

DCO는 리눅스 커널 6.16 (2025년 4월)에 병합되었습니다.

요구 사항:

  • OpenVPN 2.6.0 이상
  • 리눅스 커널 6.16+ (내장) 또는 ovpn-dco 커널 모듈
  • UDP 프로토콜 (TCP는 미지원)
  • AEAD 암호 (AES-128-GCM, AES-256-GCM 또는 CHACHA20-POLY1305)

스크립트의 기본 설정(AES-128-GCM, UDP)은 DCO와 호환됩니다. DCO를 사용할 수 있고 구성이 호환되면 OpenVPN이 자동으로 이를 사용하여 성능을 향상시킵니다.

참고: 전체 가속을 위해서는 서버와 클라이언트 모두 DCO를 지원해야 합니다. 클라이언트 지원은 OpenVPN 2.6+(Linux, Windows, FreeBSD) 및 OpenVPN Connect 3.4+(Windows)에서 가능합니다. macOS는 현재 DCO를 지원하지 않지만, 클라이언트는 서버 측에서 부분적인 성능 이점을 얻으며 DCO 활성화 서버에 계속 연결할 수 있습니다.

스크립트는 설치 중 DCO 가용성 상태를 표시합니다.

감사 인사

원하신다면 감사 인사를 보내실 수 있습니다!

크레딧 및 라이선스

기여자 여러분과 Nyr의 원작에 깊은 감사를 드립니다.

이 프로젝트는 MIT 라이선스 하에 있습니다.

스타 기록

스타 기록 차트

도구 다운로드