This website requires JavaScript.

How To Set Up an OpenVPN Server on Ubuntu 14.04[译]

Introduction

你是否想在不安全的网络环境中(比如酒店或咖啡店WIFI),安全可靠的访问网络?VPN(Virtual Private Network )可以满足你的需求。它会帮你建立一个安全的私有网络。

结合HTTPS链接,这个可以保护你的无线登录和传送。你可以绕过地理限制和审查,在不受信任的网络中保护你的位置和未加密的HTTP流量

OpenVPN是一个开源的SSL(Secure Socket Layer) VPN解决方案,提供多种配置。在本较沉重,我们会在Droplet上建立一个OpenVPN服务器,然后通过Windows,OS X,iOS和android.来访问它。本教程将尽可能使安装和配置步骤简单化。

需求

唯一的需求就是你需要有个Ubuntu 14.04 Droplet,并且具备Root权限。当然你也可以创建一个普通用户然后通过sudo来操作你的服务器。

Step1 - 安装配置OpenVPN服务器环境

在你的服务器上完成以下操作

OpenVPN配置

在安装任何包之前先更新以下Ubunt的资源列表

apt-get update

然后安装OpenVPN 和 Easy-RSA.

apt-get install openvpn easy-rsa

解压VPN服务器的配置样例到/etc/openvpn目录

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

解压后,你就可以用你喜欢的文本编辑器打开server.conf进行编辑了。

vim /etc/openvpn/server.conf

然后你会看到类似下面这段

# 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

修改以后RSA key的生成长度就翻倍了。

继续在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服务器就会把客户端的web数据传到目的地。改好以后起来像下面这样:

push "redirect-gateway def1 bypass-dhcp"

接着修改这一段

# 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"

这个作用是服务器把把OpenDNS推送给客户端作为DNS的解析。 这样可以防止DNS请求在VPN链接外泄露。当然最重要的还是客户端的DNS解析设置。OpenVPN是默认的,你可以使用任意喜欢的DNS。

下面是最后一块需在server.conf要修改的段落

# You can uncomment this out on
# non-Windows systems.
;user nobody
;group nogroup

取消 user nobodygroup nogroup的注释,如下:

user nobody
group nogroup

默认情况下,OpenVPN使用root用户运行,因此有完整的系统访问权限。我们将限制OpenVPN用户和组为nogroup。这是一个非特权用户没有登录功能,通常用于面向web服务器运行不受信任的应用程序。

现在保存更改并退出Vim

包转发(Packet Forwarding)

这个sysctl设置告诉服务器内核,将客户端设备的访问转发到互联网。否则,访问会在服务器这边停止。通过以下命令启用包转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

设置在系统启动时就启用,我们需要修改以下文件

vim /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

保存并退出

简单防火墙 Uncomplicated Firewall (ufw)

ufw是iptables的前段,使用起来并不难。Ubuntu14.04自带,所以我们只要做一点小配置编辑就可以了,然后把防火墙打开。想要了解更多可以参考这篇文章How To Setup a Firewall with UFW on an Ubuntu and Debian Cloud Server.

首先要设置允许SSH,在命令行提示下输入以下命令:

ufw allow ssh

本教程中OpenVPN使用UDB,所以我们必须把UDP的1194端口打开.

ufw allow 1194/udp

如果要允许访问其他端口直接设置端口名即可

sudo ufw allow 50157

ufw 转发规则同样需要被设置,我们对主配置文件进行修改.

vim /etc/default/ufw

找到DEFAULT_FORWARD_POLICY="DROP"把DROP改为ACCEPT

DEFAULT_FORWARD_POLICY="ACCEPT"

接下来,我们要在ufw中添加额外网络地址转换和客户端IP伪装规则。

vim /etc/ufw/before.rules

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: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
1194/udp                   ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
1194/udp (v6)              ALLOW       Anywhere (v6)

Step 2 - 创建CA(Certificate Authority)证书以及服务端的证书和Key

OpenVPN使用证书加密通信。

配置和建立CA

现在是时候建立我们自己的CA(Certificate Authority)证书并生成一个OpenVPN服务器证书和密钥。OpenVPN双向支持基于证书的身份验证,这意味着在建立通信之前客户机必须验证服务器证书,服务器也必须验证客户端证书。我们将使用Easy RSA的脚本来简单实现。

先拷贝Easy_RSA生成成交本.

cp -r /usr/share/easy-rsa/ /etc/openvpn

创建key的存储目录.

mkdir /etc/openvpn/easy-rsa/keys

Easy-RSA有个变量文件我们可以编辑然后创建我们专属的个人或者商业证书。这些信息被复制到证书和密钥,并将帮助密钥的鉴别。

vim /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文件中修改,就是key name,我们使用server作为key name,如果你要不同的名字可以自行修改。然后你也会需要修改OpenVPN中配置应用的server.keyserver.crt

export KEY_NAME="server"

我们需要生成Diffie-Hellman参数,可能需要几分钟

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

心在让我们换个目录

cd /etc/openvpn/easy-rsa

初始化PKI(Public Key Infrastructure),注意在./vars前面的点(.)和空格

. ./vars

接着会输入以下提示,我们还没有生成任何key,所以可以无视这个。。

NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

现在,我们清除工作路径中的key为生成新key做准备。

./clean-all

最后我们用命令生成CA,在过程中会让你填写早先修改的vars文件中country name, organization等信息,直接回车即可

./build-ca

为服务器生成证书和Key

任然在/etc/openvpn/easy-rsa目录,现在输入命令生成服务器的key,命令中的server就是你在Easy-RSA's vars文件中修改的 export KEY_NAME变量值。

./build-key-server server

跟运行./build-ca一样,一路按回车即可。不过这次会多两个提示,不过这两个应该为空,所以按回车就是了。

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

移动服务器证书和Key

OpenVPN会在/etc/openvpn下访问证书和key,所以让我们把它们拷贝过去。

cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

验证一下,你应该可以看到证书和Key文件。

ls /etc/openvpn

做到这一步我们的OpenVPN服务器就可以运行了。启动并查看状态.

service openvpn start
service openvpn status

状态命令应该返回。。。:

VPN 'server' is running

恭喜!!!你的VPN运作起来了,如果状态命令显示VPN没有运行,那么看一下/var/log/syslog文件查看错误,比如 :

Options error: --key fails with 'server.key': No such file or directory

这个错误表示server.key没有被拷贝到/etc/openvpn 。重新拷贝就行了。

Step 3 - 为客户端生成证书和Key

至此,我们已经安装并配置了OpenVPN服务器,创建了CA证书,然后创建了服务器自己的证书和Key。在这个步骤里,我们使用服务器的CA生成客户端的证书和Keys。这些文件稍后会被安装到客户端设备,例如笔记本或者手机。

最完美的方法是为每一个客户端连接VPN生成一个单独的证书和key。这个是比生成一个公用的key更好的方式。

注意:默认情况下OpenVPN不允许多个客户端使用同一个证书和key同事登录. (查看/etc/openvpn/server.conf中的duplicate-cn)

为每个设备创建单独的证书,你需要完成以下步骤。当然每个设备的证书名字可以改下,比如client1 ,client2 或者iPhone2。每个证书都可以在服务器端停用。 本教程将使用client1作为我们示例客户端的设备名。

正如我们创建服务器key一样,现在我们要为客户端client1创建key。 我们仍需要在/etc/openvpn/easy-rsa目录中进行操作。

./build-key client1

又一次要你确认。。。一路回车下去

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

拷贝Esay-RSA的客户端配置样例文件到目录里面。 我们使用它作为模板。我们把文件名由client.conf改为client.ovpn因为.ovpn是客户端需要访问的扩展名。

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn

你可以重复这个章节为每一个客户端生成证书和key

将证书和Key复制到客户端设备

回忆之前的步骤,我们把证书和key生成在了/etc/openvpn/easy-rsa/keys目录

每个设备都需要传送客户端证书,key,以及配置模板 。

在本例中,我们client1设备需要它的证书和key。 对应服务器上的目录是

/etc/openvpn/easy-rsa/keys/client1.crt
/etc/openvpn/easy-rsa/keys/client1.key

其中ca.crtclient.ovpn文件对于所有客户端都是一样的。注意ca.crt在另外一个目录

/etc/openvpn/easy-rsa/keys/client.ovpn
/etc/openvpn/ca.crt

你可以使用 SFTP(SSH file transfer protocol) 或者 SCP(Secure Copy)等工具来传送你的证书和Key

以下是用SCP命令传送client1.key到本地Downloads目录的例子

scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/

以下是几个安全传输工具:

最后你的客户端设备应该有以下四个文件

  • client1.crt
  • client1.key
  • client.ovpn
  • ca.crt

Step 4 -为OpenVPN客户端创建统一的配置文件

有好几个方法可以管理客户端的文件,不过最简单的是统一的配置文件。直接修改client.ovpn模板就可以了。 文件里面包含了证书授权和Key。修改完毕后只要将client.ovpn文件导入OpenVPN的客户端即可。

我们将为我们的client1设备创建一个配置文件,在本文中我们会将client.ovpn改名为DigitalOcean.ovpn,接着打开DigitalOcean.ovpn进行修改。

第一部分是你服务器的IP地址,把my-server-1改为你VPN的IP

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote my-server-1 1194

接着找到user nobodygroup nogroup,跟在server.conf文件一样,把注释去掉。 注意这个步骤对Windows无效,如果是Windows系统可以跳过这一步。 修改后样子如下:

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

然后把下面三张注释掉,我们会直接把证书和key的信息写在DigitalOcean.ovpn里,看上去应该是这个样子。

# SSL/TLS parms.
# . . .
#ca ca.crt
#cert client.crt
#key client.key

合并文件,只需把ca.crt,client.crt还有client1.key的内容直接贴在.ovpn文件里面即可,有点像XML。 格式如下:

<ca>
(insert ca.crt here)
</ca>
<cert>
(insert client1.crt here)
</cert>
<key>
(insert client1.key here)
</key>

完成以后看上去是这个样子的:

<ca>
-----BEGIN CERTIFICATE-----
. . .
-----END CERTIFICATE-----
</ca>

<cert>
Certificate:
. . .
-----END CERTIFICATE-----
. . .
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
. . .
-----END PRIVATE KEY-----
</key>

client1.crt文件有一些额外的信息;没有关系直接全部贴进去就好。最后保存退出

Step5 - 安装客户端配置文件

我们现在分别为Windows,OS X,iOS,和Android安装配置这个文件。

注意,客户端连接名字就是你.ovpn的文件名。本例中我们的文件名为DigitalOcean.ovpn,所以连接名为DigitalOcean

Windows

安装

Windows客户端可以在OpenVPN的下载页面找到.

安装完毕以后把DigitalOcean.ovpn拷贝到以下地址

C:\Program Files\OpenVPN\config

当你运行OpenVPN的时候,会自动读取。 OpenVPN必须以管理员权限运行。不过每次运行都要选择以管理员权限运行比较麻烦,我们可以进行设置。右击图标选择Properties.在Compatibility标签中选择Change settings for all users。 在新的窗口中选择 Run this program as an administrator.

连接

每次你运行OpenVPN GUI的时候Windows都会问你是否允许程序修改你的计算机,选择Yes。启动后会显示在你的系统状态栏

参考

UFW防火墙简单设置 How To Set Up an OpenVPN Server on Ubuntu 16.04

0条评论
avatar