在 Ubuntu16.04 上如何建立 openvpn 服务器

(译注:这篇原文翻译是我提供的,承蒙站长不弃,审核通过。但是,第一段分错了,只有个图片,故写几句话吧。openVPN可能许多人都使用过,但是如何配置openVPN服务端,也许尝试的人不多。我选择这篇文章,私心也是自己想学习实践一把。我的想法是使用 VirtualBox搭建虚拟机,在虚拟机和主机,或虚拟机之间模拟。)
Linux

介绍

从一个不可信任的网络,诸如 酒店或咖啡屋的公共 WiFi 上使您的手机或笔记本上互联网,如何保证您上网的私密和安全?虚拟专用网络(Virtual Private Network) (VPN)可能是您的最佳选择。 建立 VPN ,可以使您的网络访问安全私密地通过VPN数据交换。虽然,VPN 网络数据是通过不安全的基础网络传输的。

HTTPS connections 技术是使用http 网络服务(网站访问)时,通过加密连接防止中间网络劫持者嗅探您访问内容(如 登录密码、IP地址、位置信息等)的安全防护措施。(现在大部分网站都提供 https 连接,若您连接到 http ,多数网络浏览器还会弹出安全提醒)https 安全与 VPN 的结合,使您在网上冲浪时,安全,私密。

OpenVPN 是一套开源的、基于安全套接字层( Secure Socket Layer (SSL) )的 VPN 解决方案软件。它广泛适应各种应用需要。本教程,在 Droplet 上建立 OpenVPN 服务,并配置它接受 Windows,OS X,iOS 和 Android 安全连接访问。 教程包括安装、配置所有的步骤和说明,并尽量使其简单易懂。

注: 如果您计划 OpenVPN 服务建在 DigitalOcean Droplet 上,您要知道这个服务不限制网络访问流量,但超出限额是要额外付费。因此,认真计划控制您运程操作服务器使用的网络流量。

参考 this page 获取更多信息。

必备条件

完成此教程,必须可以访问到一台 Ubuntu 16.04 服务器。

必须配置一个非 root (non-root)用户,开启它的 sudo 权限。可以参考 干净的Ubuntu 16.04 服务器安装指南 。链接的教程也创建了 防火墙「firewall」,假定已配置好。

当准备开始,用创建的拥有 sudo 权限的用户登录到 Ubuntu 服务器,然后继续。

步骤 1:安装 OpenVPN

最初,我们将安装 OpenVPN 到 Ubuntu 服务器上。OpenVPN 在 Ubuntu 默认软件库中就有。因此,使用 Ubuntu 的软件包管理器 apt 进行安装。我们也安装了 easy-rsa 软件包,其提供了自验证安全证书(CA)能力。

更新服务器上的软件库目录,安装上述两个软件包,命令如下:

$ sudo apt-get update
$ sudo apt-get install openvpn easy-rsa

需要的软件安全到服务器上,下面去配置它们。

步骤2:创建 CA 目录

OpenVPN 是基于 TLS/SSL 的虚拟专用网络(VPN),意味着其使用安全证书(密钥文件)加密服务端与客户端之间的数据传输。需要一个认证机构回答客户端和服务端对证书信任的质询。为了简单化,我们需要在服务端建立自己的认证机构(CA)。

开始,我们拷贝 easy-rsa 模板目录到我们 home 目录,这个过程可使用 easy-rsa 软件包中的命令 make-cadir 命令,后跟我们欲创建的目录名做为命令参数。命令如下:

make-cadir ~/openvpn-ca

进入新建的目录(openvpn-ca),开始配置证书认证机构(CA):

cd ~/openvpn-ca

步骤3:配置 CA 参数

配置我们自己的证书认证机构(CA),需要编辑~/openvpn-ca目录下的 vars 文件。使用您钟爱的文字编辑器打开vars文件:

$ nano vars

在文件内部,您会发现一些可调整的参数决定如何生成认证。我们只需认真调整其中很少一部分的参数。

先到文件的最后,会发现一系列默认生成认证的参数。应该像下面所示:

#~/openvpn-ca/vars

. . .

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"

. . .

由您愿意,编辑等号右面的值,只是别让它空着:

#~/openvpn-ca/vars

. . .

export KEY_COUNTRY="US"
export KEY_PROVINCE="NY"
export KEY_CITY="New York City"
export KEY_ORG="DigitalOcean"
export KEY_EMAIL="admin@example.com"
export KEY_OU="Community"

. . .

完成到这儿,我们还需编辑下面所示 KEY_NAME 的值,它是认证机构的主体。简单化,本指南中我们给它起名为 server

#~/openvpn-ca/vars
...

export KEY_NAME="server"

编辑好后,保存关闭文件。

步骤 4:创建本服务器的认证机构

现在,我们就能使用 easy-rsa 配置文件中的配置创建自己的认证机构。

保证当前在 CA 目录下,输入命令 source var

$ cd ~/openvpn-ca
$ source vars

若正确执行,将看到如下信息:

#Output 输出
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/sammy/openvpn-ca/keys
# 警告: 若运行 ./clean-all 命令,实际效果相当于 $ `rm -rf /home/sammy/openvpn-ca/keys`

确保我们创建过程在一个新的、干净的环境。运行如下命令:

$ ./clean-all

我们可以创建自己的根认证机构,输入如下命令:

$ ./build-ca

这将创建我们自己的根认证机构,并且生成根认证证书及密钥文件。由于我们已在 vars 文件中配置了各项参数。所有的值以默认值自动填入。若无修改,只需一路按ENTER 回车 键确认即可:

#Output
Generating a 2048 bit RSA private key #生成2048位 RSA 私有密钥
..........................................................................................+++
...............................+++
writing new private key to 'ca.key' # 私钥写入 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.
#你被请求输入的参数通常被称做一个 Distinguished Name 或简称为一个 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),由此,创建其他的必要的文件。

步骤 5:创建服务端证书,密钥和加密文件

接下来,我们将生成服务端证书和公钥/私钥对,如同其它必要附属文件一样,这些都是我们加密数据需要的。

开始生成服务端证书和密钥对。输入如下命令:

注意:在这儿,如果你使用不同于这里的 server 的另一名称,你必须相应调整后续的指令。例如,当拷贝在这里创建的文件到/etc/openvpn目录后,你必须替换正确的文件名,也许你必须修改 /etc/openvpn/server.conf配置文件中的参数使之正确指向到.crt.key文件。

$ ./build-key-server server

再次,一系列带有默认值参数的提示,这些默认值参数是我们在 vars 文件中设置,通过$ source vars 指令声明给我们运行脚本。

一路 ENTER 回车 键接受默认值。之后,脚本提示是否设置质询密码(challenge password)回车不设置(保证自动连接)。最后两个问题回答 y (提交对生成证书的验证):

#Output 输出
. . .

Certificate is to be certified until May  1 17:51:16 2026 GMT (3650 days)
Sign the certificate? [y/n]:y
#证书认证到 5月1日 17:51:16 2026 GMT (3650 天)
#是否证书签名?

1 out of 1 certificate requests certified, commit? [y/n]y
# 1个证书认证请求,是否认证?
Write out database with 1 new entries
# 1个新记录写入数据库
Data Base Updated
# 数据库已更新

接下来,再创建一些条目。可以生成密钥交换时使用的坚固的加密方式 Diffie-Hellman 的密钥。使用如下命令:

$ ./build-dh

这可能需多等待些时间。

之后,生成 HMAC 签名坚固整个 TLS 握手过程中的安全:

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

步骤 6:生成连接客户端的证书和密钥对

下面,我们生成连接客户端的证书和密钥对。虽然这步可以在连接客户端的机器上生成,然后由服务器进行签署。本教程里,为了简单化,在服务器机器上生成。

本教程中只生成单客户使用的密钥/证书。但若你要区分多个客户,生成多个客户的密钥/证书,可以多次重复这个生成过程,只需传参时为每个客户指定不同的名称即可。

由于你可能是之后回来再生成新客户,我们先再次导出 vars 文件中声明参数的默认值给接下来的命令脚本使用。我们使用 client1 作为本教程生成的第一个客户的密钥/证书。

生成无密码保护的信任证书,使客户能自动连接。如下使用 build-key 命令:

$ cd ~/openvpn-ca
$ source vars
$ ./build-key client1

若您想生成有密码保护的信任证书,使用 build-key-pass 命令如下:

$ cd ~/openvpn-ca
$ source vars
$ ./build-key-pass client1

带有默认值的提示会再次出现,您只需一路 ENTER 回车 接受默认值。质询密码回车不设,最后两个问题敲 y 确认完成。

步骤 7:配置 OpenVPN 服务

下一步,就可以利用生成的凭证文件配置 OpenVPN 服务了。

拷贝所需凭证文件到 OpenVPN 目录

先将必要的凭证文件拷贝到 OpenVPN 服务的配置目录 /etc/openvpn

这些必要的凭证文件都是我们之前步骤生成的,他们在 ~/openvpn-ca/keys目录下。包括: CA(认证机构)、服务端证书密钥(server cert and key)、HMAC 签名(signature)、Diffie-Hellman 文件:

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

下一步,解压 OpenVPN 配置例子文件并拷贝到 OpenVPN 配置目录 /etc/openvpn 里,作为开始配置 OpenVPN 的基础:

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

调整 OpenVPN 服务配置

现在,各文件就位,打开并修改服务配置文件/etc/openvpn/server.conf配置 OpenVPN 服务:

sudo nano /etc/openvpn/server.conf

基础配置

首先,找到 HMAC 段中 tls-auth 指令行,删除行首「;」 取消此指令行的注释,使之生效。

# /etc/openvpn/server.conf

tls-auth ta.key 0 # This file is secret 此文件隐秘

下一步,搜索找到 cipher 指令行(在 cryptographic ciphers 段)。 AES-128-CBC 算法提供优秀加密等级,兼容性好。删除cipher AES-128-CBC行首的「;」 取消此指令行的注释,使之生效

# /etc/openvpn/server.conf

cipher AES-128-CBC

这行下面,添加 auth 指令选择 HMAC 信息摘要算法,这里SHA256 是最佳选择:

# /etc/openvpn/server.conf

auth SHA256

最后,找到usergroup 指令行,同样删除行首「;」 取消指令行的注释,使它们生效:

# /etc/openvpn/server.conf

user nobody
group nogroup

(可选配置) 推送配置客户端使所有网络访问都通过VPN

上节配置完成,两台机器之间可创建VPN,但是未能使所有的网络数据都通过VPN 建立的隧道传输。如果你希望使用 VPN 路由所有的网络数据传输(包括 DNS --域名解析--)这个设置是从服务端推送(push)到客户端使客户端配置。

几条指令达到配置客户端所有网路访问都使用 VPN 的效果。搜索找到 redirect-gateway指令行,删除行首「;」 取消指令行的注释,使之生效如下:

# /etc/openvpn/server.conf

push "redirect-gateway def1 bypass-dhcp"

紧接下面,找到 dhcp-option 指令,删除行首「;」 取消指令行的注释,使之生效如下:

#/etc/openvpn/server.conf

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

这将帮助客户端重设其域名解析服务器(DNS)并使用 VPN 隧道作为其默认网关。

(可选) 调整端口与协议

默认 OpenVPN 服务使用 1194 端口和 UDP 协议接受客户端连接。若由于网络环境限制需选用其他端口,可以改变 port 选项。若开启 OpenVPN 服务的主机未同时做为网站(Web)服务器,端口 443 是最常用的选择。因为上游防火墙通常不会阻塞这个端口的网路数据。

# /etc/openvpn/server.conf

# Optional! 可选!
port 443

通常,若一些端口多被限制,可以改变 proto 协议段从 UDP 到 TCP:( 译注:UDP一般性能优于 TCP )

# /etc/openvpn/server.conf

# Optional! 可选!
proto tcp

若不需要改换端口,最好使这两个参数设置保持默认。

(可选) 指向非默认凭证

若在之前的步骤中,./build-key-server 命令中使用了不同的文件名称,修改 certkey 配置值,使其正确指向相应的文件。若使用的是默认的 server 名,应当已设置好:

# /etc/openvpn/server.conf

cert server.crt
key server.key

所有配置完成后,保存并关闭配置文件。

步骤 8: 调整 OpenVPN 服务网络配置

下面,调整服务器上的网络各方面配置,使 OpenVPN 可正确路由网络数据传输。

允许 IP 数据报转发

首先,需要允许服务器转发网络数据传输。 这是 OpenVPN 做到的最基本要求。

调整修改 /etc/sysctl.conf 文件中的配置:

$ sudo nano /etc/sysctl.conf

文件内部,搜素 net.ipv4.ip_forward 行,删除行首 「#」 字符,取消注释,使语句生效:

# /etc/sysctl.conf

net.ipv4.ip_forward=1

保存修改并关闭文件编辑。

使配置修改立即生效,如下命令:

$ sudo sysctl -p

调整防火墙(UFW)规则伪装客户连接

若曾实践过之前 Ubuntu 16.04 初始服务器的安装教程,应正确配置了防火墙。无论您是否曾使用防火墙阻塞不希望接入的连接(虽然在服务器上总要配置这样工作)。本教程中我们需要防火墙操纵一些进入服务器的网络数据。需要修改防火墙规则建立 VPN 数据传输的伪装。iptables (IP路由表)提供实时动态 NAT(网络地址转换)能力,保证客户端正确地接入。

在编辑防火墙配置加入伪装规则前,我们需知道服务器网络默认路由出口绑定的网络接口名称。使用下面命令:

$ ip route | grep default

您公共网络接口名称应在如下类似输出中 「dev」单词之后,以下面显示为例,默认路由的网络接口名称为 wlp11s0

#Output 输出
default via 203.0.113.1 dev wlp11s0  proto static  metric 600

当获得默认路由在哪个网络接口名称后,打开 /etc/ufw/before.rules 文件,添加如下配置:

$ sudo nano /etc/ufw/before.rules

这个文件是防火墙规则载入前执行的配置指令。在文件最前面,加入下面的指令行,这些指令行配置 nat表中的 POSTROUTING 链的默认策略是伪装任何来自 VPN 的数据访问。

注意 :记住使用您自己发现的网络接口名称替换下面 -A POSTROUTING行中的wlp11s0

# /etc/ufw/before.rules

#
# 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 -- OpenVPN 规则配置段
# NAT table rules -- 地址转换表规则
*nat
:POSTROUTING ACCEPT [0:0] 
# Allow traffic from OpenVPN client to wlp11s0 (change to the interface you discovered!)
# 转发 OpenVPN 客户数据到  wlp11s0(这个改成你自己的)
-A POSTROUTING -s 10.8.0.0/8 -o wlp11s0 -j MASQUERADE
COMMIT
# END OPENVPN RULES -- OpenVPN 规则配置段结束

#Don't delete these required lines, otherwise there will be errors
# 不要删除下面这些必要行,否则会出错
*filter
. . .

保存修改并退出,完成配置。

我们需要告诉防火墙(UFW)默认允许转发网络数据包。配置它,打开 /etc/default/ufw 文件:

$ sudo nano /etc/default/ufw

搜索找到 DEFAULT_FORWARD_POLICY 指令行,改变其值 DROPACCEPT

# /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"

保存修改并关闭文件,完成配置。

打开 OpenVPN 端口并使配置改变生效

下一步,我们调整防火墙本身允许 OpenVPN 网络流通行。

若之前未在 /etc/openvpn/server.conf 中改变 OpenVPN 的协议和端口配置,需要在防火墙上打开 UDP 流到端口 1194 。如果您自己改变了协议或端口,下面命令用自己配置的端口号替换。

这里也加入 SSH 端口,以防在初始安装服务器时您忘记添加 SSH 端口到防火墙:

$ sudo ufw allow 1194/udp
$ sudo ufw allow OpenSSH

现在,禁用防火墙再启用,使之前的配置改变生效:

$ sudo ufw disable
$ sudo ufw enable

现在,服务器已完全配置好路由和控制 OpenVPN 网络流。

步骤 9:启动 OpenVPN 服务

一切就绪,准备启动 OpenVPN 服务了。使用 systemd 命令启动。

命令行中需要指定启动的 OpenVPN 服务的配置文件名,OpenVPN 默认在/etc/openvpn/ 目录下寻找服务配置文件,这个目录下可保存多个服务配置文件。我们教程的配置文件是 server.conf文件,故在命令行尾加入 @server 来指定它:

$ sudo systemctl start openvpn@server

验证 OpenVPN 服务正确地启动了,使用下面命令:

$ sudo systemctl status openvpn@server

若一切都配置正确,会看到类型下面的输出:

#Output
● openvpn@server.service - OpenVPN connection to server
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2016-05-03 15:30:05 EDT; 47s ago
     Docs: man:openvpn(8)
           https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
           https://community.openvpn.net/openvpn/wiki/HOWTO
  Process: 5852 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid (code=exited, sta
 Main PID: 5856 (openvpn)
    Tasks: 1 (limit: 512)
   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
           └─5856 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf --writepid /run/openvpn/server.pid

May 03 15:30:05 openvpn2 ovpn-server[5856]: /sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2
May 03 15:30:05 openvpn2 ovpn-server[5856]: /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
May 03 15:30:05 openvpn2 ovpn-server[5856]: GID set to nogroup
May 03 15:30:05 openvpn2 ovpn-server[5856]: UID set to nobody
May 03 15:30:05 openvpn2 ovpn-server[5856]: UDPv4 link local (bound): [undef]
May 03 15:30:05 openvpn2 ovpn-server[5856]: UDPv4 link remote: [undef]
May 03 15:30:05 openvpn2 ovpn-server[5856]: MULTI: multi_init called, r=256 v=256
May 03 15:30:05 openvpn2 ovpn-server[5856]: IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
May 03 15:30:05 openvpn2 ovpn-server[5856]: IFCONFIG POOL LIST
May 03 15:30:05 openvpn2 ovpn-server[5856]: Initialization Sequence Completed

你也可检查一下 OpenVPN 的网络接口 tun0 的 IP 地址,如下命令:

$ ip addr show tun0

将会看到接口的配置情况:

#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

如果一切正常,可以使 OpenVPN 服务启动系统自动启动。如下命令:

$ sudo systemctl enable openvpn@server

步骤 10: 创建客户端基础配置

接下来,我们需要一个可集中生成客户配置文件的位置。(译注:为了后期认证及密钥文件的传输,应在本服务器上创建个集中的目录完成这项工作)

创建客户端配置生成目录

在用户家目录(此用户为之前创建CA的相同用户)创建一个目录用于客户端配置生成,命令如下:

$ mkdir -p ~/client-configs/files

由于我们客户端配置文件中内嵌客户端认证的密钥,应将这个文件夹许可只限于本用户读写执行:

$ chmod 700 ~/client-configs/files

创建客户端基本配置

接下来,让我们拷贝客户端例子配置文件到 ~/client-configs/ 文件夹里,命令如下:

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

使用文本编辑器打开这个文档 base.conf

$ nano ~/client-configs/base.conf

在这个文件 ~/client-configs/base.conf 中,需要做些小小调整。

首先,找到 remote 指令。这个指向 OpenVPN 服务的网络地址,它应是OpenVPN 的公网 IP 地址。 若在服务器配置时,改变了端口,替换 1194 为改变的端口。

# ~/client-configs/base.conf

. . .

# The hostname/IP and port of the server. -- 服务器 IP 和端口 --
# You can have multiple remote entries --可设多个地址,可负载平衡--
# to load balance between the servers.
remote server_IP_address 1194

. . .

确定使用的网络协议与服务器一致:

# ~/client-configs/base.conf

...

proto udp

接下来,去掉 usergroup 行前的注释符 「 ; 」

# ~/client-configs/base.conf

...

# Downgrade privileges after initialization (non-Windows only)
# 初始化连接后降级连接用户特权(只用于非 Windows 用户)
user nobody
group nogroup

找到设置 cacertkey 指令行,将它们注释掉。由于我们把认证和公钥放到连接配置文件里。(译注:若需要时,客户也可把证书、密钥内容拷贝出来单独成文件)

# ~/client-configs/base.conf

...

# SSL/TLS parms. -- SSL/TLS 参数配置 --
# 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 -- 单个CA(认证机构)认证所有客户 --
# file can be used for all clients.
#ca ca.crt
#cert client.crt
#key client.key

复制服务端 cipherauth 配置到客户端配置,使它们完全一致:

#~/client-configs/base.conf

...

cipher AES-128-CBC
auth SHA256

紧接着 auth 配置指令,添加key-direction 指令。 对于客户端设置 必须1 ,与服务端相对:

#~/client-configs/base.conf

...

key-direction 1

最后,在文件尾加入注释 着的如下指令。 每个在服务端为客户端生成的连接配置文件都加这三个语句,但只有linux客户端用的上。linux 客户端连接前,配置将这三个语句非注释掉。其它客户端如 Windows、OS X 等无需设置。

#~/client-configs/base.conf

...

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

如果您用的操作系统是 Linux ,连接到 OpenVPN 服务器。您会发现系统里有 /etc/openvpn/update-resolv-conf 文件。在配置连接时,您把这三个语句前面的注释去掉,使之生效。

编辑完成后保存文件。

创建生成客户端配置脚本

接下来,我们创建一个非常简单的脚本文件,它自动从服务器里生成服务的目录里将相关的安全认证、密钥、连接配置等信息组合进客户端建立连接的配置相关文件里,这些配置保存在 ~/client-configs/files 目录里。

~/client-configs 目录下, 创建并打开一个名为 make_config.sh 的文件并编辑:

$ nano ~/client-configs/make_config.sh

~/client-configs/make_config.sh 脚本文件里,粘贴如下指令脚本:

#!/bin/bash

# First argument: Client identifier  -- 命令行第一个参数为 客户标识 --
# ${1} 引用到之前生成认证的客户名,如 client1 

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

保存文件并关闭。(译注:这里通过一个 shell 脚本,自动生成指定客户端的配置文件)

打开文件的可执行性:

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

步骤 11:生成客户端连接配置文件

现在,可以很容易地生成客户端连接配置文件。

如果您跟着本教程的指导实践到这里,您应该创建名为 client1.crtclient1.key 文件,这是通过之前 步骤 6./build-key client1 命令产生的。我们可以生成使用 clinet1 客户名连接的配置文件。进入 ~/client-configs 文件夹,运行脚本,指定命令脚本参数为 client1 ,所示如下:

$ cd ~/client-configs
$ ./make_config.sh client1

如果一切运行正常,将会在 ~/client-configs/files 文件夹下发现生成的 client1.ovpn 文件:

$ ls ~/client-configs/files
client1.ovpn

传输连接配置文件到客户端机器上

我们需要把生成的客户连接配置文件传到需要连接的客户机器上。 实际中可能是一台台式电脑/笔记本或手机。

具体使用什么完成这个任务,很可能取决于您使用的操作系统和您的喜好。若使用 SFTP 「SSH file transfer protocol」 或 SCP 「Secure Copy」将保证传输是建立在一个安全连接上的。

下面是使用 SFTP 命令传输 client1.ovpn 的例子,适用于OS X 或 Linux 系统。它将 .ovpn 文件放到用户家目录下:

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

下面是您可能用到的从服务器安全传输数据到客户端的工具和使用指南:

步骤12 :安装客户连接配置

下面,我们讨论如何在客户机系统是 Windows、OS X、iOS 和 Android 时的连接配置。这些客户连接配置各自相对独立,互相无关。您可以直接跳到您关心的客户端连接配置部分。

OpenVPN 连接配置文件通常为 .ovpn 后缀名的文件。本教程例子中,这个文件就是 client1.ovpn 文件, client1 是我们在前面的步骤生成的客户名。

Windows系统客户端

安装

OpenVPN 对 Windows 客户端在 OpenVPN’s 下载页 处下载正确的安装程序。

注:OpenVPN 安装需管理员特权。

安装完成,拷贝客户端配置文件.ovpn到如下文件夹:

C:\Program Files\OpenVPN\config

当启动 OpenVPN 时,会自动到上面的文件夹里去寻找、装载连接配置文件。

OpenVPN 每次启动运行都需要本机管理员权限,甚至需要管理员帐户。为了避免每次启动运行时都必须指定 以管理员身份运行,您可以预设它,只能以管理员帐号登录下进行设置。这也意味着标准用户使用 OpenVPN 必须输入管理员密码才可以。

配置 OpenVPN 程序总是以管理员运行。 在程序图标上右击,进入 属性->兼容性下,点击 对所有用户改变设置 按钮,在新打开窗口中,勾选 以管理员运行此程序 选项 。

连接

每次启动 OpenVPN GUI 时,Windows 系统向您询问是否允许程序对系统改变。点击 。启动 OpenVPN 客户端程序,只是将其图标放到系统任务条中,并不会自动连接。

一旦 OpenVPN 启动后, 右击 OpenVPN 在系统任务栏上的图标,打开相关菜单,选择菜单顶部的 client1 并点击 连接 进行连接。

一个状态窗口将打开,显示连接过程的日志输出,客户端连接成功,会有相应信息显示。

断开与 VPN 的连接。同样,右击 OpenVPN 在系统任务栏上的图标,选择已连接的客户并点击 断开

OS X 客户端系统

安装

Tunnelblick 是 Mac OS X 系统下免费、开源的 OpenVPN 客户端软件。可从 Tunnelblick Downloads page 上下载最新的磁盘镜像。双击下载的 .dmg 文件,依提示安装。

安装到最后一步,Tunnelblick 会提示是否载入配置文件,可以简单选 No 完成软件安装。也可打开文件管理器窗口找到 client1.ovpn 选中加载。需要管理员权限继续操作。

连接

Applications 中双击 Tunnelblick 程序,启动它。一旦程序启动,会在系统菜单条(屏幕右上角)上显示 Tunnelblick 程序图标,点击它,选择 client1 配置并 Connect

Linux 客户端系统

安装

若使用 Linux 系统,根据您使用的发布版的不同,有许多变化的工具可选用。若是桌面版,如窗口管理器也有自己默认的工具连接到 OpenVPN 。

最通常的方法就是使用 OpenVPN 客户端软件了。

对于 Ubuntu 或 Debian 系的发行版,使用其包管理工具安装如下命令:

$ sudo apt-get update
$ sudo apt-get install openvpn

对于 CentOS ,使用 EPEL 软件库安装,命令如下:

$ sudo yum install epel-release
$ sudo yum install openvpn

配置

先查看系统上是否有 /etc/openvpn/update-resolv-conf 这个脚本文件:

$ ls /etc/openvpn
update-resolve-conf

接着,编辑 OpenVPN 客户端配置文件 client1.ovpn

$ nano client1.ovpn

取消下面三行命令的注释,使其生效。您可以文中搜索 update-resolv-conf 即可找到这三条语句:

#client1.ovpn

...

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

(译注:up 和 down 语句都要存在,看脚本即知)

若是 CentOS,改变 groupnogroupnobody

#client1.ovpn

...

group nobody

保存修改并关闭文件。

现在,您只需使用命令行 openvpn 命令连接 VPN ,只需使用 --config 选项指定客户端配置文件即可。命令如下:

$ sudo openvpn --config client1.ovpn

这样应连接到服务器。

iOS 客户端系统

安装

从 iTunes 应用商店,搜索 OpenVPN Connect ,并安装。 为了传输客户端连接配置文件,连接手机与计算机。

如下大概显示完成连接,在计算机上打开 iTunes 并点击 iPhone > apps 。滚动到底部选中 File Sharing 并点击 OpenVPN 程序,在右栏的 OpenVPN Documents 窗口中,拖拽 .ovpn 进其窗口中。

iTunes showing the VPN profile ready to load on the iPhone

在 iPhone 中启动 OpenVPN ,它将提示新的连接配置将导入,点击绿色加号的按钮导入。

The OpenVPN iOS app showing new profile ready to import

连接

OpenVPN 现在准备好使用新的配置连接。连接,滑动 Connect 按钮到 On 的位置。断开连接,滑动相同按钮到 Off 位置。

注意:在 设置(Settings) 中的 VPN 不可用于连接 OpenVPN 。若尝试,会收到一个只能使用 OpenVPN app 进行 VPN 连接的警告。

The OpenVPN iOS app connected to the VPN

Android (安卓)客户端连接

安装

打开 Google Play 商店。搜索 Android OpenVPN Connect 并安装。官方 OpenVPN 客户端软件。

Open the Google Play Store. Search for and install Android OpenVPN Connect, the official Android OpenVPN client application.

.ovpn 客户端连接配置文件,可通过 USB 连接电脑与手机进行文件传输,拷贝到手机里。 也可通过 SD 读卡器,直接拷贝文件到手机存储里。

启动 OpenVPN app 并点击如下所示菜单去导入配置。

The OpenVPN Android app profile import menu selection

然后浏览到配置文件保存的文件夹(例子显示的是 /sdcard/Download/ )并选中配置文件,程序会提示从文件导入配置。

The OpenVPN Android app selecting VPN profile to import

连接

连接,单击 Connect 按钮,被提示是否信任 OpenVPN 程序。选择 OK ,开始初始化连接。 断开连接,回到 OpenVPN 程序界面,选择 Disconnect

The OpenVPN Android app ready to connect to the VPN

步骤 13 :测试 VPN 连接

所有的步骤完成后,简单测试确定 VPN 良好工作。先不连接 VPN ,用浏览器访问 DNSLeakTest 这个网址。

网站将会显示出你的互联网服务提供商分配给你的 IP 地址。在同一网页中点击 Extended Test 将会显示你使用的 DNS 服务器。

现在,连接你的 OpenVPN 客户到你的 VPN 服务器并刷新网站,完全不同的 IP 地址显示出来,这应是你 VPN 服务器地址,它是你显示给外部的信息。再次点击 Extended Test 将会检查你的 DNS 设置,你现在使用的 DNS 应是 VPN 服务端推送给你的。

步骤 14 :废止某客户认证

你偶尔或许需要废止某个客户认证,使某客户无法访问 OpenVPN 服务器。

首先,进入创建 CA 的目录~/openvpn-ca 。然后 source 执行 vars 脚本:

$ cd ~/openvpn-ca
$ source vars

接着,使用脚本命令 revoke-full 后跟你期望废止的客户名:

$ ./revoke-full client3

这将显示一些输出,终止在 error 23 提示。这通常表示处理成功完成且生成废止信息,这些保存在 keys 子文件夹下的 crl.pem 文件中。

传输这个文件到 OpenVPN 服务配置文件夹 /etc/openvpn 里:

$ sudo cp ~/openvpn-ca/keys/crl.pem /etc/openvpn

接着打开 OpenVPN 服务器配置文件:

$ sudo nano /etc/openvpn/server.conf

在配置文件末尾,添加 crl-verify 指令, 指示 OpenVPN 服务器每当收到连接请求时,检查其废止列表文件,决定是否接受接入:

# /etc/openvpn/server.conf

...

crl-verify crl.pem

保存修改并关闭文件。

最后,重启 OpenVPN 服务,使废止生效:

$ sudo systemctl restart openvpn@server

被废止的客户使用旧的认证文件就不再能连接到 VPN 服务器了。

去废止更多的客户,依下面步骤:

  1. ~/openvpn-ca 目录下,通过 $ source vars$ revoke-full [client-name] 命令重新生成包含 [client-name] 的废止客户列表文件。
  2. 拷贝新的废止客户列表文件到 /etc/openvpn 目录下覆盖同名旧文件。
  3. 重启 OpenVPN 服务。

这个处理过程可以用于废止任何之前服务器认证过的客户。

结论

大功告成!你现在可以私密你的标识、地理位置和网络访问,防止网络嗅探与审查。

要配置更多客户机连接,只需在连接设备上执行 步骤 611 - 13 ,取消某些客户的访问请参照 步骤 14 的指导。

原文地址:https://www.digitalocean.com/community/t...

译文地址:https://learnku.com/linux/t/36585

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 1
likunyan

这个比较早接触过,安装是挺简单的,好像第二个就要收费了。

1周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!