Skip to content

nas-tool/openvpn-install

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

openvpn-install

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

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

这是什么?

此脚本旨在在你自己的服务器上运行,无论是 VPS、专用服务器,甚至是家里的计算机。

设置完成后,你将能够为要连接的每个设备生成客户端配置文件。

每个客户端都能够通过服务器路由其互联网流量,完全加密。

graph LR
  A[手机] -->|加密| VPN
  B[笔记本电脑] -->|加密| VPN
  C[计算机] -->|加密| VPN

  VPN[OpenVPN 服务器]

  VPN --> I[互联网]
Loading

使用方法

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

curl -O https://raw.githubusercontent.com/nas-tool/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh

然后运行它:

./openvpn-install.sh

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

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

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

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

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

无人值守安装

也可以无人值守地运行脚本,即不等待用户输入,以自动化方式运行。

示例用法:

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 规则
  • 可自定义的加密设置,增强的默认设置(请参见下面的安全性和加密
  • OpenVPN 2.4 功能,主要是加密改进(请参见下面的安全性和加密
  • 推送给客户端的各种 DNS 解析器
  • 选择使用 Unbound 的自托管解析器(支持已存在的 Unbound 安装)
  • TCP 和 UDP 之间的选择
  • NAT IPv6 支持
  • 默认禁用压缩以防止 VORACLE。否则可使用 LZ4(v1/v2)和 LZ0 算法。
  • 非特权模式:以 nobody/nogroup 身份运行
  • 在 Windows 10 上阻止 DNS 泄漏
  • 随机化服务器证书名称
  • 选择使用密码保护客户端(私钥加密)
  • 许多其他小功能!

兼容性

脚本支持这些 Linux 发行版:

支持
AlmaLinux 8
Amazon Linux 2
Amazon Linux >= 2023.6
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

常见问题解答


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

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


问: 使用你的脚本我能免受 NSA 的监视吗?

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


问: 有 OpenVPN 文档吗?

答: 有的,请查看 OpenVPN 手册,其中引用了所有选项。


更多问答请参见 FAQ.md

公有云一站式解决方案

基于此脚本一次性配置即用 OpenVPN 服务器的解决方案可用于:

贡献

讨论更改

如果你想讨论更改,特别是如果是大的更改,请在提交 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 攻击 利用了它。

TLS 版本

OpenVPN 默认接受 TLS 1.0,这已经有近 20 年历史

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

自 OpenVPN 2.3.3 起支持 TLS 1.2。

证书

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 位密钥与 AES 没有任何真正的理由。(来源: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"的功能:可协商加密参数。这意味着你可以像 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 摘要算法

来自 OpenVPN wiki,关于 --auth

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

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

脚本提供以下选择:

  • SHA256
  • SHA384
  • SHA512

默认为 SHA256

tls-authtls-crypt

来自 OpenVPN wiki,关于 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

致谢和许可证

非常感谢原作者提供的此脚本

Star 历史

Star History Chart

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages