如何在Ubuntu 15.04上配置OpenVPN Server-Client
虚拟专用网(VPN)是多种技术的通用名称,这些技术允许在其他网络上建立网络连接。
之所以称为虚拟,是因为节点之间通过非物理线路相连。
并且由于没有网络所有者的公共访问权而没有公共访问网络,因此它是私有的。
OpenVPN软件使用TCP和UDP协议并在TUN/TAP驱动程序的帮助下传输数据。
UDP协议和TUN驱动程序允许为NAT之后的客户端建立与OpenVPN服务器的连接。
另外,OpenVPN允许指定自定义端口。
它提供了另外的配置灵活性,并可能有助于避免防火墙的限制。
由库OpenSSL和传输层安全性(TLS)提供的OpenVPN中的安全性和加密。
TLS是SSL协议的改进版本。
OpenSSL提供两种加密:对称加密和非对称加密。
下面我们展示了如何配置OpenVPN的服务器端,以及如何为使用非对称密码和TLS协议与公钥基础结构(PKI)做一切准备。
服务器端配置
首先,我们必须安装OpenVPN。
在Ubuntu 15.04和其他带有“ apt”软件包管理器的Unix系统中,可以按以下步骤进行操作:
sudo apt-get install openvpn
然后,我们必须设置一个密钥。
这可以使用默认工具“ openssl”来完成。
但是这种方式相当困难。
这就是为什么我们可以为此目的使用“ easy-rsa”的原因。
下一条命令将“ easy-rsa”安装到我们的系统中
sudo apt-get unstall easy-rsa
备说明:所有具有超级用户权限的下一条命令,例如:命令“ sudo -i”之后;否则,我们可以将“ sudo -E”用作所有下一个命令的前缀。
首先,我们需要将“ easy-rsa”复制到openvpn文件夹中
mkdir /etc/openvpn/easy-rsa cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa mv /etc/openvpn/easy-rsa/easy-rsa /etc/openvpn/easy-rsa/2.0
并进入它
cd /etc/openvpn/easy-rsa/2.0
其中我们开始一个密钥生成过程。
首先,我们编辑一个“ var”文件。
为了简化生成过程,我们需要其中指定数据。
这是“ var”文件的示例:
export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="[email protected]" export KEY_OU=server
希望字段名称是明确的,不需要对其进行其他描述。
其次,我们需要复制openssl配置。
有不同版本的配置。
如果我们没有任何特定要求,请使用它的最新版本。
这是一个1.0.0版本。
cp openssl-1.0.0.cnf openssl.cnf
第三,我们需要加载环境变量,我们在上一步中对其进行了编辑
source ./vars
准备密钥生成的最后一步是刷新旧证书和密钥,以及生成新密钥的序列和索引文件。
这可以通过使用命令来完成
./clean-all
现在,我们完成准备工作并准备开始生成过程。
让我们先生成证书
./build-ca
在对话框中,我们看到默认的变体,我们之前在“ vars”文件中指定了默认变体。
我们可能会检查它们,根据需要进行编辑,然后按两次ENTER。
对话框如下
Generating a 2048 bit RSA private key .............................................+++ ...................................................................................................+++ writing new private key to 'ca.key' ---- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ---- Country Name (2 letter code) [US]: State or Province Name (full name) [CA]: Locality Name (eg, city) [SanFrancisco]: Organization Name (eg, company) [Fort-Funston]: Organizational Unit Name (eg, section) [MyOrganizationalUnit]: Common Name (eg, your name or your server's hostname) [Fort-Funston CA]: Name [EasyRSA]: Email Address [[email protected]]:
接下来,我们需要生成一个服务器密钥
./build-key-server server
该命令的对话框如下所示:
Generating a 2048 bit RSA private key ........................................................................+++ ............................+++ writing new private key to 'server.key' ---- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ---- Country Name (2 letter code) [US]: State or Province Name (full name) [CA]: Locality Name (eg, city) [SanFrancisco]: Organization Name (eg, company) [Fort-Funston]: Organizational Unit Name (eg, section) [MyOrganizationalUnit]: Common Name (eg, your name or your server's hostname) [server]: Name [EasyRSA]: Email Address [[email protected]]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'US' stateOrProvinceName :PRINTABLE:'CA' localityName :PRINTABLE:'SanFrancisco' organizationName :PRINTABLE:'Fort-Funston' organizationalUnitName:PRINTABLE:'MyOrganizationalUnit' commonName :PRINTABLE:'server' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'[email protected]' Certificate is to be certified until Jan 22 19:00:25 2025 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
其中我们必须对有关“签署证书”和“提交”的最后两个问题回答“是”。
现在我们有了证书和服务器密钥。
下一步是生成Diffie-Hellman密钥。
执行以下命令,请耐心等待。
在接下来的几分钟内,我们将看到许多点和加号符号。
./build-dh
我们可以在下面找到此命令的输出示例
Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ................................+................<and many many dots>
经过漫长的等待,我们可以移至生成最后一个密钥。
这是TLS身份验证的关键。
这是一个命令:
openvpn --genkey --secret keys/ta.key
现在,生成已完成,我们可以将所有生成的文件移动到最终位置。
cp -r /etc/openvpn/easy-rsa/2.0/keys//etc/openvpn/
最后,我们创建OpenVPN配置文件。
让我们从示例中复制它:
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ cd /etc/openvpn gunzip -d /etc/openvpn/server.conf.gz
然后编辑
vim /etc/openvpn/server.conf
我们需要指定键的自定义路径
ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/server.crt key /etc/openvpn/keys/server.key # This file should be kept secret dh /etc/openvpn/keys/dh2048.pem
重新启动OpenVPN之后,服务器端的配置完成。
service openvpn restart
Unix的客户端配置
假设我们有一台具有Unix之类的操作系统的设备,例如Ubuntu 15.04,并且已安装OpenVPN。
我们想从上一节连接到OpenVPN服务器。
首先,我们需要客户的钥匙。
要生成此密钥,请转到服务器上的文件夹:
cd /etc/openvpn/easy-rsa/2.0
加载环境变量
source vars
并创建一个客户端密钥
./build-key client
我们将看到与上一节有关服务器密钥生成的部分中所述的对话框相同。
其中填写有关客户的实际信息。
如果需要密码保护密钥,则需要运行其他命令。
这里是
./build-key-pass client
在这种情况下,将在开始建立VPN连接时提示我们输入密码。
现在我们需要将以下文件从服务器复制到客户端到/etc/openvpn/keys /文件夹中。
来自服务器的文件列表:
- cart
- dh2048.pem,
- client.crt,
- client.key,
- ta.key。
之后,我们转到客户端并准备配置文件。
文件的位置是/etc/openvpn/client.conf,其内容显示在下面
dev tun proto udp # IP and Port of remote host with OpenVPN server remote 111.222.333.444 1194 resolv-retry infinite ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/client.crt key /etc/openvpn/keys/client.key tls-client tls-auth /etc/openvpn/keys/ta.key 1 auth SHA1 cipher BF-CBC remote-cert-tls server comp-lzo persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log verb 3 mute 20
之后,我们需要重新启动OpenVPN以接受新配置。
service openvpn restart
就是这样,客户端的配置已经结束。
Android的客户端配置
Android设备上的OpenVPN配置与Unix系统上的配置非常相似。
我们需要一个带有配置文件,密钥和证书的软件包。
以下是它们的列表:
- 配置文件(.ovpn),
- cart
- dh2048.pem,
- client.crt,
- client.key。
客户端密钥可以通过上一节中所述的相同方式生成。
配置文件有以下内容
client tls-client dev tun proto udp # IP and Port of remote host with OpenVPN server remote 111.222.333.444 1194 resolv-retry infinite nobind ca ca.crt cert client.crt key client.key dh dh2048.pem persist-tun persist-key verb 3 mute 20
所有这些文件我们必须在设备的SD卡上移动。
然后,我们需要安装OpenVPN Connect。
下一步配置过程非常简单:
- 打开OpenVPN的设置,然后选择导入选项
- 选择从SD卡导入配置文件选项
- 在打开的窗口中,转到包含准备好的文件的文件夹,然后选择.ovpn文件
- 应用程序为我们提供了创建新配置文件的方法
- 点击“连接”按钮,然后等待一秒钟
现在,我们的Android设备已使用安全的VPN连接连接到我们的专用网络。