这篇文章是翻译自DigitalOcean上的一篇关于在Ubuntu Linux上设置OpenVPN服务的教程, 亲测可用。这篇文章也是第一篇翻译文。
原文连接在此:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04
作者名字叫James~~(是张三的意思么?)
————————这是第一次出场的分割线—————— ——————

简介
当你在酒店或是咖啡店用手机或是笔记本蹭wifi的时候是不是想过这样的网络安不安全?一个VPN可以让你私密并且安全的链接到DigitalOcean的虚拟服务器并通过其转发链接。这种链接是通过从你的虚拟服务器转发到你想要访问的目的地的。
如果你和HTTPS连接一起使用,这种设置可以让你将你的无线链接加密起来。并且可以规避地域的限制和审查、隐藏你的真实地址还有从不受信任的网络里解密HTTP数据。(最后一句话有点不明白)
OpenVPN是一个功能强大的开源SSL VPN解决方案并且提供了十分丰富的配置。在这个教程中,我们会在一个虚拟服务器上架设OpenVPN服务器并进行配置,以实现从Windows,OS X,iOS和Android设备上访问。这个教程会尽量保持简洁明了。(的确算是简单的了)
注意:OpenVPN可以在启动虚拟服务器时通过脚本自动加载。关于DigitalOcean Droplet(虚拟服务器)用户数据的介绍请参看链接。(这段基本可以忽略,主要是讲在DigitalOcean上配置自己的Droplet时可以通过User Data实现一些自动话的功能,有兴趣可以参考一下,这步不做不影响下面的操作)
前提条件
唯一的前提条件是你需要有一个Ubuntu 14.04的虚拟服务器。你需要root帐号来完成这个教程。(感觉应该现在的15和以前的12版本都可以适用,也不一定是虚拟服务器,实体服务器也可,但root帐号是必须要的)
- 可选项:当完成了这些指导之后,最好是创建一个有sudo权限的一般帐号来进行日常的维护操作。(这是常规的建议)
第一步 安装和配置OpenVPN的服务器环境
这些步骤都是在服务器上完成的。
OpenVPN配置
在安装任意一个包之前,先更新一下Ubuntu的软件库清单。(命令如下)
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作为文本编辑器,不过你也可以选择你喜欢的编辑器来编辑文件。
vim /etc/openvpn/server.conf
在这个文件里,有一些地方需要做出修改。第一个部分如下:(找到那个叫dh dh1024.pem)
# 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
这个修改会将服务器和客户端的RSA密钥的长度增加一倍。
还是在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”两段前面的分号注释符去掉。让文件看起来变成下面的样子。
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
这会告诉服务器如果可能的话,使用OpenDNS来作为客户端的DNS解析服务。这会防止DNS请求泄漏到VPN以外的连接中。不过,在客户端设置特殊的DNS解析同样重要。虽说OpenDNS是OpenVPN的默认设置,不过你也可以自己设置自己的DNS
server.conf中最后一个要改的地方如下:
# You can uncomment this out on
# non-Windows systems.
;user nobody
;group nogroup
将user nobody和group nogroup取消注释。看起来像下面这样:
user nobody
group nogroup
默认情况下,OpenVPN是使用root用户来运行的,因此它也拥有系统的root权限。我们这里用nobody和nogroup用户和组来替代,这些未授权的用户默认不具备登陆权限,通常用来运行一些不受信任的程序。
保存server.conf文件
包转发
这个sysctl设置将会告诉服务器核心转发客户端的请求到internet。如果不设置的话,这些请求都会到本服务器就停止了。启动转发功能的命令如下:
echo 1 > /proc/sys/net/ipv4/ip_forward
我们需要将起设为随开机启动,这样服务器重启后转发功能就会自动启动了。编辑sysctl.conf文件:
vim /etc/sysctl.conf
在靠近顶部的地方,找到如下段落:
# 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
保存然后退出。
ufw的配置
ufw是一个简单的防火墙系统,而且不难配置。Ubuntu14.04 默认自带ufw,所以我们只需要添加一些简单的规则来实现我们的需求。关于ufw的详细配置,你也可以参考文章:如何在Ubuntu和Debian服务器上设置ufw防火墙。(E文,没翻译)
首先设置允许SSH。直接输入命令如下:
ufw allow ssh
本教程里我们配置OpenVPN通过UDP协议连接,因此需要允许UDP协议访问的1194端口。
ufw allow 1194/udp
ufw的转发策略同样需要设置。我们在ufw的主配置文件里进行修改,通过以下命令打开文件:
vim /etc/default/ufw
找到DEFAULT_FORWARD_POLICY=“DROP”。将DROP改为ACCEPT。改完后如下:
DEFAULT_FORWARD_POLICY="ACCEPT"
下一步新增一条规则来实现客户端的网络地址转换和IP伪装。通过一下命令编辑文件:
vim /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
# 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
系统会提示如下:
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)
第二步 – 创建服务器端认证和密钥
OpenVPN使用认证证书来加密数据传输。
配置并创建证书授权
现在我们可以开始创建我们自己的CA并基于此为OpenVPN服务器生成证书和密钥。OpenVPN支持基于证书的双向认证,这意味着在互信连接建立之前,客户端和服务器必须相互认可。在这里我们使用前面已经准备好的Easy RSA脚本来实现。
首先把Easy-RSA创建脚本拷贝到/etc/openvpn目录下:
cp -r /usr/share/easy-rsa/ /etc/openvpn
然后新建一个目录来存储密钥文件:
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。如果你想要设为不同的名字,请记得你需要在OpenVPN的配置文件里修改引用到对应的
crt和key文件,我们这里的名字即为server.key和server.crt。
export KEY_NAME="server"
现在我们需要生成Diffie-Hellman参数,这个会需要一点时间。(这里的Diffie-Hellman只的是Diffie-Hellman密钥交换协议,有兴趣google下吧)
openssl dhparam -out /etc/openvpn/dh2048.pem 2048
现在我们可以进到/easy-rsa文件夹,就是我们之前靠陪Easy-RSA脚本的地方。
cd /etc/openvpn/easy-rsa
通过以下命令初始化PKI。这里要注意命令开始的第一个点和之后紧跟的一个空格,它代表的是当前的工作目录。
. ./vars
上面的命令会产生如下的结果。由于我们还没有创建任何密钥,这里我们可以不用关注。
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
现在我们通过./clean-all来清除之前已经有的密钥文件。(这个命令在VPN已经可以正常运行之后需要谨慎使用,它会删除文件夹下所有的密钥(key)和证书(crt)文件。)
./clean-all
最后的这个命令就是来生成服务器的CA文件。弹出的命令行会需要你确认上面在Easy-RSA配置文件中的区分参数(country name, orgnaization等等)
./build-ca
在这里你可以一路回车到结束,或者也可以基于自己的需求修改其中的参数。(不建议,如果确实需要,在上面的配置文件里直接改好)。
创建服务器端证书和密钥
还是在/etc/openvpn/easy-rsa目录下,现在通过以下命令来创建服务器端密钥。加粗的server就是之前在Easy-RSA文件中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
迁移服务器密钥和证书
OpenVPN默认会到/etc/openvpn目录下寻找CA、证书和密钥文件。通过以下命令可以将之前生成的文件拷贝到/etc/openvpn下。
cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn
通过以下命令可以确认是否拷贝成功。
ls /etc/openvpn
成功的话你就可以看到证书、密钥和CA文件了。(文件名分别是:server.crt,server.key和ca.crt)
至此,OpenVPN服务器就准备好了。通过以下命令来启动服务并确认状态。
service openvpn start
service openvpn status
正常的话命令行提示如下:(这里的server就是我们上面设置的名字server)
VPN 'server' is running
恭喜你,到此位置你的OpenVPN服务器就可以运行了。如果状态信息显示VPN无法运行,你可以到/var/log/syslog文件中查找报错信息,如果错误和下面的提示类似
Options error: --key fails with 'server.key': No such file or directory
这意味着server.key文件没有正确的拷贝到/etc/openvpn目录下,请尝试再拷贝一次。(原文如此,但通常情况下这个错误都是由于前面在配置服务名称时给的名字和后面创建密钥时用的名字不同,所以尤其注意前后保持一致)
第三步 – 创建客户端证书和密钥
到目前为止我们已经创建好了OpenVPN服务器,生成了服务器端的CA、证书和密钥。这这一步里,我们需要基于服务器CA来创建客户端证书和密钥文件。这些文件创建后都需要配置到各个客户端中去。(针对不同的设备,配置文件的格式都是相同的,只有证书和密钥不同,相同的配置文件只同时允许一台设备连接到VPN服务器,如果想要两台设备同时连接的话,就需要生成两个不同的配置文件,下面的段落有说明。配置文件的扩展名为*.ovpn)
创建证书和密钥
理想的状况下针对不同的设备都应该有不同的证书和密钥。不过也所有的设备都用同一组密钥和证书。
注意:默认情况下,OpenVPN不允许从不同客户端到服务器的并发连接。(参见/etc/openvpn/server.conf中的duplicate-in设置说明)
针对每一台你想要连接到VPN的设备,你都需要通过以下步骤来创建认证证书和密钥。不同的设备,通过命名来区分。如果有需要,你也可以之后针对设备分别禁用。接下来的例子我们会用client1作为设备的名字。
就像创建服务器端密钥一样,我们现在创建client1的密钥。请注意我们还在/etc/openvpn/easy-rsa文件夹下。(这里注意创建客户端密钥的命令和创建服务器密钥的命令是不同的,这里是build-key,前面是build-key-server。这里更注意别用的build-ca,ca证书一旦重新创建,那就需要重新重头基于新的ca文件创建新的服务器端证书和密钥了)
./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
这里的例子中,我们将ovpn配置文件的模板拷贝到/etc/openvpn/easy-rsa/keys 文件夹下,并将其改名为client.ovpn。这个client.ovpn文件就是客户端的配置文件。(这里注意拷贝的原始模板文件名是client.conf,而不是我们需要的.ovpn文件)
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn
你可以重复上面的步骤来创建不同设备的配置文件,记得把client1换成你想要的名字。(这里建议把那个client.ovpn做一个备份,这样就不用每次都拷贝一个原始模板了)
把证书和密钥传输到客户端上
现在在服务器上我们已经有了客户端的密钥和证书文件,这些文件都存放在/etc/openvpn/easy-rsa/keys目录下。
我们需要将对应的密钥、证书和配置文件传送到客户端设备上去。
在这里,我们继续使用client1文件举例,以下是对应的证书和密钥
- /etc/openvpn/easy-rsa/keys/client1.crt
- /etc/openvpn/easy-rsa/keys/client1.key
ca.crt和client.ovpn文件是针对所有设备都相同的。这两个文件也下载到客户端上。这里注意ca.crt在不同的路径下:
- /etc/openvpn/easy-rsa/keys/client.ovpn
- /etc/openvpn/ca.crt
针对不同的客户端设备下载文件的方式不同,你可以在服务器上设置SFTP或者SCP来实现文件传送。
这里是使用SCP来传送的例子
scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/
这里有一些参考文章说明了如何架设SCP和SFTP(同样也是英文,我用的vsftpd)
- WinSCP
- How To Use SFTP to Securely Transfer Files with a Remote Server
- How To Use Filezilla to Transfer and Manage Files Securely on your VPS
最后,确保下面4个文件都拷贝到你的客户端上即可。
- client1.crt
- client1.key
- client.ovpn
- ca.crt
第四步 – 为客户端创建可执行的配置文件
创建客户端配置有很多中方法,最简单的方法就是生成一个client.ovpn文件来包含所有的ca、证书和密钥信息。然后将这个配置文件导入到OpenVPN程序中去。
在这里我们用一台本地工作电脑来生成client1设备的配置文件。这台电脑可以是需要连接vpn的电脑,也可以只是一台临时的工作电脑。(这段废话就是说你需要搞一台电脑来编辑那个ovpn文件,他不管你这台电脑是否需要连接vpn,不连也无所谓)。
注意:client.ovpn文件的名字并不一定需要跟你在配置信息中的名字一致。客户端会用这个文件名来作为连接的名字。
在这里,我们把这个文件名改为DigitalOcean.ovpn。改完名字后,我们打开这个文件,随便什么编辑器都可以
第一段需要修改的地方是你需要连接服务器的IP地址,吧my-server-1修改为对应的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 nobody和group nogroup把前面的#注释符去掉。注意,如果客户端是windows,这一步可以不做。
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
下一个修改的地方需要将ca、证书和密钥引用注释掉,我们会直接把这三个文件的内容添加到ovpn文件中。
# SSL/TLS parms.
# . . .
#ca ca.crt
#cert client.crt
#key client.key
为了添加这三个文件,我们把下面一段话复制到ovpn文件中,这是一个标准的xml格式段落。
<ca>
(insert ca.crt here)
</ca>
<cert>
(insert client1.crt here)
</cert>
<key>
(insert client1.key here)
</key>
然后我们就可以把ca.crt, client1.crt(证书)和client1.key(密钥)文件中的内容复制粘贴到对应位置,修改完成后的段落看起来应该和下面一样。(这里要注意复制过来后确保每个结束标签前面别空行,否则连不上)
<ca>
-----BEGIN CERTIFICATE-----
. . .
-----END CERTIFICATE-----
</ca>
<cert>
Certificate:
. . .
-----END CERTIFICATE-----
. . .
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
. . .
-----END PRIVATE KEY-----
</key>
client1.crt文件中还包含了一些其他信息,可以直接全部复制粘贴过来。
保存并退出。这样这个OpenVPN客户端配置文件就创建好了。
第五步 – 安装客户端配置文件
这里介绍下不同的客户端如何安装配置文件。你可以选择适合你设备的说明,不用全部都看。
记住连接的名字是跟你.ovpn的文件名一样的。在这里,连接的名字就是DigitalOcen.
Windows
安装
下载一个和你windows 系统版本匹配的OpenVPN的客户端
注意:OpenVPN需要管理员权限运行
安装完成后,把DigitalOcean.ovpn文件拷贝到C:\Program Files\OpenVPN\config文件夹下。(这里可能会发现OpenVPN下没有config这个文件夹,新建一个即可)
C:\Program Files\OpenVPN\config
当启动OpenVPN时,系统会自动把这个配置文件加载进来
OpenVPN必须要管理员权限才能运行,就算是管理员账户登陆,默认情况下你也需要每次右击“以管理员权限运行”。这也意味着如果标准账户想要运行OpenVPN,就需要拥有管理员权限的账户密码。否则标准用户是无法使用OpenVPN连接的。所以确保权限的分配正确到位。
如果想要让OpenVPN始终以管理员权限运行,右击OpenVPN桌面快捷方式选择属性。在最后的“兼容性”标签里,点击“为所有用户变更设置”(这个翻译我编的,正常的中文名字不记得了,反正差不多那个意思,这个按钮我记得是在这个标签的最下面)。在弹出的新窗口中把 “以管理员身份运行这个程序”勾上(这个也一样)
连接
每次打开OpenVPN GUI客户端,windows都会问你是否允许程序修改你的电脑,点是。程序启动后会在右下角托盘中显示VPN连接图标,你需要手动启动连接。
在托盘中,右击OpenVPN的图标,选择DigitalOcean这个名字然后选连接,就可以开始连接VPN了
系统会弹出一个日志窗口提示连接状态,一旦连接上服务器,托盘处也会有提示信息。
断开连接也是同样的方法,右击图标选择断开连接。
OS X
安装
OS X上需要安装一个Tunnelblick程序,通过这个连接可以下载到。
安装进程的最后,Tunnelblick会问你是否拥有配置文件。默认你可以选择否直接结束安装,然后打开Finder找到你的DigitalOcean.ovpn,双击,Tunnelblick就会开始安装这个配置文件。这一步需要管理员权限。
连接
双击运行Tunnelblick,当程序启动后,在右上角托盘的地方就会有一个Tunnelblick图标。单击图标,选择连接,然后选择DigitalOcean开始连接。
iOS
安装
从App store里找到OpenVPN Connect这个app,下载安装。然后把你的手机连接到一台电脑上。
你可以通过iTunes来把配置文件发送到OpenVPN Connect这个app中。打开电脑上的iTunes,选择iphone-apps。滚动条到最下放文件共享,选择OpenVPN。把.ovpn文件拖到右边的空白处即可。

现在你可以在手机上打开OpenVPN程序。你会看到一个新增的配置文件已经可以导入,点绿色的加号按钮来导入这个配置文件。

(在这里插一句,把配置文件导入到OpenVPN的方式很多,你也可以把文件上传到网盘然后直接在手机上打开)
连接
现在OpenVPN就准备好连接了。把连接 滑动到on的位置即可,断开连接就是off
注意:在这个例子中,手机设置中的VPN开关,并不能直接用来连接,如果你试一下,系统会提示你只能通过OpenVPN程序进行连接

Android
安装
打开 Google Play Store(国内用户请去各大应用商店下载),找到Android OpenVPN Connect。
你可以直接用安卓手机的USB模式把ovpn文件复制到手机中。或者,用sd卡也行。(bla bla bla~~~)
打开OpenVPN程序然后点击菜单导入配置文件

找到存放配置文件的路径然后选择文件。程序会提示你文件已经导入。

连接
点击连接按钮就可以开始连接VPN。系统会提示你是否信任OpenVPN程序,选择OK开始连接。断开连接也需要打开OpenVPN程序,点击断开

(最后这里还有一个第六步,主要是讲测试VPN连接的,实在没心思翻了,有兴趣的同学请看原文。主要是用的那个blogo的博客程序对拼音输入法的支持一塌糊涂,还好没冲动买正版,果断写完就卸载了)
恭喜你!现在你可以安全的上网啦bla bla bla~~~(我们不就是为了翻个墙么~~~)