介绍
OpenVPN是一个开源VPN应用程序,它允许您通过公共Internet安全地创建和加入专用网络。 简而言之,这允许最终用户屏蔽连接并更安全地导航不可信网络。
据说,本教程教你如何在Debian 8上设置OpenVPN,一个开源的安全套接字层(SSL)VPN解决方案。
先决条件
本教程假设您具有以下内容:
- 一个新的Debian 8.1Droplet
- 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
在这个文件中,我们将需要做四个更改(每个都将详细解释):
- 使用较高级别加密的安全服务器
- 将网络流量转发到目标
- 防止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访问权限。 我们将代替限制OpenVPN的用户nobody和组nogroup。 这是一个没有默认登录功能的非特权用户,通常保留用于运行不受信任的应用程序,如面向Web的服务器。
现在保存您的更改并退出。
第3步 - 启用数据包转发
在本节中,我们将告诉服务器的内核将流量从客户端服务转发到Internet。 否则,流量将在服务器停止。
通过输入以下命令在运行时启用包转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
接下来,我们需要将此设置设为永久,以便在服务器重新启动后此设置仍然存在。 打开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
本教程将使用OpenVPN的通过UDP,所以UFW还必须允许通过端口的UDP流量1194
。
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.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
的键名。 如果要使用不同的名称,你还需要更新引用OpenVPN的配置文件server.key
和server.crt
。
下面,在同一个文件中,我们将指定正确的证书。 寻找该行,紧接在读取的先前修改的块之后
# X509 Subject Field
export KEY_NAME="EasyRSA"
更改KEY_NAME
的的默认值EasyRSA
到您想要的服务器名称。 本教程将使用的名称server
。
# X509 Subject Field
export KEY_NAME="server"
保存并退出。
接下来,我们将生成使用内置的OpenSSL工具,称为的Diffie-赫尔曼参数dhparam
; 这可能会需要几分钟。
该-out
标志指定在哪里保存新的参数。
openssl dhparam -out /etc/openvpn/dh2048.pem 2048
我们的证书现在生成,是时候生成一个密钥。
首先,我们将切换到easy-rsa
目录。
cd /etc/openvpn/easy-rsa
现在,我们可以开始设置CA本身。 首先,初始化公钥基础设施(PKI)。
注意点(。)和空格前面./vars
命令。 这表示当前工作目录(源)。
. ./vars
将打印以下警告。 不用担心,因为在警告指定的目录是空的。 NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
。
接下来,我们将清除所有可能干扰我们安装的其他键。
./clean-all
最后,我们将使用OpenSSL命令构建CA。 此命令将提示您确认先前输入的“可分辨名称”变量。 按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的不允许服务器来自客户端使用相同的证书和密钥的并发连接。 (见duplicate-cn
在/etc/openvpn/server.conf
)。
要为每一个要连接到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
然后,我们将复制生成的关键易于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地址,以便它知道要连接到什么。 打开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
,就像我们在server.conf
第1步注:这并不适用于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身份验证文件。
下面是使用我们的一个例子SCP命令client1
例子。 它放置文件client1.key
到本地计算机上的下载目录。
scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/
这里有几个工具和教程,用于将文件从服务器安全地传输到本地计算机:
在本节结束时,请确保您有您的客户端设备上这四个文件:
- `
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客户端,您可以使用测试连接谷歌透露自己的公网IP 。 在客户端上,在启动OpenVPN连接之前加载一次,之后加载一次。 IP地址应该更改。