Giter VIP home page Giter VIP logo

openvpn's Introduction

openvpn-install

测试 代码检查 说声谢谢!

适用于 Debian、Ubuntu、Fedora、CentOS、Arch Linux、Oracle Linux、Rocky Linux 和 AlmaLinux 的 OpenVPN 安装脚本。

此脚本将让你在几秒钟内设置自己的安全 VPN 服务器。

你也可以看看 wireguard-install,它是一个简单的安装程序,用于更简单、更安全、更快速和更现代的 VPN 协议。

使用方法

首先,获取脚本并使其可执行:

curl -O https://github.com/yhdxtn/master/openvpn-install.sh
chmod +x openvpn-install.sh

然后运行它:

./openvpn-install.sh

你需要以 root 用户身份运行该脚本,并启用 TUN 模块。

第一次运行时,你需要按照助手的指引并回答几个问题来设置你的 VPN 服务器。

安装 OpenVPN 后,你可以再次运行该脚本,你将有以下选择:

  • 添加客户端
  • 删除客户端
  • 卸载 OpenVPN

在你的主目录中,你将拥有 .ovpn 文件。这些是客户端配置文件。将它们从服务器下载并使用你喜欢的 OpenVPN 客户端连接。

如果你有任何问题,请先查看 FAQ。请在打开问题之前阅读所有内容。

请不要给我发送电子邮件或私人消息请求帮助。 唯一可以获得帮助的地方是问题区。其他人可能会提供帮助,将来也可能会遇到与你相同的问题。我的时间不是免费提供给你的,你并不特别。

无人值守安装

也可以在无人值守的情况下运行脚本,例如在自动化的方式下,无需等待用户输入。

示例用法:

AUTO_INSTALL=y ./openvpn-install.sh

# 或者

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 脚本将新用户 foo 添加到现有的 OpenVPN 配置中

#!/bin/bash
export MENU_OPTION="1"
export CLIENT="foo"
export PASS="1"
./openvpn-install.sh

功能

  • 安装并配置即用型 OpenVPN 服务器
  • 以无缝方式管理 iptables 规则和转发
  • 如有需要,脚本可以清理移除 OpenVPN,包括配置和 iptables 规则
  • 可定制的加密设置,增强的默认设置(见下文 Security and Encryption
  • OpenVPN 2.4 功能,主要是加密改进(见下文 Security and Encryption
  • 推送给客户端的各种 DNS 解析器
  • 选择使用自托管解析器(支持已存在的 Unbound 安装)
  • 在 TCP 和 UDP 之间选择
  • 支持 NATed IPv6
  • 默认禁用压缩以防止 VORACLE。提供 LZ4(v1/v2)和 LZO 算法
  • 非特权模式:以 nobody/nogroup 运行
  • 阻止 Windows 10 上的 DNS 泄漏
  • 随机化服务器证书名称
  • 选择使用密码保护客户端(私钥加密)
  • 许多其他小功能!

兼容性

该脚本支持这些 Linux 发行版:

支持情况
AlmaLinux 8
Amazon Linux 2
Arch Linux
CentOS 7 ✅ 🤖
CentOS Stream >= 8 ✅ 🤖
Debian >= 10 ✅ 🤖
Fedora >= 35 ✅ 🤖
Oracle Linux 8
Rocky Linux 8
Ubuntu >= 18.04 ✅ 🤖

需要注意:

  • 该脚本定期针对标有 🤖 的发行版进行测试。
    • 仅在 amd64 架构上进行测试。
  • 应该可以在较旧版本(如 Debian 8+、Ubuntu 16.04+ 和之前的 Fedora 版本)上运行。但上表中未列出的版本不在官方支持范围内。
    • 也应该支持 LTS 版本之间的版本,但这些版本未经过测试。
  • 该脚本需要 systemd

分支

该脚本基于 Nyr 和其贡献者 的出色工作。

自 2016 年以来,这两个脚本已发生分歧,尤其是在底层方面。该脚本的主要目标是增强安全性。但从那时起,该脚本已被完全重写,并增加了许多功能。不过该脚本仅兼容最新的发行版,因此如果你需要使用非常旧的服务器或客户端,建议使用 Nyr 的脚本。

常见问题解答

更多问答请见 FAQ.md

问: 你推荐哪个服务提供商?

答: 我推荐以下这些:

  • Vultr:全球各地,支持 IPv6,起价 5 美元/月
  • Hetzner:德国、芬兰和美国。支持 IPv6,每月 4.5 欧元起,20 TB 流量
  • Digital Ocean:全球各地,支持 IPv6,起价 4 美元/月

问: 你推荐哪个 OpenVPN 客户端?

答: 如果可能,推荐使用官方 OpenVPN 2.4 客户端。


问: 使用你的脚本我能避开 NSA 的监视吗?

答: 请审查你的威胁模型。即使这个脚本考虑到了安全性并使用了最先进的加密技术,如果你想躲避 NSA 的监视,你不应该使用 VPN。


问: 是否有 OpenVPN 文档?

答: 是的,请访问 OpenVPN 手册,其中参考了所有选项。


更多问答请见 [FAQ.md

](FAQ.md)。

一站式公有云解决方案

基于此脚本提供即用型 OpenVPN 服务器的解决方案可用于:

贡献

讨论变更

如果你想讨论变更,尤其是大的变更,请在提交 PR 之前打开一个问题。

代码格式化

我们使用 shellcheckshfmt 来执行 bash 样式指南和良好实践。它们通过 GitHub Actions 对每个提交/PR 进行执行,因此你可以在 这里 检查配置。

安全性和加密

警告 这还没有针对 OpenVPN 2.5 及以后版本更新。

OpenVPN 的默认设置在加密方面相当弱。此脚本旨在改进这一点。

OpenVPN 2.4 是在加密方面的重大更新。它增加了对 ECDSA、ECDH、AES GCM、NCP 和 tls-crypt 的支持。

如果你想了解下文提到的选项的更多信息,请访问 OpenVPN 手册。它非常完整。

大多数与 OpenVPN 加密相关的内容由 Easy-RSA 管理。默认参数在 vars.example 文件中。

压缩

默认情况下,OpenVPN 不启用压缩。此脚本提供对 LZO 和 LZ4(v1/v2)算法的支持,后者更高效。

然而,不建议使用压缩,因为 VORACLE 攻击 利用它。

TLS 版本

OpenVPN 默认接受 TLS 1.0,这个版本几乎有 20 年的历史

通过 tls-version-min 1.2 我们强制使用 TLS 1.2,这是当前 OpenVPN 可用的最佳协议。

TLS 1.2 自 OpenVPN 2.3.3 起支持。

证书

OpenVPN 默认使用 2048 位密钥的 RSA 证书。

OpenVPN 2.4 增加了对 ECDSA 的支持。椭圆曲线密码学更快、更轻、更安全。

此脚本提供:

  • ECDSA:prime256v1/secp384r1/secp521r1 曲线
  • RSA:2048/3072/4096 位密钥

默认为 prime256v1 的 ECDSA。

OpenVPN 默认使用 SHA-256 作为签名哈希,脚本也是如此。目前不提供其他选择。

数据通道

默认情况下,OpenVPN 使用 BF-CBC 作为数据通道密码。Blowfish 是一种古老(1993 年)且弱的算法。即使是官方 OpenVPN 文档也承认这一点。

默认是 BF-CBC,代表块密码链接模式下的 Blowfish。

不再推荐使用 BF-CBC,因为它的块大小为 64 位。由于块大小较小,可以进行基于碰撞的攻击,如 SWEET32 所示。详情请参阅 https://community.openvpn.net/openvpn/wiki/SWEET32。 INRIA 的安全研究人员发表了一项关于 64 位块密码(如 3DES 和 Blowfish)的攻击。他们展示了如何在经常发送相同数据时恢复明文,并展示了如何利用跨站脚本漏洞经常发送感兴趣的数据。这适用于 HTTPS,也适用于 HTTP-over-OpenVPN。详情请参阅 https://sweet32.info/

OpenVPN 的默认密码 BF-CBC 受此攻击影响。

确实,AES 是当今的标准。它是当前可用的最快和最安全的密码。SEEDCamellia 目前没有被攻破,但比 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%,没有任何实际理由使用 256 位密钥而不是 128 位密钥(来源:12)。此外,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”的功能:Negotiable Crypto Parameters。这意味着你可以像 HTTPS 一样提供密码套件。默认设置为 AES-256-GCM:AES-128-GCM,并在与 OpenVPN 2.4 客户端一起使用时覆盖 --cipher 参数。为了简化起见,脚本将 --cipher--ncp-cipher 设置为上述选择的密码。

控制通道

OpenVPN 2.4 默认将协商最佳可用密码(例如 ECDHE+AES-256-GCM)

脚本根据证书提供以下选项:

  • ECDSA:
    • TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
    • TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
  • RSA:
    • TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
    • TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384

默认为 TLS-ECDHE-*-WITH-AES-128-GCM-SHA256

Diffie-Hellman 密钥交换

OpenVPN 默认使用 2048 位 DH 密钥。

OpenVPN 2.4 增加了对 ECDH 密钥的支持。椭圆曲线密码学更快、更轻、更安全。

此外,生成经典的 DH 密钥可能需要很长时间。ECDH 密钥是临时的:它们是即时生成的。

脚本提供以下选项:

  • ECDH:prime256v1/secp384r1/secp521r1 曲线
  • DH:2048/3072/4096 位密钥

默认为 prime256v1

HMAC 摘要算法

关于 --auth,来自 OpenVPN 维基:

使用 HMAC 通过消息摘要算法 alg 认证数据通道包和(如果启用)tls-auth 控制通道包。(默认是 SHA1)。HMAC 是一种常用的消息认证算法(MAC),它使用数据字符串、安全哈希算法和密钥来生成数字签名。

如果选择 AEAD 密码模式(例如 GCM),则指定的 --auth 算法将被忽略用于数据通道,而使用 AEAD 密码的认证方法。请注意,alg 仍然指定用于 tls-auth 的摘要。

脚本提供以下选择:

  • SHA256
  • SHA384
  • SHA512

默认使用 SHA256

tls-authtls-crypt

关于 tls-auth,来自 OpenVPN 维基:

在 TLS 控制通道之上添加额外的 HMAC 认证层,以减轻 DoS 攻击和对 TLS 栈的攻击。

简而言之,--tls-auth 在 OpenVPN 的 TCP/UDP 端口上启用了一种“HMAC 防火墙”,其中 TLS 控制通道包带有错误的 HMAC 签名可以立即被丢弃而不响应。

关于 tls-crypt

使用 keyfile 中的密钥加密和

认证所有控制通道包。(有关更多背景,请参阅 --tls-auth。)

加密(和认证)控制通道包:

  • 通过隐藏用于 TLS 连接的证书提供更多隐私,
  • 使识别 OpenVPN 流量更加困难,
  • 提供“穷人的”后量子安全性,针对永远不知道预共享密钥的攻击者(即无前向保密性)。

因此,两者都提供了额外的安全层,并减轻了 DoS 攻击。默认情况下,OpenVPN 不使用它们。

tls-crypt 是 OpenVPN 2.4 的功能,除了认证外还提供加密(不像 tls-auth)。它更隐私友好。

脚本支持两者,默认使用 tls-crypt

说声谢谢

如果你愿意,可以 说声谢谢

版权及许可证

非常感谢 贡献者 和 Nyr 的原创工作。

此项目采用 MIT 许可证

openvpn's People

Contributors

yhdxtn avatar zhaoshi2000 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.