介绍
虚拟私人网络(https://en.wikipedia.org/wiki/Virtual_private_network)(VPN)允许您穿过不受信任的网络,就像您在私人网络上一样。
当与 HTTPS 连接相结合时,此设置允许您保护无线登录和交易,您可以绕过地理限制和审查,并保护您的位置和未加密的 HTTP 流量免受不受信任的网络的影响。
OpenVPN是一个完整的,开源的Secure Socket Layer(SSL)VPN解决方案,可容纳广泛的配置. 在本教程中,您将在CentOS 7服务器上设置OpenVPN,然后将其配置为从客户端机器上访问。
<$>[注] 注: 如果您打算在DigitalOcean Droplet上设置一个OpenVPN服务器,请注意,像许多托管提供商一样,我们会收取带宽过期费用。
请参阅此页面(https://www.digitalocean.com/docs/accounts/billing/bandwidth/)以获取更多信息。
前提条件
要遵循本教程,您将需要:
- 一台 CentOS 7 服务器具有 sudo 非 root 用户和防火墙,您可以使用我们的 初始服务器设置与 CentOS 7 指南和 新 CentOS 7 服务器的额外推荐步骤来实现。
- 一个解决到您的服务器的域或子域,您可以使用证书。 为了设置,您首先需要 注册域名 然后 通过 DigitalOcean Control Panel 添加 DNS 记录 )。 请注意,仅添加一个记录 A 将满足本教程的要求。 MK1BR 一个客户端机器,您将使用它来连接到您的 OpenVPN 服务器。 对于本教程的目的,建议您
有了这些前提条件,您可以开始在CentOS 7上设置和配置OpenVPN服务器。
步骤 1 – 安装 OpenVPN
首先,我们将在服务器上安装OpenVPN,我们还将安装Easy RSA,一个公共密钥基础设施管理工具,这将有助于我们设置内部证书授权机构(CA)用于使用我们的VPN,我们还将使用Easy RSA来生成我们的SSL密钥对,以确保VPN连接。
登录服务器作为非 root sudo 用户,并更新包列表,以确保您拥有所有最新版本。
1sudo yum update -y
用于企业 Linux 的 Extra Packages (EPEL) 存储库是一个由 Fedora 项目管理的额外存储库,包含非标准但受欢迎的软件包。
1sudo yum install epel-release -y
然后再更新您的包列表:
1sudo yum update -y
接下来,安装OpenVPN和wget,我们将使用它来安装Easy RSA:
1sudo yum install -y openvpn wget
使用「wget」,下載 Easy RSA. 為本教程的目的,我們建議使用 easy-rsa-2 因為這個版本有更多可用的文檔. 你可以在項目的 發行頁面上找到 easy-rsa-2 最新版本的下載鏈接:
1wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
接下来,用tar
提取压缩文件:
1tar xfz /tmp/easyrsa
这将在您的服务器上创建一个名为easy-rsa-old-2.3.3
的新目录,在/etc/openvpn
下创建一个新的子目录,并将其命名为easy-rsa
:
1sudo mkdir /etc/openvpn/easy-rsa
将提取的 Easy RSA 文件复制到新的目录:
1sudo cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa
然后将目录的所有者更改为您的非 root sudo 用户:
1sudo chown sammy /etc/openvpn/easy-rsa/
一旦这些程序被安装并移动到您的系统的正确位置,下一步是定制OpenVPN的服务器侧配置。
步骤 2 – 配置 OpenVPN
与许多其他广泛使用的开源工具一样,有数十种配置选项可供您使用. 在本节中,我们将提供有关如何设置基本的OpenVPN服务器配置的说明。
OpenVPN在其文档目录中有几个示例配置文件. 首先,复制示例 server.conf
文件作为您自己的配置文件的起点。
1sudo cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn
我们将在我们的示例中使用nano,您可以通过yum install nano
命令下载,如果您已经没有在服务器上:
1sudo nano /etc/openvpn/server.conf
我们需要在这个文件中更改几行,其中大多数只需要通过删除半栏, ;
,在行开头删除评论,这些行的功能,以及本教程中没有提到的其他行,在上面的评论中详细解释。
要开始,请查找并删除包含‘推‘redirect-gateway def1 bypass-dhcp’的行。这样做会告诉您的客户端通过您的OpenVPN服务器重定向所有流量。请注意,启用此功能可能会导致其他网络服务(如SSH)的连接问题:
1[label /etc/openvpn/server.conf]
2push "redirect-gateway def1 bypass-dhcp"
由于您的客户端将无法使用您的ISP提供的默认DNS服务器(因为其流量将被重定向),您需要告诉客户端可以使用哪些DNS服务器连接到OpenVPN。
将此设置为推
dhcp-option DNS...``两行,并更新 IP 地址:
1[label /etc/openvpn/server.conf]
2push "dhcp-option DNS 8.8.8.8"
3push "dhcp-option DNS 8.8.4.4"
我们希望OpenVPN在启动后运行没有特权,所以我们需要告诉它与用户和组 nobody一起运行。
1[label /etc/openvpn/server.conf]
2user nobody
3group nobody
接下来,删除topology subnet
行. 这与server 10.8.0.0 255.255.255.0
行一起,将您的OpenVPN安装配置为子网络,并告诉客户端机器应该使用哪个IP地址。
1[label /etc/openvpn/server.conf]
2topology subnet
还建议您将下列行添加到您的服务器配置文件中,这双重检查到任何接入的客户端证书确实来自客户端,从而加强了我们将在以后的步骤中建立的安全参数:
1[label /etc/openvpn/server.conf]
2remote-cert-eku "TLS Web Client Authentication"
最后,OpenVPN强烈建议用户启用TLS身份验证,这是一种加密协议,可确保计算机网络上的安全通信。 要做到这一点,您需要生成一个静态加密密钥(在我们的例子中被命名为myvpn.tlsauth),尽管您可以选择您喜欢的任何名称)。 在创建此密钥之前,请在配置文件中含有tls-auth ta.key 0
的行评论,然后用半色符号预先加到下面的行:
1[label /etc/openvpn/server.conf]
2;tls-auth ta.key 0
3tls-crypt myvpn.tlsauth
保存并退出OpenVPN服务器配置文件(用纳米语,按CTRL - X
,Y
,然后按ENTER
来执行),然后用以下命令生成静态加密密钥:
1sudo openvpn --genkey --secret /etc/openvpn/myvpn.tlsauth
现在,您的服务器已配置,您可以继续设置所需的SSL密钥和证书,以安全连接到您的VPN连接。
步骤 3 – 生成密钥和证书
Easy RSA 使用一组与程序一起安装的脚本来生成密钥和证书. 为了避免每次需要生成证书时重新配置,您可以修改 Easy RSA 的配置,以定义其将用于证书字段的默认值,包括您的国家、城市和偏好电子邮件地址。
我们将通过创建一个目录开始我们生成密钥和证书的过程,Easy RSA将存储您生成的任何密钥和证书:
1sudo mkdir /etc/openvpn/easy-rsa/keys
默认证书变量设置在 vars
文件中 /etc/openvpn/easy-rsa
,所以打开该文件进行编辑:
1sudo nano /etc/openvpn/easy-rsa/vars
滚动到文件的底部,并更改以「export KEY_」开始的值以匹配您的信息。
KEY_CN
:在这里,输入解决到您的服务器的域或子域。KEY_NAME
:您应该在这里输入server
. 如果您输入了其他东西,您还需要更新引用server.key
和server.crt
的配置文件。
您可能想要更改的文件中的其他变量是:
KEY_COUNTRY
:对于这个变量,请输入您居住的国家的两个字母缩写。KEY_PROVINCE
:这应该是您居住的国家的名称或缩写。KEY_CITY
:在这里输入您居住的城市的名称。KEY_ORG
:这应该是您的组织或公司名称。
其他变量可以安全地忽略在特定用例之外,在您更改后,该文件应该看起来如下:
1[label /etc/openvpn/easy-rsa/vars]
2. . .
3
4# These are the default values for fields
5# which will be placed in the certificate.
6# Don't leave any of these fields blank.
7export KEY_COUNTRY="US"
8export KEY_PROVINCE="NY"
9export KEY_CITY="New York"
10export KEY_ORG="DigitalOcean"
11export KEY_EMAIL="[email protected]"
12export KEY_EMAIL=sammy@example.com
13export KEY_CN=openvpn.example.com
14export KEY_NAME="server"
15export KEY_OU="Community"
16. . .
保存并关闭文件。
要开始生成密钥和证书,请进入easy-rsa
目录和source
在您在vars
文件中设置的新变量中:
1cd /etc/openvpn/easy-rsa
2source ./vars
运行 Easy RSA 的清除所有
脚本,删除文件夹中的任何密钥和证书,并生成证书权限:
1./clean-all
接下来,使用build-ca
脚本构建证书权限,您将被要求为证书字段输入值,但如果您早些时候在vars
文件中设置了变量,您的所有选项都将被设置为默认值。
1./build-ca
这个脚本会生成一个名为ca.key
的文件,这是用于签署您的服务器和客户端证书的私钥,如果丢失,您将无法再信任该证书机构的任何证书,如果任何人能够访问该文件,他们可以签署新的证书,并在您不知情的情况下访问您的VPN,因此OpenVPN建议将ca.key
存储在尽可能远离的位置,并且只有在创建新证书时才能激活。
接下来,使用build-key-server
脚本为服务器创建一个密钥和证书:
1./build-key-server server
与构建 CA 一样,您将看到您已设置的值作为默认值,因此您可以在这些提示下按ENTER
。 此外,您将被要求输入挑战密码和可选的公司名称。 如果您输入挑战密码,您将被要求在连接到您的客户端的 VPN 时。
创建服务器密钥和证书的最后一部分是生成一个Diffie-Hellman密钥交换文件。
1./build-dh
这可能需要几分钟才能完成。
一旦您的服务器完成了关键交换文件的生成,将服务器密钥和证书从‘keys’目录复制到‘openvpn’目录:
1cd /etc/openvpn/easy-rsa/keys
2sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
每个客户端还需要一个证书,以便OpenVPN服务器验证其身份. 这些密钥和证书将在服务器上创建,然后您将不得不将其复制到您的客户端,我们将在稍后的一步中完成。
因为我们只会在这里设置一个客户端,所以我们称之为客户端
,但如果您喜欢的话,您可以更改这个名称以更为描述性:
1cd /etc/openvpn/easy-rsa
2./build-key client
最后,将版本的 OpenSSL 配置文件, openssl-1.0.0.cnf,复制到无版本的名称,
openssl.cnf。
1cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
现在为您的服务器和客户端生成了所有必要的密钥和证书,您可以继续设置两台机器之间的路由。
步骤4:路线
到目前为止,您已经在您的服务器上安装了 OpenVPN,配置了它,并生成了客户端访问VPN所需的密钥和证书,但您尚未向OpenVPN提供有关从客户端发送入口网络流量的任何说明。
假设你在本教程开始时遵循了前提条件,你应该已经安装了 firewalld 并在你的服务器上运行。 要允许 OpenVPN 通过防火墙,你需要知道你的活跃防火墙区是什么。
1sudo firewall-cmd --get-active-zones
1[secondary_label Output]
2trusted
3 Interfaces: tun0
接下来,将openvpn
服务添加到您的活跃区域内 firewalld 允许的服务列表中,然后通过再次运行命令而使该设置永久化,但添加了--永久
选项:
1sudo firewall-cmd --zone=trusted --add-service openvpn
2sudo firewall-cmd --zone=trusted --add-service openvpn --permanent
您可以通过以下命令检查是否正确添加了服务:
1sudo firewall-cmd --list-services --zone=trusted
1[secondary_label Output]
2openvpn
接下来,向当前的运行时实例添加一个伪装,然后再用--永久
选项添加它,将伪装添加到所有未来的实例中:
1sudo firewall-cmd --add-masquerade
2sudo firewall-cmd --permanent --add-masquerade
您可以通过此命令检查是否正确添加了面具:
1sudo firewall-cmd --query-masquerade
1[secondary_label Output]
2yes
您可以这样做,首先创建一个变量(‘SHARK’在我们的示例中),它将代表您的服务器使用的主要网络接口,然后使用该变量永久添加路由规则:
1SHARK=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
2sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $SHARK -j MASQUERADE
请确保通过重新加载 firewalld 将这些更改应用于您的防火墙规则:
1sudo firewall-cmd --reload
接下来,启用IP转发,这将将从您的客户端的所有网络流量路由到您的服务器的IP地址,并且您的客户端的公共IP地址将有效地隐藏。
打开sysctl.conf
来编辑:
1sudo nano /etc/sysctl.conf
然后在文件的顶部添加以下行:
1[label /etc/sysctl.conf]
2net.ipv4.ip_forward = 1
最后,重新启动网络服务,以便IP转发生效:
1sudo systemctl restart network.service
有了路由和防火墙规则,我们可以在服务器上启动OpenVPN服务。
步骤 5 – 启动 OpenVPN
OpenVPN 被管理为使用systemctl
的 systemd 服务,我们会将 OpenVPN 配置为在启动时启动,以便在服务器运行时随时连接到您的 VPN。
1sudo systemctl -f enable [email protected]
然后启动OpenVPN服务:
1sudo systemctl start [email protected]
您应该在输出中看到活跃(运行)
:
1sudo systemctl status [email protected]
1[secondary_label Output]
2● openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
3 Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; enabled; vendor preset: disabled)
4 Active: **active (running)** since Wed 2018-03-14 15:20:11 EDT; 7s ago
5 Main PID: 2824 (openvpn)
6 Status: "Initialization Sequence Completed"
7 CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
8 └─2824 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf
9. . .
我们已经完成了OpenVPN的服务器侧配置,接下来,您将配置客户端机器并连接到OpenVPN服务器。
步骤 6 – 配置客户端
无论您的客户端机器的操作系统如何,它都需要一个本地保存的CA证书和第3步生成的客户端密钥和证书的副本,以及第2步结束时生成的静态加密密钥。
在您的服务器上找到以下文件 ** 如果您生成了多个具有独特的描述性名称的客户端密钥,那么密钥和证书名称将不同。
1/etc/openvpn/easy-rsa/keys/ca.crt
2/etc/openvpn/easy-rsa/keys/client.crt
3/etc/openvpn/easy-rsa/keys/client.key
4/etc/openvpn/myvpn.tlsauth
您可以使用 SFTP或您偏好的方法. 您甚至可以简单地在文本编辑器中打开文件,并将内容复制并粘贴到客户端机器上的新文件中。
接下来,在您的客户端机器上创建一个名为client.ovpn
**的文件,这是一个OpenVPN客户端的配置文件,告诉它如何连接到服务器:
1[environment local]
2sudo nano client.ovpn
请注意,许多这些行反映了我们没有评论或添加到「server.conf」文件中的那些行,或者默认情况下已经在其中:
1[label client.ovpn]
2[environment local]
3client
4tls-client
5ca /path/to/ca.crt
6cert /path/to/client.crt
7key /path/to/client.key
8tls-crypt /path/to/myvpn.tlsauth
9remote-cert-eku "TLS Web Client Authentication"
10proto udp
11remote your_server_ip 1194 udp
12dev tun
13topology subnet
14pull
15user nobody
16group nobody
添加这些行时,请注意以下几点:
- 您需要更改第一行以反映您在密钥和证书中给客户端的名称;在我们的情况下,这只是
客户端
- 您还需要从
your_server_ip
更新IP地址到您的服务器的IP地址;端口1194
可以保持相同 - 确保您的密钥和证书文件的路径正确
此文件现在可以被任何OpenVPN客户端使用来连接到您的服务器。
维生素:**
在 Windows 上,您将需要官方的 OpenVPN Community Edition 二进制 附带 GUI. 将您的 .ovpn
配置文件放入适当的目录, C:\Program Files\OpenVPN\config
,然后在 GUI 中点击 Connect。
• macOS: *
在 macOS 上,开源应用程序 Tunnelblick提供类似于 Windows 上的 OpenVPN GUI 的接口,并配备了 OpenVPN 和所需的 TUN/TAP 驱动程序。 与 Windows 一样,所需的唯一步骤是将您的 .ovpn
配置文件放入 `~ / 图书馆 / 应用支持 / Tunnelblick / 配置的目录。
• Linux: *
在 Linux 上,您应该从发行版的官方存储库中安装 OpenVPN。
1[environment local]
2sudo openvpn --config ~/path/to/client.ovpn
建立成功的客户端连接后,您可以通过 检查 Google 揭示您的公共 IP来验证您的流量正在通过VPN进行路由。
结论
您现在应该有一个完全运行的虚拟私人网络在您的OpenVPN服务器上运行,您可以浏览网络和下载内容,而不必担心恶意行为者跟踪您的活动。
您可以采取若干步骤来进一步定制您的 OpenVPN 安装,例如将客户端配置为自动连接到 VPN 或配置客户端特定的规则和访问策略. 对于这些和其他 OpenVPN 定制,您应该参阅 官方 OpenVPN 文档。