目的
了解如何在Ubuntu 18.04 Bionic Beaver上安装和配置Openvpn服务器
要求
- 根权限
困难
介质
约定
介绍
虚拟专用网络技术可以通过使用不太安全的网络(例如Internet)来访问安全的专用网络。 VPN通常用于连接组织的物理远程分支机构,从而使它们看起来好像它们是同一LAN的一部分(例如,不同城市中的两个办公室)。使用隧道对连接双方之间的流量进行加密,从而保护传输的数据和连接信息本身。出于相同的特征,VPN通常用于规避政府的限制并匿名化互联网流量。
在本教程中,我们将了解如何使用Ubuntu 18.04 Bionic Beaver上的开源VPN软件OpenVPN创建虚拟专用网络服务器。
第1步-安装
在Ubuntu 18.04上安装OpenVPN非常容易:默认存储库中提供了该软件。我们还需要安装easy-rsa
软件包,它将帮助我们创建所需的证书和密钥:
$ sudo apt-get update && sudo apt-get install openvpn easy-rsa
几秒钟后,该软件将安装在我们的计算机中,可以进行配置了。
第2步-服务器基础架构设置
在本节中,我们将生成所需的证书和密钥:首先,我们将创建自定义CA
(证书颁发机构),那么我们将生成服务器certificate/key pair
,Diffie-Hellman
参数和tls-auth key
。
让我们从生成目录开始,该目录将包含将为我们完成繁重工作的脚本。我们运行make-cadir
命令,这是easy-rsa
包,提供我们要创建的目录的名称。我们还希望在创建目录后立即输入该目录:
$ make-cadir certificates && cd certificates
在这种情况下,我将目录称为certificates
。这将是本教程其余部分的工作目录,因此,必须将所有提及的命令视为在其中启动的命令。
步骤2.1-变量设置
首先,我们需要调整变量,这些变量将用于设置在证书颁发机构和证书/密钥生成期间使用的值。变量在内部定义vars
文件:
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
一个非常重要的变量是KEY_CONFIG
,默认情况下是通过调用一些包装程序脚本来设置的,该脚本应检索正确的ssl配置。但是,如果以这种方式使用,则会生成错误,因为脚本不会检索配置。为了避免这种情况,我们直接指定配置文件:
export KEY_CONFIG="$EASY_RSA/openssl-1.0.0.cnf"
其他变量的值必须更改并适应您的特定需求。编辑完文件后,必须”source”才能使变量成为运行时环境的一部分:
$ source vars
步骤2.2-生成CA
我们可以继续并生成我们的CA(证书颁发机构)。运行clean-all
和build-ca
脚本顺序。将使用我们在vars
文件作为相应字段的默认值:
$ ./clean-all && ./build-ca
步骤2.3-证书和密钥生成
下一步是为服务器生成证书和密钥。只需运行build-key-server脚本即可,给出我们要用于证书的名称以及密钥作为参数。在这种情况下,我们使用”server”,因为它是vpn配置文件中使用的默认名称,我们将在本教程中进一步了解:
$ ./build-key-server server
请按照屏幕上的说明进行操作。的challenge password
和company name
字段是可选的。
步骤2.4-Diffie-Hellman参数生成
下一步是创建Diffie-Hellman参数。这些参数用于使用公共和不安全通道交换密码密钥。我们使用build-dh
脚本:
$ ./build-dh
该脚本将花费一些时间来生成参数,具体取决于我们正在运行的机器,请耐心等待!
步骤2.5-生成一个随机密钥以用作共享密钥
为了增强我们的安全性,除了使用证书之外,我们还将生成并使用密钥来使用共享密钥。服务器和每个客户端将需要此密钥的副本:
$ openvpn --genkey --secret keys/ta.key
步骤2.6-复制生成的文件
证书颁发机构(ca.crt),证书(server.crt),密钥(server.key),Diffie-Hellman参数(dh2048.pem)和tls-auth密钥(ta.key)文件应已在keys
目录。现在是时候将它们复制到/etc/openvpn
:
$ sudo cp keys/{server.crt,server.key,ca.crt,dh2048.pem,ta.key} /etc/openvpn
第3步-OpenVPN配置
我们可以继续配置OpenVPN服务。 (压缩的)样本配置可以在以下位置找到/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
:我们只需要将其解压缩到/etc /openvpn目录中即可:
$ gzip -d -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf > /dev/null
使用上面的命令,我们解压缩了原始文件,将其输出发送到stdout并通过/etc/openvpn/server.conf
文件。验证配置文件中的默认值是否与我们生成的默认值相对应:
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh2048.pem
步骤4-设置防火墙并允许IP转发
我们几乎完成了VPN服务器的设置:现在,我们必须设置防火墙,以便允许来自端口的传入流量1194/udp
(默认端口和协议):
$ sudo ufw allow openvpn
非常重要:默认情况下,仅客户端和服务器之间的流量通过VPN隧道传递,这不包括Internet流量。要更改此行为,我们首先必须取消注释该选项192
服务器配置文件(/etc/openvpn/server.conf
):
push "redirect-gateway def1 bypass-dhcp"
接下来,我们需要使用iptable规则通过Internet对VPN客户端进行NAT。请注意,我指定了eth0
接口,但是您需要根据计算机上使用的接口调整规则:
$ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
设置这种方式,但是,该规则将不会保留重启。为了使其持久,我们必须将其添加到/etc/ufw/before.rules
文件。该文件包含ufw在命令行定义的规则之前应用的规则。将规则添加为文件中的第一个规则:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
现在我们必须启用数据包转发。首先,我们需要编辑/etc/sysctl.conf文件并取消注释该行28
:
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
此时,我们应该重新加载配置:
$ sudo sysctl -p /etc/sysctl.conf
我们仍然需要允许通过ufw防火墙转发数据包。打开/etc/default/ufw
并改变DEFAULT_FORWARD_POLICY
从DROP
至ACCEPT
:
# Set the default forward policy to ACCEPT, DROP or REJECT. Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="ACCEPT"
最后,重新加载防火墙:
$ sudo ufw reload
第5步-启动服务
现在,我们将使用systemctl来启动服务器,将包含我们配置文件名称的变量传递给服务单元。通过使用systemd,我们可以在值前面加上@
符号。例如:
$ sudo systemctl start openvpn@server
此时,服务器应已启动并正在运行。通过运行验证
$ sudo systemctl is-active openvpn@server
该命令应返回”active”。
第6步-客户端设置
对于我们要使用的每个客户端,我们都必须生成一个证书/密钥对,就像我们对服务器所做的一样:
$ source vars && ./build-key client
现在,我们有两个选择:我们可以将必要的文件复制到客户端,也可以生成一个.ovpn
文件,其中嵌入了这些文件的内容。我们将专注于第二种选择。
就像我们在服务器端所做的一样,我们将以示例配置为起点。让我们创建一个专用目录并复制模板:
$ mkdir clients && cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf clients/client.ovpn
遵循文件中注释非常清楚的部分,并使选项适应服务器配置中定义的选项(在我们的示例中,该选项已完成)。通过修改设置(第42行)来设置服务器ip和端口:
remote my-server-1 1194
如果不使用默认值,则必须用服务器ip替换”my-server”,并且必须更改端口。接下来,取消注释以下行(61,62):
# Downgrade privileges after initialization (non-Windows only)
;user nobody
;group nogroup
现在,我们将用文件的实际内容替换对CA,证书,密钥,dh参数和tls-auth密钥的引用:这样,我们将创建一个嵌入的,易于导出的配置。第一个注释参考(第88-90和108行)
#ca ca.crt
#cert client.crt
#key client.key
#tls-auth ta.key 1
接下来,在适当的标签之间复制提到的文件的内容。证书颁发机构的内容必须包含在标签之间,内部证书文件的内容以及之间的密钥之间。仅作为示例,考虑一下CA:
<ca>
# Here goes the content of the ca.crt file
</ca>
对于tls-auth键,我们将执行以下操作:
key-direction 1
<tls-auth>
# The content of the ta.key file
</tls-auth>
最后,只需将文件导入客户端应用程序,就可以开始使用了。
Android连接示例
要从android连接到我们的openvpn服务器,我们将使用官方的openvpn应用程序:OpenVpn Connect。安装并启动后,将出现以下菜单:
点击最后一项,OVPN Profile
在文件选择器中,导航到.ovpn文件的存储位置,然后选择它,然后点击右上角的”import”。该配置文件应该已经正确导入:
现在,与以前一样,点击添加,然后在以下屏幕上激活连接:
成功!