前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
OpenVPN 是一个开源的 VPN 应用程序,可以让您在公共互联网上安全地创建和加入私人网络。简而言之,这允许最终用户隐藏连接并更安全地浏览不受信任的网络。
有了这个前提,本教程将教您如何在 Debian 8 上设置 OpenVPN,这是一个开源的安全套接字层(SSL)VPN 解决方案。
先决条件
本教程假设您具有以下内容:
- 一个全新的 Debian 8.1 Droplet
- 一个 root 用户
- 可选:完成本教程后,使用一个启用了 sudo 的非 root 帐户进行一般维护;您可以按照本教程的第 2 和第 3 步来设置一个
步骤 1 — 安装 OpenVPN
在安装任何软件包之前,更新 apt 软件包索引。
apt-get update
现在,我们可以安装 OpenVPN 服务器以及用于加密的 easy-RSA。
apt-get install openvpn easy-rsa
步骤 2 — 配置 OpenVPN
需要将示例 VPN 服务器配置文件提取到 /etc/openvpn
,以便我们可以将其纳入我们的设置。可以使用以下命令完成:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
提取后,使用 nano 或您喜欢的文本编辑器打开服务器配置文件。
nano /etc/openvpn/server.conf
在这个文件中,我们需要进行四项更改(每一项都将详细解释):
- 使用更高级别的加密来保护服务器
- 将 Web 流量转发到目的地
- 防止 DNS 请求泄漏到 VPN 连接之外
- 设置权限
首先,我们将在生成服务器和客户端密钥时使用双倍的 RSA 密钥长度。在主注释块和几个更多的块之后,搜索以下行:
# Diffie hellman parameters.
# Generate your own with:
# openssl dhparam -out dh1024.pem 1024
# Substitute 2048 for 1024 if you are using
# 2048 bit keys.
dh dh1024.pem
将 dh1024.pem
更改为 dh2048.pem
,使得该行现在变成:
dh dh2048.pem
其次,我们将确保将所有流量重定向到正确的位置。仍然在 server.conf
中,滚动到更多的注释块之后,查找以下部分:
# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
;push "redirect-gateway def1 bypass-dhcp"
取消注释 push "redirect-gateway def1 bypass-dhcp"
,以便 VPN 服务器将客户端的 Web 流量传递到其目的地。完成后应如下所示:
push "redirect-gateway def1 bypass-dhcp"
第三,我们将告诉服务器在可能的情况下使用 OpenDNS 进行 DNS 解析。这可以帮助防止 DNS 请求泄漏到 VPN 连接之外。在前面修改的块之后,编辑以下内容:
# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses. CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
取消注释 push "dhcp-option DNS 208.67.222.222"
和 push "dhcp-option DNS 208.67.220.220"
。完成后应如下所示:
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
第四,我们将在 server.conf
中定义权限:
# You can uncomment this out on
# non-Windows systems.
;user nobody
;group nogroup
取消注释 user nobody
和 group nogroup
。完成后应如下所示:
user nobody
group nogroup
默认情况下,OpenVPN 以 root 用户身份运行,因此对系统具有完全的 root 访问权限。我们将把 OpenVPN 限制为用户 nobody 和组 nogroup。这是一个没有默认登录权限的非特权用户,通常用于运行像面向 Web 服务器这样的不受信任的应用程序。
现在保存您的更改并退出。
步骤 3 —— 启用数据包转发
在这一部分,我们将告诉服务器的内核将来自客户端服务的流量转发到互联网。否则,流量将停留在服务器上。
通过输入以下命令在运行时启用数据包转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
接下来,我们需要使此设置永久化,以便在服务器重新启动后保持此设置。使用 nano 或您喜欢的文本编辑器打开 sysctl
配置文件。
nano /etc/sysctl.conf
在 sysctl
文件的顶部附近,您会看到:
# 取消注释下一行以启用 IPv4 的数据包转发
#net.ipv4.ip_forward=1
取消注释 net.ipv4.ip_forward
。完成后应如下所示:
# 取消注释下一行以启用 IPv4 的数据包转发
net.ipv4.ip_forward=1
保存更改并退出。
步骤 4 —— 安装和配置 ufw
UFW 是 IPTables 的前端。我们只需要进行一些规则和配置编辑,然后打开防火墙。有关 UFW 更多用法的参考,请参阅《如何在 Ubuntu 和 Debian 云服务器上使用 UFW 设置防火墙》。
首先,安装 ufw
软件包。
apt-get install ufw
其次,设置 UFW 允许 SSH:
ufw allow ssh
本教程将使用 UDP 上的 OpenVPN,因此 UFW 还必须允许端口 1194
上的 UDP 流量。
ufw allow 1194/udp
还需要设置 UFW 转发策略。我们将在主配置文件中进行此操作。
nano /etc/default/ufw
查找以下行:
DEFAULT_FORWARD_POLICY="DROP"
这必须从 DROP
更改为 ACCEPT
。完成后应如下所示:
DEFAULT_FORWARD_POLICY="ACCEPT"
保存并退出。
接下来,我们将为连接的客户端添加额外的 UFW 规则,以进行网络地址转换和 IP 伪装。
nano /etc/ufw/before.rules
接下来,在 OPENVPN RULES 中添加红色区域:
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
#
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
# 不要删除这些必需的行,否则将会出现错误
*filter
保存并退出。
通过对 UFW 进行更改,我们现在可以启用它。在命令提示符中输入:
ufw enable
启用 UFW 将返回以下提示:
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
回答 y
。结果将是以下输出:
Firewall is active and enabled on system startup
要检查 UFW 的主防火墙规则:
ufw status
状态命令应返回以下条目:
状态: active
To Action From
-- ------ ----
22 ALLOW Anywhere
1194/udp ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
1194/udp (v6) ALLOW Anywhere (v6)
步骤 5 —— 配置和构建证书颁发机构
OpenVPN 使用证书来加密流量。
在本节中,我们将分两步设置自己的证书颁发机构(CA):(1)设置变量和(2)生成 CA。
OpenVPN 支持基于证书的双向身份验证,这意味着在建立相互信任之前,客户端必须对服务器证书进行身份验证,服务器也必须对客户端证书进行身份验证。我们将使用 Easy RSA 的脚本来完成这一点。
首先复制 Easy-RSA 生成脚本。
cp -r /usr/share/easy-rsa/ /etc/openvpn
然后,创建一个目录来存放密钥。
mkdir /etc/openvpn/easy-rsa/keys
接下来,我们将为我们的证书设置参数。使用 nano 或您喜欢的文本编辑器打开变量文件。
nano /etc/openvpn/easy-rsa/vars
下面标记为红色的变量应根据您的偏好进行更改。
export KEY_COUNTRY="US"
export KEY_PROVINCE="TX"
export KEY_CITY="Dallas"
export KEY_ORG="My Company Name"
export KEY_EMAIL="[email protected]"
export KEY_OU="MYOrganizationalUnit"
在同一 vars
文件中,还编辑下面显示的这一行。为简单起见,我们将使用 server
作为密钥名称。如果您想使用不同的名称,您还需要更新引用 server.key
和 server.crt
的 OpenVPN 配置文件。
接下来,在同一文件中,我们将指定正确的证书。查找以下行,在之前修改的块之后,读取
# X509 主题字段
```bash
export KEY_NAME="EasyRSA"
将 KEY_NAME
的默认值 EasyRSA
更改为您所需的服务器名称。本教程将使用名称 server
。
export KEY_NAME="server"
保存并退出。
接下来,我们将使用内置的 OpenSSL 工具 dhparam
生成 Diffie-Helman 参数;这可能需要几分钟时间。
-out
标志指定了新参数的保存位置。
openssl dhparam -out /etc/openvpn/dh2048.pem 2048
我们的证书现在已生成,是时候生成密钥了。
首先,我们将切换到 easy-rsa
目录。
cd /etc/openvpn/easy-rsa
现在,我们可以开始设置 CA 本身。首先,初始化公钥基础设施(PKI)。
请注意 ./vars
命令前面的 点(.) 和 空格。这表示当前工作目录(源)。
. ./vars
接下来,我们将清除可能干扰我们安装的所有其他密钥。
./clean-all
最后,我们将使用 OpenSSL 命令构建 CA。此命令将提示您确认之前输入的“可分辨名称”变量。按 ENTER
接受现有值。
./build-ca
按 ENTER
通过每个提示,因为您刚在 vars
文件中设置了它们的值。
证书颁发机构现在已设置好。
步骤 6 — 为服务器生成证书和密钥
在本节中,我们将设置并启动我们的 OpenVPN 服务器。
首先,仍然从 /etc/openvpn/easy-rsa
中工作,使用服务器名称构建您的密钥。在配置文件中,这在前面被指定为 KEY_NAME
。本教程的默认值是 server
。
./build-key-server server
再次,输出将要求确认“可分辨名称”。按 ENTER
接受定义的默认值。这次,将有两个额外的提示。
请输入以下“额外”属性以与您的证书请求一起发送
挑战密码 []:
可选公司名称 []:
两者都应保持空白,因此只需按 ENTER
通过每个提示。
最后,最后的两个查询需要肯定(y
)的响应:
签署证书?[y/n]
1 个证书请求已经认证,提交?[y/n]
然后,您将收到以下提示,表示成功。
写入数据库,有 1 个新条目
数据库已更新
步骤 7 — 移动服务器证书和密钥
现在,我们将证书和密钥复制到 /etc/openvpn
,因为 OpenVPN 将在该目录中搜索服务器的 CA、证书和密钥。
cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn
您可以使用以下命令验证复制是否成功:
ls /etc/openvpn
您应该看到服务器的证书和密钥文件。
此时,OpenVPN 服务器已准备就绪。启动它并检查状态。
service openvpn start
service openvpn status
状态命令将返回以下效果:
* openvpn.service - OpenVPN service
Loaded: loaded (/lib/systemd/system/openvpn.service; enabled)
Active: active (exited) since Thu 2015-06-25 02:20:18 EDT; 9s ago
Process: 2505 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 2505 (code=exited, status=0/SUCCESS)
最重要的是,从上面的输出中,您应该找到 Active: active (exited) since...
而不是 Active: inactive (dead) since...
。
您的 OpenVPN 服务器现在已经运行。如果状态消息显示 VPN 未运行,则查看 /var/log/syslog
文件以获取诸如以下错误的错误:
Options error: --key fails with 'server.key': No such file or directory
该错误表示 server.key
未正确复制到 /etc/openvpn
。重新复制文件并重试。
步骤 8 — 为客户端生成证书和密钥
到目前为止,我们已经安装和配置了 OpenVPN 服务器,创建了证书颁发机构,并创建了服务器自己的证书和密钥。在此步骤中,我们使用服务器的 CA 为将连接到 VPN 的每个客户端设备生成证书和密钥。
密钥和证书生成
最理想的情况是每个连接到 VPN 的客户端都有其自己独特的证书和密钥。这比生成一个通用的证书和密钥供所有客户端设备使用更可取。
为了为您打算连接到 VPN 的每个设备创建单独的身份验证凭据,您应该为每个设备完成此步骤,但是将下面的名称client1
更改为不同的名称,例如client2
或iphone2
。使用每个设备单独的凭据后,如果需要,它们可以在服务器上单独停用。本教程中的其余示例将使用client1
作为我们示例客户端设备的名称。
与服务器的密钥一样,现在我们为我们的client1
示例构建一个密钥。您应该仍然在/etc/openvpn/easy-rsa
目录中工作。
./build-key client1
再次,您将被要求更改或确认专有名称变量和这两个应该留空的提示。按ENTER
接受默认值。
请输入以下“额外”属性以与您的证书请求一起发送
挑战密码[]:
可选公司名称[]:
与之前一样,在构建过程结束时,这两个确认需要回答y
:
签署证书?[y/n]
1 个证书请求已经认证,提交?[y/n]
然后,您将收到以下输出,确认密钥构建成功。
写入具有 1 个新条目的数据库。
数据库已更新
然后,我们将生成的密钥复制到我们之前创建的 Easy-RSA keys
目录中。请注意,我们将扩展名从.conf
更改为.ovpn
。这是为了符合约定。
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn
您可以针对每个客户端再次重复此部分,将client1
替换为适当的客户端名称。
注意:您复制的client.ovpn
的名称不需要与客户端设备相关。客户端端的 OpenVPN 应用程序将使用文件名作为 VPN 连接本身的标识符。相反,您应该将client.ovpn
复制到您希望在操作系统中作为 VPN 名称标签的任何内容。例如:work.ovpn将被识别为work,school.ovpn将被识别为school,等等。
我们需要修改每个客户端文件,以包括 OpenVPN 服务器的 IP 地址,以便它知道要连接到哪里。使用 nano 或您喜欢的文本编辑器打开client.ovpn
。
nano /etc/openvpn/easy-rsa/keys/client.ovpn
首先,编辑以remote
开头的行。将my-server-1
更改为your_server_ip
。
# 服务器的主机名/IP 和端口。
# 您可以有多个远程条目
# 在服务器之间进行负载平衡。
remote your_server_ip 1194
接下来,找到下面显示的区域,并取消注释user nobody
和group nogroup
,就像我们在第 1 步中的server.conf
中所做的一样。**注意:**这不适用于 Windows,因此您可以跳过它。完成后应如下所示:
# 初始化后降低权限(仅限非 Windows)
user nobody
group nogroup
将证书和密钥传输到客户端设备
回想一下,根据上述步骤,我们创建了客户端证书和密钥,并且它们存储在/etc/openvpn/easy-rsa/keys
目录中的 OpenVPN 服务器上。
对于每个客户端,我们需要将客户端证书、密钥和配置文件模板文件传输到本地计算机或另一个客户端设备上的文件夹。
在本示例中,我们的client1
设备需要其证书和密钥,位于服务器上的以下位置:
/etc/openvpn/easy-rsa/keys/client1.crt
/etc/openvpn/easy-rsa/keys/client1.key
ca.crt
和client.ovpn
文件对所有客户端都是相同的。也下载这两个文件;请注意,ca.crt
文件位于与其他文件不同的目录中。
/etc/openvpn/easy-rsa/keys/client.ovpn
/etc/openvpn/ca.crt
尽管用于完成此传输的确切应用程序取决于您的选择和设备的操作系统,但您希望应用程序在后端使用 SFTP(SSH 文件传输协议)或 SCP(安全复制)来传输客户端的 VPN 身份验证文件。
以下是使用我们的client1
示例的一个 SCP 命令示例。它将文件client1.key
放入本地计算机的Downloads目录中。
scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/
以下是一些用于从服务器安全地传输文件到本地计算机的工具和教程:
- WinSCP
- 如何使用 SFTP 安全地与远程服务器传输文件
- 如何使用 Filezilla 在 VPS 上安全地传输和管理文件
在本节结束时,请确保您的客户端设备上有以下四个文件:
client1.crt
client1.key
client.ovpn
ca.crt
第九步 —— 为客户端设备创建统一的 OpenVPN 配置文件
管理客户端文件有几种方法,但最简单的方法是使用一个“统一”的配置文件。这是通过修改 client.ovpn
模板文件来实现的,其中包括服务器的证书颁发机构、客户端的证书和密钥。一旦合并完成,只需将单个 client.ovpn
配置文件导入客户端的 OpenVPN 应用程序即可。
下面的区域需要将所示的三行注释掉,以便我们可以直接在 client.ovpn
文件中包含证书和密钥。完成后应如下所示:
# SSL/TLS parms.
# . . .
;ca ca.crt
;cert client.crt
;key client.key
保存更改并退出。我们将通过代码添加证书。
首先,添加证书颁发机构。
echo '<ca>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
cat /etc/openvpn/ca.crt >> /etc/openvpn/easy-rsa/keys/client.ovpn
echo '</ca>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
其次,添加证书。
echo '<cert>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
cat /etc/openvpn/easy-rsa/keys/client1.crt >> /etc/openvpn/easy-rsa/keys/client.ovpn
echo '</cert>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
最后,添加密钥。
echo '<key>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
cat /etc/openvpn/easy-rsa/keys/client1.key >> /etc/openvpn/easy-rsa/keys/client.ovpn
echo '</key>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
现在我们有了一个统一的客户端配置文件。使用 scp
,您可以将 client.ovpn
文件复制到您的第二个系统上。
第十步 —— 安装客户端配置文件
各种平台都有更加用户友好的应用程序可用于连接到此 OpenVPN 服务器。有关特定平台的说明,请参阅本教程中的第 5 步。
结论
恭喜!您现在拥有一个可用的 OpenVPN 服务器和客户端文件。
从您的 OpenVPN 客户端,您可以使用 Google 测试连接,以显示您的公共 IP。在客户端上,在启动 OpenVPN 连接之前和之后各加载一次。IP 地址应该会发生变化。