介绍
OpenVPN是一个开源VPN应用程序,允许您通过公共互联网安全地创建和连接私人网络,简而言之,这允许最终用户掩盖连接并更安全地导航未受信任的网络。
尽管如此,本教程教你如何在 Debian 8 上设置开源的 Secure Socket Layer (SSL) VPN 解决方案 OpenVPN。
<$>[注] 注: 如果您打算在DigitalOcean Droplet上设置一个OpenVPN服务器,请注意,像许多托管提供商一样,我们会收取带宽过期费用。
请参阅此页面(https://www.digitalocean.com/docs/accounts/billing/bandwidth/)以获取更多信息。
前提条件
这个教程假设你有如下:
- 一个新的 Debian 8.1 Droplet
- 一个 root 用户
- 可选:本教程完成后,请使用 sudo 支持的非 root 帐户进行一般维护;您可以通过遵循 本教程 的步骤 2 和 3 来设置一个。
步骤 1 – 安装 OpenVPN
在安装任何包之前,请更新 apt 包索引。
1apt-get update
现在,我们可以安装OpenVPN服务器以及易于加密的RSA。
1apt-get install openvpn easy-rsa
步骤 2 – 配置 OpenVPN
例如,VPN服务器配置文件需要提取到/etc/openvpn
,以便我们可以将其纳入我们的设置。
1gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
一旦提取,请使用 nano 或您最喜欢的文本编辑器打开服务器配置文件。
1nano /etc/openvpn/server.conf
在这个文件中,我们需要做四个更改(每一个都将详细解释):
- 安全的服务器具有更高级别的加密
- 向目的地 传输 Web 流量 3. 防止 DNS 请求泄露到 VPN 连接之外
- 设置权限
首先,我们将翻倍使用的RSA密钥长度,当生成服务器和客户端密钥后,主要评论块和几块更多的块,寻找字符串:
1[label /etc/openvpn/server.conf]
2# Diffie hellman parameters.
3# Generate your own with:
4# openssl dhparam -out dh1024.pem 1024
5# Substitute 2048 for 1024 if you are using
6# 2048 bit keys.
7dh dh1024.pem
将dh1024.pem
更改为dh2048.pem
,以便行现在读到:
1[label /etc/openvpn/server.conf]
2dh dh2048.pem
其次,我们将确保将所有流量重定向到正确的位置. 仍然在server.conf
,滚过更多评论块,并寻找以下部分:
1[label /etc/openvpn/server.conf]
2# If enabled, this directive will configure
3# all clients to redirect their default
4# network gateway through the VPN, causing
5# all IP traffic such as web browsing and
6# and DNS lookups to go through the VPN
7# (The OpenVPN server machine may need to NAT
8# or bridge the TUN/TAP interface to the internet
9# in order for this to work properly).
10;push "redirect-gateway def1 bypass-dhcp"
Uncomment push "redirect-gateway def1 bypass-dhcp"
以便VPN服务器将客户端的网络流量传送到其目的地。
1[label /etc/openvpn/server.conf]
2push "redirect-gateway def1 bypass-dhcp"
第三,我们会告诉服务器在可能的情况下使用 OpenDNS用于 DNS 解析,这可以帮助防止 DNS 请求泄露到 VPN 连接之外。
1[label /etc/openvpn/server.conf]
2# Certain Windows-specific network settings
3# can be pushed to clients, such as DNS
4# or WINS server addresses. CAVEAT:
5# http://openvpn.net/faq.html#dhcpcaveats
6# The addresses below refer to the public
7# DNS servers provided by opendns.com.
8;push "dhcp-option DNS 208.67.222.222"
9;push "dhcp-option DNS 208.67.220.220"
按一下「dhcp-option DNS 208.67.222.222」和按一下「dhcp-option DNS 208.67.220.220」。
1[label /etc/openvpn/server.conf]
2push "dhcp-option DNS 208.67.222.222"
3push "dhcp-option DNS 208.67.220.220"
第四,我们将在「server.conf」中定义权限:
1[label /etc/openvpn/server.conf]
2# You can uncomment this out on
3# non-Windows systems.
4;user nobody
5;group nogroup
用户没有人
和群组没有人
都没有评论,完成后应该是这样的:
1[label /etc/openvpn/server.conf]
2user nobody
3group nogroup
默认情况下,OpenVPN作为 root用户运行,因此可以完全访问系统. 相反,我们将OpenVPN局限于用户 nobody和组 nogroup. 这是一个没有默认登录功能的非特权用户,通常用于运行不受信任的应用程序,如面向网络的服务器。
现在保存您的更改和退出。
步骤 3 – 启用包传输
在本节中,我们将告诉服务器的内核将流量从客户端服务转移到互联网,否则,流量将在服务器上停止。
通过输入此命令在运行时启用包转发:
1echo 1 > /proc/sys/net/ipv4/ip_forward
接下来,我们需要将此设置永久化,以便在服务器重新启动后继续使用此设置. 使用 nano 或您最喜欢的文本编辑器打开sysctl
配置文件。
1nano /etc/sysctl.conf
在sysctl
文件的顶部,你会看到:
1[label /etc/openvpn/server.conf]
2# Uncomment the next line to enable packet forwarding for IPv4
3#net.ipv4.ip_forward=1
无评论 net.ipv4.ip_forward
. 完成后应该是这样的:
1[label /etc/openvpn/server.conf]
2# Uncomment the next line to enable packet forwarding for IPv4
3net.ipv4.ip_forward=1
保存您的更改和退出。
步骤 4 – 安装和配置 ufw
UFW 是 IPTables 的前端,我们只需要做一些规则和配置编辑,然后我们将打开防火墙。 对于 UFW 的更多用途,请参阅 如何在 Ubuntu 和 Debian 云服务器上设置使用 UFW 的防火墙。
首先,安装UFW
包。
1apt-get install ufw
其次,设置 UFW 以允许 SSH:
1ufw allow ssh
本教程将使用OpenVPN通过UDP,因此UFW必须允许UDP流量通过端口1194
。
1ufw allow 1194/udp
UFW 转发策略也需要设置,我们将在主要配置文件中执行此操作。
1nano /etc/default/ufw
寻找下面的线条:
1[label /etc/default/ufw]
2DEFAULT_FORWARD_POLICY="DROP"
这必须从DOP
更改为ACCEPT
,完成后应该是这样的:
1[label /etc/default/ufw]
2DEFAULT_FORWARD_POLICY="ACCEPT"
保存和退出。
接下来,我们将为网络地址翻译和连接客户端的 IP 隐藏添加额外的 UFW 规则。
1nano /etc/ufw/before.rules
接下来,添加红色区域为 OPENVPN 规则:
1[label /etc/ufw/before.rules]
2#
3# rules.before
4#
5# Rules that should be run before the ufw command line added rules. Custom
6# rules should be added to one of these chains:
7# ufw-before-input
8# ufw-before-output
9# ufw-before-forward
10#
11
12# START OPENVPN RULES
13# NAT table rules
14*nat
15:POSTROUTING ACCEPT [0:0]
16# Allow traffic from OpenVPN client to eth0
17-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
18COMMIT
19# END OPENVPN RULES
20
21# Don't delete these required lines, otherwise there will be errors
22*filter
保存和退出。
隨著改變 UFW,我們現在可以啟用它。
1ufw enable
启用 UFW 将返回以下提示:
1Command may disrupt existing ssh connections. Proceed with operation (y|n)?
答案 y
. 结果将是这个输出:
1Firewall is active and enabled on system startup
查看 UFW 的主要防火墙规则:
1ufw status
状态命令应该返回这些条目:
1Status: active
2
3To Action From
4-- ------ ----
522 ALLOW Anywhere
61194/udp ALLOW Anywhere
722 (v6) ALLOW Anywhere (v6)
81194/udp (v6) ALLOW Anywhere (v6)
步骤 5 – 配置和构建证书权限
OpenVPN使用证书来加密流量。
在本节中,我们将在两个步骤中设置自己的证书授权(CA):(1)设置变量,(2)生成CA。
OpenVPN支持基于证书的双向身份验证,这意味着客户端必须验证服务器证书,服务器必须在建立互信之前验证客户端证书。
第一份 Easy-RSA 世代脚本。
1cp -r /usr/share/easy-rsa/ /etc/openvpn
然后,创建一个目录来容纳密钥。
1mkdir /etc/openvpn/easy-rsa/keys
接下来,我们将为我们的证书设置参数. 使用 nano 或您最喜欢的文本编辑器打开变量文件。
1nano /etc/openvpn/easy-rsa/vars
下面的红色变量应根据您的偏好进行更改。
1[label /etc/openvpn/easy-rsa/vars]
2export KEY_COUNTRY="US"
3export KEY_PROVINCE="TX"
4export KEY_CITY="Dallas"
5export KEY_ORG="My Company Name"
6export KEY_EMAIL="[email protected]"
7export KEY_OU="MYOrganizationalUnit"
在相同的vars
文件中,也编辑下面的一个行。为了简单,我们将使用server
作为密钥名称. 如果您想使用不同的名称,您还需要更新引用server.key
和server.crt
的OpenVPN配置文件。
下面,在同一文件中,我们将指定正确的证书. 寻找行,就在以前修改的块后,读取
1[label /etc/openvpn/easy-rsa/vars]
2# X509 Subject Field
3export KEY_NAME="EasyRSA"
將「KEY_NAME」的默認值變為「EasyRSA」為您想要的伺服器名稱.本教程將使用「伺服器」的名稱。
1[label /etc/openvpn/easy-rsa/vars]
2# X509 Subject Field
3export KEY_NAME="server"
保存和退出。
接下来,我们将使用名为dhparam
的内置OpenSSL工具生成Diffie-Helman参数,这可能需要几分钟。
关闭
旗指示了存储新参数的位置。
1openssl dhparam -out /etc/openvpn/dh2048.pem 2048
我们的证书现在生成,是时候生成密钥了。
首先,我们将切换到easy-rsa
目录。
1cd /etc/openvpn/easy-rsa
现在,我们可以开始设置CA本身,首先是初始化公共密钥基础设施(PKI)。
请注意在./vars
命令前面的 **dot(.)**和 space,这表示当前的工作目录(源)。
1. ./vars
<$>[注] 下列警告将被打印。不要担心,因为警告中指定的目录是空的。 `NOTE: 如果你运行./clean-all,我会在 /etc/openvpn/easy-rsa/keys 上执行 rm -rf。
接下来,我们将清除可能干扰我们安装的所有其他密钥。
1./clean-all
最后,我们将使用OpenSSL命令构建CA,该命令将提示您确认之前输入的Distinguished Name
变量。
1./build-ca
按ENTER
,通过每个提示,因为您刚刚在vars
文件中设置了它们的值。
认证机构现在已经成立。
步骤 6 – 生成服务器的证书和密钥
在本节中,我们将设置并启动我们的OpenVPN服务器。
首先,仍然从/etc/openvpn/easy-rsa
工作,用服务器名称构建你的密钥. 此前在配置文件中被指定为KEY_NAME
。
1./build-key-server server
再次,输出将要求确认 Distinguished Name. 点击ENTER
,以接受定义的默认值。
1Please enter the following 'extra' attributes
2to be sent with your certificate request
3A challenge password []:
4An optional company name []:
两者都应该留空,所以只需按 Enter 才能通过每一个。
最后两个额外的查询需要一个积极的(y
)答案:
1Sign the certificate? [y/n]
21 out of 1 certificate requests certified, commit? [y/n]
然后你会被提示下列,表示成功。
1[secondary_label Output]
2Write out database with 1 new entries
3Data Base Updated
步骤 7 – 移动服务器证书和密钥
我们现在将复制证书和密钥到/etc/openvpn
,因为OpenVPN将在该目录中搜索服务器的CA,证书和密钥。
1cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn
您可以验证副本是成功的:
1ls /etc/openvpn
您应该看到服务器的证书和密钥文件。
此时,OpenVPN服务器已准备好启动并检查状态。
1service openvpn start
2service openvpn status
状态命令将返回以下效果:
1[secondary_label Output]
2* openvpn.service - OpenVPN service
3 Loaded: loaded (/lib/systemd/system/openvpn.service; enabled)
4 Active: active (exited) since Thu 2015-06-25 02:20:18 EDT; 9s ago
5 Process: 2505 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
6 Main PID: 2505 (code=exited, status=0/SUCCESS)
最重要的是,从上面的输出中,你应该找到活跃:活跃(离开)自...
而不是活跃:不活跃(死亡)自...
。
您的 OpenVPN 服务器现在已启动,如果状态消息表示 VPN 无法运行,请查看 /var/log/syslog
文件,查找以下错误:
1Options error: --key fails with 'server.key': No such file or directory
此错误表明 server.key
未被正确地复制到 `/etc/openvpn. 重新复制文件并再次尝试。
第8步:为客户生成证书和密钥
到目前为止,我们已经安装并配置了OpenVPN服务器,创建了一个证书权威,并创建了服务器的自己的证书和密钥. 在这个步骤中,我们使用服务器的CA来生成连接到VPN的每个客户端设备的证书和密钥。
关键和证书建筑
每个连接到VPN的客户端都具有自己的独特证书和密钥,而不是在所有客户端设备中生成一个通用证书和密钥。
<$>[注] **注:**默认情况下,OpenVPN不允许使用相同证书和密钥的客户端同时连接到服务器。
要为您打算连接到VPN的每个设备创建单独的身份验证凭证,您应该为每个设备完成此步骤,但将下面的名称client1
更改为client2
或iphone2
。
正如我们对服务器的密钥所做的那样,现在我们为我们的client1
示例构建一个,您仍然应该从/etc/openvpn/easy-rsa
中工作。
1./build-key client1
再次,您将被要求更改或确认 Distinguished Name 变量和这两个提示,这些提示应该留空。
1Please enter the following 'extra' attributes
2to be sent with your certificate request
3A challenge password []:
4An optional company name []:
如前所述,在构建过程结束时,这两个确认需要一个(`y')响应:
1Sign the certificate? [y/n]
21 out of 1 certificate requests certified, commit? [y/n]
然后您将收到以下输出,确认成功的密钥构建。
1Write out database with 1 new entries.
2Data Base Updated
然后,我们将生成的密钥复制到我们之前创建的 Easy-RSA keys
目录. 请注意,我们将扩展从 .conf
更改为 .ovpn
。
1cp /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地址,以便它知道要连接到什么。
1nano /etc/openvpn/easy-rsa/keys/client.ovpn
首先,编辑从远程
开始的行,将我的服务器-1
更改为您的服务器_ip
。
1[label /etc/openvpn/easy-rsa/keys/client.ovpn]
2# The hostname/IP and port of the server.
3# You can have multiple remote entries
4# to load balance between the servers.
5remote your_server_ip 1194
接下来,寻找下面的区域,并评论用户没有人
和群组 nogroup
,就像我们在步骤 1中的server.conf
中所做的那样 ** 注意:** 这不适用于Windows,所以您可以跳过它。
1[label /etc/openvpn/easy-rsa/keys/client.ovpn]
2# Downgrade privileges after initialization (non-Windows only)
3user nobody
4group 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(安全副本)。
以下是使用我们的client1
示例的 SCP 命令,它将文件client1.key
放入本地计算机的 Downloads 目录。
1scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/
以下是几个工具和教程,以安全地将文件从服务器传输到本地计算机:
在本节的末尾,请确保您的客户端设备上有以下四个文件:
- ``client1
.crt
- ``client1
.key
client.ovpn
ca.crt
步骤 9 — 为客户端设备创建统一的 OpenVPN 配置文件
管理客户端文件有几种方法,但最简单的方法是使用一个 unified 配置文件,这是通过修改client.ovpn
模板文件,以包括服务器的证书权威,以及客户端的证书及其密钥。
下面的区域需要显示的三个行评论,所以我们可以直接在client.ovpn
文件中包含证书和密钥。
1[label /etc/openvpn/easy-rsa/keys/client.ovpn]
2# SSL/TLS parms.
3# . . .
4;ca ca.crt
5;cert client.crt
6;key client.key
保存更改和退出,我们将按代码添加证书。
首先,添加证书权限。
1echo '<ca>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
2cat /etc/openvpn/ca.crt >> /etc/openvpn/easy-rsa/keys/client.ovpn
3echo '</ca>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
第二,添加证书。
1echo '<cert>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
2cat /etc/openvpn/easy-rsa/keys/client1.crt >> /etc/openvpn/easy-rsa/keys/client.ovpn
3echo '</cert>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
第三,最后添加钥匙。
1echo '<key>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
2cat /etc/openvpn/easy-rsa/keys/client1.key >> /etc/openvpn/easy-rsa/keys/client.ovpn
3echo '</key>' >> /etc/openvpn/easy-rsa/keys/client.ovpn
现在我们有一个统一的客户端配置文件. 使用scp
,您可以将client.ovpn
文件复制到您的第二个系统。
步骤 10 – 安装客户端配置文件
不同的平台都有更易于使用的应用程序来连接到这个 OpenVPN 服务器. 有关平台特定的说明,请参阅 本教程中的步骤 5。
结论
恭喜您!您现在有运行的 OpenVPN 服务器和客户端文件。
在您的 OpenVPN 客户端,您可以使用 Google 揭示您的公共 IP来测试连接。 在客户端上,在启动 OpenVPN 连接之前一次加载,然后再一次加载。