Debian, Ubuntu, Fedora, CentOS, Arch Linux, Oracle Linux, Rocky Linux 및 AlmaLinux용 OpenVPN 설치 프로그램.
이 스크립트를 사용하면 단 몇 초 만에 보안 VPN 서버를 설정할 수 있습니다.
더 간단하고, 더 안전하고, 더 빠르고, 더 현대적인 VPN 프로토콜을 위한 간단한 설치 프로그램인 wireguard-install을 확인해 보세요.
먼저 스크립트를 가져와 실행 가능하게 만듭니다.
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
그런 다음 실행하십시오.
./openvpn-install.sh
루트로 스크립트를 실행하고 TUN 모듈을 활성화해야 합니다.
처음 실행하면 도우미를 따라 VPN 서버를 설정하기 위한 몇 가지 질문에 답해야 합니다.
OpenVPN이 설치되면 스크립트를 다시 실행할 수 있으며 다음을 선택할 수 있습니다.
홈 디렉터리에는 .ovpn
파일이 있습니다. 클라이언트 구성 파일입니다. 서버에서 다운로드하고 즐겨 사용하는 OpenVPN 클라이언트를 사용하여 연결하세요.
질문이 있으시면 먼저 FAQ로 이동하세요. 이슈를 열기 전에 모든 내용을 읽어보시기 바랍니다.
도움을 요청하는 이메일이나 개인 메시지를 보내지 마세요. 도움을 받을 수 있는 유일한 곳은 문제입니다. 다른 사람들이 도움을 줄 수도 있고, 앞으로는 다른 사용자들도 귀하와 같은 문제에 직면할 수도 있습니다. 내 시간은 너에게만 공짜로 주어지는 게 아니다. 너는 특별하지 않다.
예를 들어 사용자 입력을 기다리지 않고 자동화된 방식으로 스크립트를 헤드리스로 실행하는 것도 가능합니다.
사용 예:
AUTO_INSTALL=y ./openvpn-install.sh
# or
export AUTO_INSTALL=y
./openvpn-install.sh
그런 다음 사용자 입력에 대한 필요성을 전달하여 기본 변수 세트가 설정됩니다.
설치를 사용자 정의하려면 위에 표시된 대로 해당 설치를 내보내거나 동일한 줄에 지정할 수 있습니다.
APPROVE_INSTALL=y
APPROVE_IP=y
IPV6_SUPPORT=n
PORT_CHOICE=1
PROTOCOL_CHOICE=1
DNS=1
COMPRESSION_ENABLED=n
CUSTOMIZE_ENC=n
CLIENT=clientname
PASS=1
서버가 NAT 뒤에 있는 경우 ENDPOINT
변수를 사용하여 해당 끝점을 지정할 수 있습니다. 엔드포인트가 뒤에 있는 공용 IP 주소인 경우 ENDPOINT=$(curl -4 ifconfig.co)
사용할 수 있습니다(스크립트는 기본값으로 설정됨). 끝점은 IPv4 또는 도메인일 수 있습니다.
선택에 따라 다른 변수(암호화, 압축)를 설정할 수 있습니다. 스크립트의 installQuestions()
함수에서 검색할 수 있습니다.
Easy-RSA에서는 사용자 입력이 필요하므로 암호로 보호된 클라이언트는 헤드리스 설치 방법에서 지원되지 않습니다.
헤드리스 설치는 Ansible/Terraform/Salt/Chef/Puppet과 같은 상태 제공자에 의해 동일한 매개변수를 사용하여 여러 번 실행해도 안전하다는 점에서 다소 멱등적입니다. Easy-RSA PKI가 아직 없는 경우에만 설치하고 재생성하며, OpenVPN이 아직 설치되지 않은 경우 OpenVPN 및 기타 업스트림 종속성만 설치합니다. 헤드리스 실행 시마다 모든 로컬 구성을 다시 생성하고 클라이언트 파일을 다시 생성합니다.
새로운 사용자 추가를 자동화하는 것도 가능합니다. 여기서 핵심은 스크립트를 호출하기 전에 나머지 필수 변수와 함께 MENU_OPTION
변수의 (문자열) 값을 제공하는 것입니다.
다음 Bash 스크립트는 기존 OpenVPN 구성에 새로운 사용자 foo
추가합니다.
#! /bin/bash
export MENU_OPTION= " 1 "
export CLIENT= " foo "
export PASS= " 1 "
./openvpn-install.sh
nobody
/ nogroup
으로 실행스크립트는 다음 Linux 배포판을 지원합니다.
지원하다 | |
---|---|
알마리눅스 8 | ✅ |
아마존 리눅스 2 | ✅ |
아치 리눅스 | ✅ |
센트OS 7 | ✅ |
CentOS 스트림 >= 8 | ✅ ? |
데비안 >= 10 | ✅ ? |
페도라 >= 35 | ✅ ? |
오라클 리눅스 8 | ✅ |
록키 리눅스 8 | ✅ |
우분투 >= 18.04 | ✅ ? |
참고할 사항:
amd64
아키텍처에서만 테스트되었습니다.systemd
필요합니다. 이 스크립트는 Nyr와 그 기여자들의 훌륭한 작업을 기반으로 합니다.
2016년부터 두 스크립트는 서로 갈라져 더 이상 유사하지 않습니다. 특히 내부적으로는 더욱 그렇습니다. 스크립트의 주요 목표는 보안 강화였습니다. 하지만 그 이후로 스크립트가 완전히 다시 작성되었고 많은 기능이 추가되었습니다. 이 스크립트는 최신 배포판과만 호환되므로 매우 오래된 서버나 클라이언트를 사용해야 하는 경우 Nyr의 스크립트를 사용하는 것이 좋습니다.
FAQ.md에 더 많은 Q&A가 있습니다.
Q: 어느 제공업체를 추천하시나요?
A: 저는 다음을 추천합니다:
Q: 어떤 OpenVPN 클라이언트를 추천하시나요?
A: 가능하다면 공식 OpenVPN 2.4 클라이언트를 사용하세요.
openvpn
패키지. Debian/Ubuntu 기반 배포판을 위한 공식 APT 저장소가 있습니다.Q: 스크립트를 사용하면 NSA로부터 안전합니까?
A: 위협 모델을 검토하십시오. 이 스크립트가 보안을 염두에 두고 최첨단 암호화를 사용하더라도 NSA로부터 숨기려면 VPN을 사용해서는 안 됩니다.
Q: OpenVPN 문서가 있습니까?
A: 예, 모든 옵션을 참조하는 OpenVPN 매뉴얼을 참조하세요.
FAQ.md에 더 많은 Q&A가 있습니다.
이 스크립트를 기반으로 바로 사용할 수 있는 OpenVPN 서버를 한 번에 프로비저닝하는 솔루션은 다음과 같은 경우에 사용할 수 있습니다.
openvpn-terraform-install
에서 Terraform을 사용하는 AWSopenvpn-ephemeral
변경 사항을 논의하고 싶다면, 특히 큰 변경 사항인 경우 PR을 제출하기 전에 이슈를 열어주세요.
우리는 bash 스타일 지침과 모범 사례를 시행하기 위해 shellcheck와 shfmt를 사용합니다. GitHub Actions를 사용하여 각 커밋/PR에 대해 실행되므로 여기에서 구성을 확인할 수 있습니다.
경고 OpenVPN 2.5 이상에서는 업데이트되지 않았습니다.
OpenVPN의 기본 설정은 암호화와 관련하여 매우 약합니다. 이 스크립트는 이를 개선하는 것을 목표로 합니다.
OpenVPN 2.4는 암호화와 관련된 훌륭한 업데이트였습니다. ECDSA, ECDH, AES GCM, NCP 및 tls-crypt에 대한 지원이 추가되었습니다.
아래에 언급된 옵션에 대한 자세한 정보를 원하시면 OpenVPN 매뉴얼을 참조하세요. 매우 완벽합니다.
OpenVPN의 암호화 관련 항목 대부분은 Easy-RSA로 관리됩니다. 기본 매개변수는 vars.example 파일에 있습니다.
기본적으로 OpenVPN은 압축을 활성화하지 않습니다. 이 스크립트는 LZ0 및 LZ4(v1/v2) 알고리즘에 대한 지원을 제공하며 후자가 더 효율적입니다.
그러나 VORACLE 공격에서는 압축을 사용하므로 압축을 사용하지 않는 것이 좋습니다.
OpenVPN은 기본적으로 거의 20년이 된 TLS 1.0을 허용합니다.
tls-version-min 1.2
사용하면 현재 OpenVPN에 사용할 수 있는 최고의 프로토콜인 TLS 1.2가 적용됩니다.
TLS 1.2는 OpenVPN 2.3.3부터 지원됩니다.
OpenVPN은 기본적으로 2048비트 키가 포함된 RSA 인증서를 사용합니다.
OpenVPN 2.4에는 ECDSA에 대한 지원이 추가되었습니다. 타원곡선 암호화는 더 빠르고, 더 가볍고, 더 안전합니다.
이 스크립트는 다음을 제공합니다.
prime256v1
/ secp384r1
/ secp521r1
곡선2048
3072
4096
기본값은 prime256v1
사용하는 ECDSA입니다.
OpenVPN은 기본적으로 SHA-256
서명 해시로 사용하며 스크립트도 마찬가지입니다. 현재로서는 다른 선택의 여지가 없습니다.
기본적으로 OpenVPN은 BF-CBC
데이터 채널 암호로 사용합니다. Blowfish는 오래되고(1993) 약한 알고리즘입니다. 공식 OpenVPN 문서에서도 이를 인정합니다.
기본값은 Cipher Block Chaining 모드에서 Blowfish의 약어인 BF-CBC입니다.
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와 Camellia는 현재까지 취약하지 않지만 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,2). 게다가 AES-256은 타이밍 공격에 더 취약합니다.
AES-GCM은 AEAD 암호로, 데이터에 대한 기밀성, 무결성 및 신뢰성 보장을 동시에 제공합니다.
스크립트는 다음 암호를 지원합니다.
AES-128-GCM
AES-192-GCM
AES-256-GCM
AES-128-CBC
AES-192-CBC
AES-256-CBC
기본값은 AES-128-GCM
입니다.
OpenVPN 2.4에는 "NCP": 협상 가능한 암호화 매개변수 라는 기능이 추가되었습니다. 이는 HTTPS와 같은 암호화 제품군을 제공할 수 있음을 의미합니다. 기본적으로 AES-256-GCM:AES-128-GCM
으로 설정되며 OpenVPN 2.4 클라이언트와 함께 사용될 경우 --cipher
매개변수를 재정의합니다. 단순화를 위해 스크립트는 --cipher
및 --ncp-cipher
위에서 선택한 암호로 설정합니다.
OpenVPN 2.4는 기본적으로 사용 가능한 최상의 암호를 협상합니다(예: ECDHE+AES-256-GCM)
스크립트는 인증서에 따라 다음 옵션을 제안합니다.
TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
기본값은 TLS-ECDHE-*-WITH-AES-128-GCM-SHA256
입니다.
OpenVPN은 기본적으로 2048비트 DH 키를 사용합니다.
OpenVPN 2.4에는 ECDH 키에 대한 지원이 추가되었습니다. 타원곡선 암호화는 더 빠르고, 더 가볍고, 더 안전합니다.
또한 클래식 DH 키를 생성하는 데는 오랜 시간이 걸릴 수 있습니다. ECDH 키는 임시적이며 즉시 생성됩니다.
스크립트는 다음 옵션을 제공합니다.
prime256v1
/ secp384r1
/ secp521r1
곡선2048
3072
4096
기본값은 prime256v1
입니다.
OpenVPN 위키에서 --auth
정보:
메시지 다이제스트 알고리즘 alg를 사용하여 HMAC로 데이터 채널 패킷 및 (활성화된 경우) tls-auth 제어 채널 패킷을 인증합니다. (기본값은 SHA1 입니다). HMAC는 데이터 문자열, 보안 해시 알고리즘 및 키를 사용하여 디지털 서명을 생성하는 일반적으로 사용되는 MAC(메시지 인증 알고리즘)입니다.
AEAD 암호화 모드(예: GCM)를 선택한 경우 데이터 채널에 대해 지정된 --auth 알고리즘이 무시되고 대신 AEAD 암호화의 인증 방법이 사용됩니다. alg는 여전히 tls-auth에 사용되는 다이제스트를 지정합니다.
스크립트는 다음 선택 사항을 제공합니다.
SHA256
SHA384
SHA512
기본값은 SHA256
입니다.
tls-auth
및 tls-crypt
OpenVPN 위키에서 tls-auth
정보:
TLS 제어 채널 위에 추가 HMAC 인증 계층을 추가하여 DoS 공격과 TLS 스택에 대한 공격을 완화합니다.
간단히 말해서, --tls-auth는 OpenVPN의 TCP/UDP 포트에서 일종의 "HMAC 방화벽"을 활성화합니다. 여기서 잘못된 HMAC 서명이 포함된 TLS 제어 채널 패킷은 응답 없이 즉시 삭제될 수 있습니다.
tls-crypt
정보:
키 파일의 키를 사용하여 모든 제어 채널 패킷을 암호화하고 인증합니다. (자세한 내용은 --tls-auth를 참조하세요.)
제어 채널 패킷 암호화(및 인증):
- TLS 연결에 사용되는 인증서를 숨김으로써 더 많은 개인정보 보호를 제공합니다.
- OpenVPN 트래픽을 식별하기가 더 어려워집니다.
- 사전 공유 키를 결코 알지 못하는 공격자에 대해 "가난한 사람의" 포스트 양자 보안을 제공합니다(즉, 순방향 비밀성이 없음).
따라서 둘 다 추가 보안 계층을 제공하고 DoS 공격을 완화합니다. OpenVPN에서는 기본적으로 사용되지 않습니다.
tls-crypt
는 인증 외에 암호화도 제공하는 OpenVPN 2.4 기능입니다( tls-auth
와 다름). 개인 정보 보호에 더 친화적입니다.
스크립트는 두 가지를 모두 지원하며 기본적으로 tls-crypt
사용합니다.
원하시면 감사하다고 말씀하셔도 됩니다!
기여자들과 Nyr의 원본 작업에 많은 감사를 드립니다.
이 프로젝트는 MIT 라이선스를 따릅니다.