How To Set Up an OpenVPN Server on Ubuntu 14.04[译]
默认分类
2020-01-15
420
0
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 nobody
和group 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.key
和server.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.crt
和client.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/
以下是几个安全传输工具:
- 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
最后你的客户端设备应该有以下四个文件
- 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 nobody
和group 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。启动后会显示在你的系统状态栏