
자신만의 OpenVPN 서버를 Debian, Ubuntu, Fedora, CentOS, Arch Linux 등에서 설정하세요
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]
## 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
이 가이드는 설치 및 클라이언트 관리를 안내합니다.
홈 디렉토리에는 `.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
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
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
스크립팅을 위한 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
}
]
}
./openvpn-install.sh server renew
./openvpn-install.sh uninstall
연결된 클라이언트 표시 (데이터는 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
./openvpn-install.sh install --port 443 --protocol tcp
./openvpn-install.sh install --dns quad9
./openvpn-install.sh install --cipher AES-256-GCM --cert-type rsa --rsa-bits 4096
./openvpn-install.sh install --subnet-ipv4 10.9.0.0
./openvpn-install.sh install --client-ipv4 --client-ipv6
./openvpn-install.sh install --no-client-ipv4 --client-ipv6
./openvpn-install.sh install --endpoint-type 6 --endpoint 2001:db8::1
./openvpn-install.sh install --client-ipv6 --subnet-ipv6 fd00🔢5678::
./openvpn-install.sh install --no-client
./openvpn-install.sh install
--port 443
--protocol tcp
--dns cloudflare
--cipher AES-256-GCM
--client mydevice
--client-cert-days 365
**네트워크 옵션:**
- `--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
**스크립팅을 위한 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의 스크립트를 사용하는 것이 좋습니다.
더 많은 Q&A는 FAQ.md에서 확인하세요.
Q: 어떤 제공업체를 추천하나요?
A: 다음을 추천합니다:
Q: 어떤 OpenVPN 클라이언트를 추천하나요?
A: 가능하다면 공식 OpenVPN 2.4 클라이언트를 사용하세요.
openvpn 패키지. Debian/Ubuntu 기반 배포판을 위한 공식 APT 저장소가 있습니다.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과 같은 오래된 기본값과 함께 제공되었습니다. 이후의 각 주요 릴리스는 상당한 개선을 가져왔습니다:
--peer-fingerprint, DCO 커널 가속아래 언급된 옵션에 대한 자세한 정보는 OpenVPN 매뉴얼을 참조하세요. 매우 완벽합니다.
인증서 및 PKI 관리는 Easy-RSA에서 처리합니다. 기본 매개변수는 vars.example 파일에 있습니다.
이 스크립트는 한때 LZ4 및 LZO 압축 알고리즘을 지원했지만, VORACLE 공격 취약점으로 인해 그 사용을 권장하지 않았습니다.
OpenVPN 2.6+는 --allow-compression의 기본값을 no로 설정하여 서버에서 푸시된 압축까지 차단합니다. 이제 OpenVPN이 압축 지원을 완전히 제거함에 따라 이 스크립트는 더 이상 압축을 지원하지 않습니다.
[!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_SHA384TLS_AES_128_GCM_SHA256TLS_CHACHA20_POLY1305_SHA256TLS 1.2는 OpenVPN 2.3.3부터 지원됩니다. TLS 1.3은 OpenVPN 2.5부터 지원됩니다.
OpenVPN은 기본적으로 2048비트 키가 있는 RSA 인증서를 사용합니다.
OpenVPN 2.4는 ECDSA 지원을 추가했습니다. 타원 곡선 암호화는 더 빠르고 가벼우며 더 안전합니다.
이 스크립트는 다음을 제공합니다:
prime256v1/secp384r1/secp521r1 곡선2048/3072/4096비트 키기본값은 prime256v1을 사용하는 ECDSA입니다.
OpenVPN은 기본적으로 SHA-256을 서명 해시로 사용하며, 스크립트도 마찬가지입니다. 현재로서는 다른 선택지를 제공하지 않습니다.
스크립트는 두 가지 인증 모드를 지원합니다:
전통적인 인증 기관(CA) 기반 인증. 서버와 모든 클라이언트는 동일한 CA가 서명한 인증서를 가집니다. 클라이언트 취소는 인증서 폐기 목록(CRL)을 통해 처리됩니다.
이 모드는 다음이 필요한 대규모 배포에 권장됩니다:
CA 체인 대신 SHA256 인증서 지문을 사용하는 간소화된 WireGuard 스타일 인증 모델. 각 피어(서버 및 클라이언트)는 자체 서명된 인증서를 가지며, 피어는 지문을 확인하여 서로 인증합니다.```bash
./openvpn-install.sh install --auth-mode fingerprint
장점:
- 간편한 설정: 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
--tls-groups로 이를 사용자 정의할 수 있습니다.
OpenVPN 위키의 --auth 관련 설명:
데이터 채널 패킷과 (활성화된 경우) tls-auth 제어 채널 패킷을 HMAC을 사용하여 인증하며, 메시지 다이제스트 알고리즘 alg을 사용합니다. (기본값은 SHA1입니다.) HMAC은 데이터 문자열, 보안 해시 알고리즘 및 키를 사용하여 디지털 서명을 생성하는 널리 사용되는 메시지 인증 알고리즘(MAC)입니다.
AEAD 암호 모드(예: GCM)를 선택하면 데이터 채널에 대해 지정된 --auth 알고리즘이 무시되고 대신 AEAD 암호의 인증 방법이 사용됩니다. 단, alg는 tls-auth에 사용되는 다이제스트를 계속 지정합니다.
스크립트는 다음 선택지를 제공합니다:
SHA256SHA384SHA512기본값은 SHA256입니다.
tls-auth, tls-crypt, tls-crypt-v2OpenVPN 위키의 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)는 데이터 채널 암호화/복호화를 커널 공간에 유지하여 각 패킷에 대한 사용자 공간과 커널 공간 간의 비용이 많이 드는 컨텍스트 전환을 없앰으로써 OpenVPN 성능을 크게 향상시키는 커널 가속 기능입니다.
DCO는 리눅스 커널 6.16 (2025년 4월)에 병합되었습니다.
요구 사항:
ovpn-dco 커널 모듈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 라이선스 하에 있습니다.