如何在 Debian 8 上设置 OpenVPN 服务器
介绍
OpenVPN 是一种开源 VPN 应用程序,可让您通过公共 Internet 安全地创建和加入专用网络。简而言之,这允许最终用户屏蔽连接并更安全地浏览不受信任的网络。
话虽如此,本教程将教您如何在 Debian 8 上设置 OpenVPN,这是一种开源安全套接字层 (SSL) VPN 解决方案。
注意:如果您计划在 DigitalOcean Droplet 上设置 OpenVPN 服务器,请注意我们与许多托管服务提供商一样,对带宽超额收费。因此,请注意您的服务器正在处理的流量。
有关详细信息,请参阅此页面。
先决条件
本教程假设您具有以下内容:
- 一个全新的 Debian 8.1 Droplet
- 根用户
- 可选:完成本教程后,使用启用 sudo 的非根帐户进行一般维护;您可以按照本教程的第 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
在此文件中,我们需要进行四处更改(每一项都会进行详细说明):
- 使用更高级别加密的安全服务器
- 将网络流量转发到目的地
- 防止 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 服务器将客户端的网络流量传递到其目的地。完成后应该是这样的:
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 步 — 启用数据包转发
在本节中,我们将告诉服务器内核将来自客户端服务的流量转发到 Internet。否则,流量将停止在服务器上。
通过输入以下命令在运行时启用数据包转发:
- echo 1 > /proc/sys/net/ipv4/ip_forward
接下来,我们需要将此设置永久化,以便此设置在服务器重启后仍然存在。使用 nano 或您喜欢的文本编辑器打开 sysctl
配置文件。
- nano /etc/sysctl.conf
在 sysctl
文件的顶部附近,您将看到:
# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
取消注释 net.ipv4.ip_forward
。完成后应该是这样的:
# Uncomment the next line to enable packet forwarding for 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"
保存并退出。
接下来,我们将为连接的客户端的网络地址转换和 IP 伪装添加额外的 UFW 规则。
- 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
# Don't delete these required lines, otherwise there will be errors
*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
status 命令应返回以下条目:
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="sammy@example.com"
export KEY_OU="MYOrganizationalUnit"
在同一个 vars
文件中,还编辑如下所示的这一行。为简单起见,我们将使用 server
作为键名。如果您想使用不同的名称,您还需要更新引用 server.key
和 server.crt
的 OpenVPN 配置文件。
下面,在同一个文件中,我们将指定正确的证书。在先前修改的块之后查找行
# X509 Subject Field
export KEY_NAME="EasyRSA"
将 KEY_NAME
的默认值 EasyRSA
更改为您想要的服务器名称。本教程将使用名称 server
。
# X509 Subject Field
export KEY_NAME="server"
保存并退出。
接下来,我们将使用名为 dhparam
的内置 OpenSSL 工具生成 Diffie-Helman 参数;这可能会需要几分钟。
-out
标志指定保存新参数的位置。
- openssl dhparam -out /etc/openvpn/dh2048.pem 2048
现在我们的证书已经生成,是时候生成密钥了。
首先,我们将切换到 easy-rsa
目录。
- cd /etc/openvpn/easy-rsa
现在,我们可以开始设置 CA 本身了。首先,初始化公钥基础设施 (PKI)。
注意./vars
命令前的点(.)和空格。这表示当前工作目录(源)。
- . ./vars
将打印以下警告。别担心,因为警告中指定的目录是空的。 注意:如果您运行 ./clean-all,我将在 /etc/openvpn/easy-rsa/keys 上执行 rm -rf
。
接下来,我们将清除所有其他可能干扰我们安装的密钥。
- ./clean-all
最后,我们将使用 OpenSSL 命令构建 CA。此命令将提示您确认之前输入的 \Distinguished Name 变量。按 ENTER
接受现有值。
- ./build-ca
按 ENTER
以通过每个提示,因为您只是在 vars
文件中设置它们的值。
证书颁发机构现已设置。
第 6 步 — 为服务器生成证书和密钥
在本节中,我们将设置并启动我们的 OpenVPN 服务器。
首先,仍然使用 /etc/openvpn/easy-rsa
,使用服务器名称构建您的密钥。这已在您的配置文件中指定为 KEY_NAME
。本教程的默认设置是 server
。
- ./build-key-server server
同样,输出将要求确认专有名称。点击 ENTER
接受定义的默认值。这次,将有两个额外的提示。
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
两者都应留空,因此只需按 ENTER 即可通过每一个。
最后的两个附加查询需要肯定的 (y
) 响应:
Sign the certificate? [y/n]
1 out of 1 certificate requests certified, commit? [y/n]
然后会提示如下,表示成功。
OutputWrite out database with 1 new entries
Data Base Updated
第 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
status 命令将返回一些内容,效果如下:
Output* 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 的客户端都拥有自己唯一的证书和密钥是理想的选择。这比生成一个在所有客户端设备中使用的通用证书和密钥更可取。
注意:默认情况下,OpenVPN 不允许使用相同证书和密钥的客户端同时连接到服务器。 (参见 /etc/openvpn/server.conf
中的 duplicate-cn
。)
要为您打算连接到 VPN 的每个设备创建单独的身份验证凭据,您应该为每个设备完成此步骤,但将下面的名称 client1
更改为不同的名称,例如 client2
或 iphone2
。每个设备都有单独的凭据,如果需要,以后可以在服务器上单独停用它们。本教程中的其余示例将使用 client1
作为示例客户端设备的名称。
正如我们对服务器密钥所做的那样,现在我们为我们的 client1
示例构建一个。您应该仍在使用 /etc/openvpn/easy-rsa
。
- ./build-key client1
再一次,您将被要求更改或确认专有名称变量和这两个应留空的提示。按 ENTER
接受默认值。
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
和以前一样,构建过程结束时的这两个确认需要 (y
) 响应:
Sign the certificate? [y/n]
1 out of 1 certificate requests certified, commit? [y/n]
然后您将收到以下输出,确认密钥构建成功。
Write out database with 1 new entries.
Data Base Updated
然后,我们将生成的密钥复制到我们之前创建的 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 将被识别为工作,school.ovpn 将被识别为学校等。
我们需要修改每个客户端文件以包含 OpenVPN 服务器的 IP 地址,以便它知道要连接到什么。使用 nano 或您喜欢的文本编辑器打开 client.ovpn
。
- nano /etc/openvpn/easy-rsa/keys/client.ovpn
首先,编辑以 remote
开头的行。将 my-server-1
更改为 your_server_ip
。
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194
接下来,找到如下所示的区域,取消注释user nobody
和group nogroup
,就像我们在步骤1中在server.conf
中所做的那样。注意:这不适用于 Windows,因此您可以跳过它。完成后应该是这样的:
# Downgrade privileges after initialization (non-Windows only)
user nobody
group no group
将证书和密钥传输到客户端设备
回想上面的步骤,我们创建了客户端证书和密钥,它们存储在 OpenVPN 服务器上的 /etc/openvpn/easy-rsa/keys
目录中。
对于每个客户端,我们需要将客户端证书、密钥和配置文件模板文件传输到本地计算机或其他客户端设备上的文件夹中。
在这个例子中,我们的 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
放入本地计算机的下载目录中。
- 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
第 9 步 — 为客户端设备创建统一的 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
文件复制到您的第二个系统。
第 10 步 — 安装客户端配置文件
各种平台都有更多用户友好的应用程序连接到这个 OpenVPN 服务器。有关特定于平台的说明,请参阅本教程中的步骤 5。
结论
恭喜!您现在有一个可用的 OpenVPN 服务器和客户端文件。
从您的 OpenVPN 客户端,您可以使用 Google 测试连接以显示您的公共 IP。在客户端上,在启动 OpenVPN 连接之前和之后加载一次。 IP地址应该改变。