ubuntu-16-04上安装openvpn服务器(一)

ubuntu 16.04上安装openvpn(一)

ubuntu 上安装配置openvpn,仅密钥认证,记录备忘。

要求

  • ubuntu 16.04服务器
  • 已经配置sudo权限的用户。

step one: 安装openvpn

首先在服务器上安装openvpn。在ubuntu的默认软件库中有openvpn,所以可以直接使用apt命令进行安装。然后需要安装easy-rsa软件包,这个包用于建立一个内部ca(certificate authority,证书颁发机构),供vpn使用。

1
2
sudo apt update
sudo apt install openvpn easy-rsa

这样需要用到的软件就安装好了。

step two: 创建ca目录

openvpn是一个tls/ssl vpn。这表示它使用证书来加密服务器和客户端之间的流量,我们需要建立自己的简单认证机构(CA)。

首先,我们可以使用make-cadir命令将easy-rsa模板目录复制到我们的主目录中:

1
make-cadir ~/openvpn-ca

也可以使用以下命令代替:

1
2
mkdir ~/openvpn-ca
cp -r /usr/share/easy-rsa/* ~/openvpn-ca

setp three: 配置ca变量

进入新创建的目录,开始配置ca。

在这个文件夹中,你可以找到一些变量,这些变量用来决定你的证书是如何创建的。

在文件底部,找到类似下面的行,这些行为为新证书设置了一些默认值:~/openvpn-ca/vars

1
2
3
4
5
6
7
8
9
10
11
12
...
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
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_NAME的值,为了简单起见,在这施教程中我们把它设成server:~/openvpn-ca/vars

1
export KEY_NAME="server"

step four: 建立证书颁发机构

现在我们可以使用我们刚才设置的变量和easy-rsa程序来构建我们的证书颁发机构。

确保你现在ca目录下,然后source刚刚编辑的vars文件:

1
2
cd ~/openvpn-ca
source vars

如果source正确的话,那么会看到:

1
2
Output
NOTE: If you run ./clean-all, Iwill be doing a rm -rf on /home/sammy/openvpn-ca/keys

确保我们在一个干净的环境中操作:

1
./clean-all

现在可以通过以下命令来构建根ca:

1
./build-ca

这会启动创建要证书颁发机构的密钥及证书的过程。由于我们上面修改了vars文件,所有的值都会自动填充。只需要根据提示按enter键确认选择即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Output
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) [NY]:
Locality Name (eg, city) [New York City]:
Organization Name (eg, company) [DigitalOcean]:
Organizational Unit Name (eg, section) [Community]:
Common Name (eg, your name or your server's hostname) [DigitalOcean CA]:
Name [server]:
Email Address [admin@email.com]:

现在我们有了ca,可以用来创建我们需要的其它文件。

step five: 创建服务器证书、密钥和加密文件

下面,我们会生成服务器证书以及密钥对,以及加密过程中需要的其它文件。

首先生成openvpn服务器证书及密钥对:

注意:如果你选择的名字不是server, 那么下面的指导中需要做些调整。比如,在把生成的文件复制到/etc/openvpn目录下时,必须替换为正确的名称。你还需要修改/etc/openvpn/server.conf文件以指向正确的.crt和.key文件。

1
./build-key-server server

现在,你只需要按enter键接受默认值即可。在最后的时候,你需要为两个问题输入y来签署和提交证书:

1
2
3
4
5
6
7
8
9
10
Output
. . .

Certificate is to be certified until May 1 17:51:16 2026 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

接下来,我们将生成一些其它项。我们可以通过下面的命令生成强大的deffie-hellman密钥以在密钥交换的过程中使用:

1
./build-dh

这会花费几分钟的时间。

之后,我们可以生成一个HMAC签名来加强服务器的tls完整性验证功能。

1
openvpn --genkey --secret keys/ta.key

step six: 生成客户端证书和密钥对

接下来,我们可以生成客户端证书和密钥对。尽管这可以在客户端机器上完成,然后出于安全的目的由服务器ca进行签名,但为了简单起见,在本指南中我们将在服务器上生成签名密钥。

本指南中我们会生成一个客户端密钥证书,但如果你有多个客户端,可以根据需要多次重复此过程。为每个客户传递一个唯一值给脚本。

因为你可能会回到这一步,我们会生新source vars文件。本指南中我们会使用client1作为证书/密钥对的值。

输入如下命令:

1
2
3
cd ~/openvpn-ca
source vars
./build-key client1

同样,默认值会自动直译,所以只要按enter键继续。将密码留宿,并确保对是否签名并提交证书的问题输入y。

step seven: 配置openvpn服务

下面我们会使用生成的证书以及文件来配置openvpn服务。

拷贝文件到openvpn目录
首先,我们需要把必要的文件拷贝到/etc/openvpn配置目录中。

可以从我们刚刚生成的所有文件开始。这些文件在生成的时候位于~/openvpn-ca/keys目录下。我们需要移动ca证书、服务器证书和密钥,hmca签名以及diffie-hellman文件:

1
2
cd ~/openvpn-ca/keys
sudo cp ca.crt server.crt server.key ta.key dh2048.pem /etc/openvpn

然后,我们需要拷贝并触感一个简单的openvpn配置文件到配置目录中:

1
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

修改openvpn配置

现在我们可以修改服务器配置文件了:

1
sudo vim /etc/openvpn/server.conf

基本配置

首先,通过查找tls-auth指定到hmac部分。删除”;”来取消注释tls-auth行。在下面添加key-direction参数并设置为“0”,:/etc/openvpn/srver.conf

1
2
tls-auth ta.key 0 # This is secret
key-direction 0

然后通过查找注释掉的cipher行来加密密码部分。aes-128-cbc密码提供了很好的加密级别。删除“:”以取消cipher-aes-128-cbc行的注释:/etc/openvpn/server.conf

1
cipher AES-128-CBC

在这一行下面加上suth行来先择hmac消息算法。sha256就很好:/etc/openvpn/server.conf

1
auth SHA256

最后找到user和group设置并删除“;”以取消注释:/etc/openvpn/server.conf

1
2
user nobody
group nogroup

(可选)重定向所有流到vpn

上面的设置会建立两台机器之间的vpn连接,但是不会强制任何使用隧道。如果你希望使用vpn来路由所有的流量,那么你需要将dns设置摄像头到客户端电脑。

取消那些注释掉配置客户端生定向所有流到vpn的指令。找到redirect-gateway部分并删除“;”:/etc/openvpn.server.conf

1
push "redirect-gateway def1 bypass-dhcp"

在下面找到dhcp-option部分,删除“;”:/etc/openvpn/server.conf

1
2
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

这应该有助于客户端重新的配置dns设置,以使用vpn隧道作为默认网关。

(可选)修改端口和协议

默认情况下,openvpn服务器使用的端口1194和udp协议来接受客户端连接。如果你需要使用不同的端口,是可以更改端口选项的。可以用端口443,因为一般这个是衩防火墙规则允许的:/etc/openvpn/server.conf

1
2
# optional!
port 443

通过协议也会被限制在该端口,如果是这样的话,把协议从udp修改到tcp:/etc/openvpn/server.conf

1
2
# optional!
proto tcp

如果你不需要使用不同的端口,最好把两个设置设为默认值。

(可选)指向非默认证书

如果之前在./build-key-server命令中使用了其它的名字,需要修改cert和key行指向正确的.crt和.key文件。如果使用了默认的server,则应该已经正确设置:/etc/openvpn/server.conf

1
2
cert server.crt
key server.key

完成之后,保存并关闭文件。

step eight: 修改服务器网络配置

下面我们需要对服务器的网络做一些高速便利openvpn可以正确的路由流量。

允许ip转发

首先,我们需要允许服务器转发流量。这对于我们希望vpn服务器提供的功能是非常重要的。

可以通过修改/etc/sysctl.conf文件来高速设置:

1
sudo vim /etc/sysctl.conf

找到设置net.ipv4.ip_forward的那一行,删除这行前面的“#“:/etc/sysctl.conf

1
net.ipv4.ip_forward=1

保存并关闭文件。

要读取文件并高速当前会话的值,请输入:

1
sudo sysctl -p

调整ufw规则以伪装客户端连接

我们需要修改规则文件来设置伪装,这是一个iptables的概念,它提供了即时动态的nat来正确路由客户端连接。

在打开防火墙配置文件添加伪装之前,我们需要找到机器的公网接口。为此,请输入:

1
ip route | grep default

你的公网接口应该在单词“dev”后面。比如,下面结果显示了名为wlplls0的接口:

1
2
Output
default via 203.0.113.1 dev wlp11s0 proto static metric 600

当你的接口与默认路由相关联时,打开/etc/ufw/before.rules文件来添加相关配置:

1
sudo vim /etc/ufw/before.rules

这个文件处理在加载传统ufw规则之前应该文墨的配置。在文件顶部添加下面的行。这会为nat表中的postrouting链接设置默认策略,并伪装来自vpn的所有流量:/etc/ufw/before.rules

注意:刻把-A POSTROUTINGT中的wlplls0换成你自己的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#
# 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 wlp11s0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o wlp11s0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

# Don't delete these required lines, otherwise there will be errors
*filter
. . .

保存并关闭文件。

我们需要告诉ufw默认允许转发数据包。为些,我们打开/etc/default/ufw文件:

1
sudo vim /etc/default/ufw

找到default_forward_policy指令,把值从drop改成accetp:/etc/default/ufw:

1
DEFAULT_FORWARD_POLIEY="ACCEPT"

保存并关闭文件。

打开openvpn端口并雇用更改

下面,我们将高速防火墙本身以允许流量到openvpn。

如果你没有改变/etc/openvpn/server.conf文件中的端口和协议,你需要打开udp流量到端口1194。如果你修改了端口和协议,请使用你选择的值。

我们还会添加ssh端口:

1
2
sudo ufw allow 1194/udp
sudo ufw allow openssh

现在我们禁用然后生新雇用ufw来加载所有修改过的文件中的更改项:

1
2
sudo ufw disable
sudo ufw enable

服务器现在配置成可以正确处理openvpn流量。

step nine: 启动并启用openvpn服务

我们终于准备好在服务器上启动openvpn服务了。可以使用systemd来做到这点。

我们需要通过systemd单元文件名称后面指定的配置文件名作为实像变量来启动openvpn服务器。我们服务器的配置文件叫做/etc/openvpn/srver.conf。所以我们会在单元文件的末尾添加@server:

1
sudo systemctl start openvpn@server

通过下面的命令来检查服务是否成功启动:

1
sudo systemctl stauts openvpn@server

如果一切正常的话,那么你的输出应该看起来像如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
● openvpn@server.service - OpenVPN connection to server
Loaded: loaded (/lib/systemd/system/openvpn@.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-08-04 18:07:06 UTC; 2 days ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 7130 (openvpn)
CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
└─7130 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-secur

Aug 07 14:33:44 vultr.guest ovpn-server[7130]: 112.10.253.234:30160 [client1] Peer Connection Initiated with [AF_INET]112.10.253
Aug 07 14:33:44 vultr.guest ovpn-server[7130]: MULTI: new connection by client 'client1' will cause previous active sessions by
Aug 07 14:33:44 vultr.guest ovpn-server[7130]: MULTI_sva: pool returned IPv4=10.8.0.6, IPv6=(Not enabled)
Aug 07 14:33:44 vultr.guest ovpn-server[7130]: MULTI: Learn: 10.8.0.6 -> client1/112.10.253.234:30160
Aug 07 14:33:44 vultr.guest ovpn-server[7130]: MULTI: primary virtual IP for client1/112.10.253.234:30160: 10.8.0.6
Aug 07 14:33:48 vultr.guest ovpn-server[7130]: client1/112.10.253.234:30160 PUSH: Received control message: 'PUSH_REQUEST'
Aug 07 14:33:48 vultr.guest ovpn-server[7130]: client1/112.10.253.234:30160 send_push_reply(): safe_cap=940
Aug 07 14:33:48 vultr.guest ovpn-server[7130]: client1/112.10.253.234:30160 SENT CONTROL [client1]: 'PUSH_REPLY,redirect-gateway
Aug 07 14:37:48 vultr.guest ovpn-server[7130]: client1/112.10.253.234:30160 [client1] Inactivity timeout (--ping-restart), resta
Aug 07 14:37:48 vultr.guest ovpn-server[7130]: client1/112.10.253.234:30160 SIGUSR1[soft,ping-restart] received, client-instance

你也可以通过以下命令来检查openvpn tun0接口是否可用:

1
ip addr show tun0

你应该看到一个配置接口:

1
2
3
4
5
Output
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft forever

如果一切正常的话,雇用服务以便在服务器启动的时候自动启动:

1
sudo systemctl enable openvpn@server

step ten: 创建客户端

下面我们需要建立一个系统,使我们能够轻松创建客户端配置文件。

创建客户配置目录结构

在home目录下创建一个目录结构用来保存文件:

1
mkdir -p ~/client-configs/files

因为我们的客户端配置文件将嵌入客户密钥,我们应该锁定内部目录的权限:

1
chmod 700 ~/client-configs/files

创建一个基本配置

下面我们将示例客户端配置拷贝到我们的目录中作为一个基本配置:

1
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

打开这个文件:

1
vim ~/client-configs/base.conf

首先,定位到remote指令。把这个客户指向到我们的openvpn服务器地址。这应该是你的openvpn服务器公网ip地址。如果你修改了openvpn服务器正在侦听的接口,那么把1194改成你选择的接口:~/client-configs/base.conf

1
2
3
4
5
6
. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote server_IP_address 1194
. . .

确保协议和你在服务器里配置中使用的一样:~/client-configs/base.conf

1
proto udp

下面,删除“;”取消注释user和group指令:~/client-configs/bash.conf

1
2
3
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

找到设置ca,cert,key的指令,注释掉这些指定,因为我们会在文件本身中添加certs和keys:~/client-configs/base.conf

1
2
3
4
5
6
7
8
9
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
#ca ca.crt
#cert client.crt
#key client.key

修改cipher和auth为我们在/etc/openvpn/server.conf文件中设置的:~/client-configs/base.conf

1
2
cipher AES-128-CBC
auth SHA256

下面,在文件中添加key-direction指令。必须设置成1才能使用服务器:~/client-configs/base.conf

1
key-direction 1

如果你的客户端运行在linux上并且具有/etc/openvpn/update-resolv-config文件,那么应该从生成的openvpn客户端配置文件取消注释这些行。

保存文件。

创建配置生成脚本*

下面,我们会创建一个简单的脚本,用相关证书、密钥和加密文件来编译我们的基本配置。这会把生成的配置文件放在~/client-configs/files目录下。

在~/client-configs目录下创建并打开文件make_config.sh

1
vim ~/client-configs/make_config.sh

粘贴以下脚本到这个文件中:~/client-configs/make_config.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn

保存并关闭文件。

通过以下命令把这个脚本文件设置为可执行:

1
chmod 700 ~/client-configs/make_config.sh

step eleven: 生成客户端配置

现在可以很容易地生成客户端配置文件。
如果你遵守这篇指南,那么在步骤六中通过运行./build-key client1命令,分别创建了一个客户端证书client1.crt和密钥client1.key。我们可以使用创建脚本文件生成配置:

1
2
cd ~/client-configs
./make_config.sh client1

如果一切正常的话,那么在~/client-configs/files目录下,会生成一个client1.ovpn文件:

1
ls ~/client-configs/files
1
2
Output
client1.ovpn

把配置文件伟到客户端

我们需要把客户端配置文件传输到相关设备上。比如,你的本地计算机或者一个移动设备。

虽然用于完成此传输的程序取决于你的选择和设备的操作系统。但你希望应用程序在后端使用sftp和scp。这将通过加密连接传输客户端的vpn认证文件。

以下是使用sftp命令传输client1.ovpn的示例。这个命令可以在你的本地计算机(MAC OS X或linux)运行。它把.ovpn文件放到你的主目录中:

1
sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/

当然,你也可以选择其它方式把服务器上的.ovpn文件传到你的本地计算机或或者其它设备中。


ubuntu-16-04上安装openvpn服务器(一)
https://ywmy.xyz/2018/08/08/ubuntu-16-04上安装openvpn服务器-1/
作者
ian
发布于
2018年8月8日
许可协议