简介

  在连接了不可信的网络环境后,让手机或者计算机安全的访问互联网,使用虚拟专用网络(Virtual Private Network,VPN)是一个解决办法。OpenVPN是一个SSL VPN完整解决方案,本教程将在ubuntu14.04上搭建OpenVPN,再在计算机、手机上连接。

材料

  ubuntu14.04系统,在root权限下操作。

第一步:安装配置OpenVPN服务

  这是在服务器端的完整操作。

OpenVPN配置: 

apt-get update

  安装OpenVPN 和 Easy-RSA:

apt-get install openvpn easy-rsa

  在/etc/openvpn目录中存放VPN服务器配置文件:

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

  编辑配置文件:

vim /etc/openvpn/server.conf

  做几处修改,文件打开是这样的:

 # Diffie hellman parameters.
 # Generate your own with:
 #   openssl dhparam -out dh1024.pem
 # Substitute   if you are using
 #  bit keys.
 dh dh1024.pem

  编辑第六行,将RSA秘钥的长度加倍:

dh dh2048.pem

  继续修改这个地方:

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

  继续修改:

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

  去掉7、8行的注释分号,服务器将此DNS推送给客户端:

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

  最后一处修改:

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

  将3、4行的注释分号去掉,将OpenVPN限制在nobody和nogroup中:

 user nobody
 group nogroup

  保存并退出:wq

转发:

  使能转发:

 > /proc/sys/net/ipv4/ip_forward

  编辑文件:

vim /etc/sysctl.conf

  看到:

 # Uncomment the next line to enable packet forwarding for IPv4
 #net.ipv4.ip_forward=

  取消2行注释:

 # Uncomment the next line to enable packet forwarding for IPv4
 net.ipv4.ip_forward=

  保存并退出:wq

简单防火墙(Uncomplicated Firewall,ufw)设置:

  ufw在ubuntu14.04中自带,首先放行SSH协议:

ufw allow ssh

  本教程使用OpenVPN的UDP模式,并且使用1194端口:

ufw allow /udp

  编辑转发策略:

vim /etc/default/ufw

  修改:

DEFAULT_FORWARD_POLICY="DROP"

  为:

DEFAULT_FORWARD_POLICY="ACCEPT"

  保存退出。接着在ufw转发中添加网络地址转换规则,编辑:

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
 #

11 # START OPENVPN RULES
12 # NAT table rules
13 *nat
14 :POSTROUTING ACCEPT [0:0]
15 # Allow traffic from OpenVPN client to eth0
16 -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
17 COMMIT
18 # END OPENVPN RULES

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

  确定使能修改:

ufw enable

  成功后输出下面这条:

Firewall is active and enabled on system startup

  查看一下防火墙规则:

ufw status

  应该输出下面这些内容:

 Status: active

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

第二步:生成certificate authority(CA)、服务器端证书、秘钥

  OpenVPN使用证书加密通信。

配置、生成CA:

  为OpenVPN建立CA、生成证书和秘钥。OpenVPN通过证书可支持双向认证,意味着在建立可信通信之前客户端必须验证服务器证书服务器必须验证客户端证书。使用Easy RSA:

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

  新建一个保存秘钥的目录:

mkdir /etc/openvpn/easy-rsa/keys

  设置参数:

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"

  以及,将这个变量统一设置为server:

export KEY_NAME="server"

  生成迪菲赫尔曼(Diffie-Hellman)参数,需要花费一些时间:

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

  进入Easy-RSA的目录:

cd /etc/openvpn/easy-rsa

  初始化PKI(Public Key Infrastructure)。注意第一个“.”,“./vars”之间有空格,第一个“.”代表本目录:

. ./vars

  有可能输出如下,不必在意,这是因为/keys中没有任何文件:

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

  现在清除工作空间目录,以及任何旧的秘钥或者示例秘钥:

./clean-all

  最后一个命令是建立CA,按回车跳过确认参数的步骤即可:

./build-ca

为服务器生成证书和秘钥:

  依然在/etc/openvpn/easy-rsa中,按回车跳过确认步骤:

./build-key-server server

  这次多了两个选项,依然按回车保持空即可:

 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]
  out of  certificate requests certified, commit? [y/n]

  最后输出:

 Write out database with  new entries
 Data Base Updated

使用服务器端证书和秘钥:

  OpenVPN需要在目录/etc/openvpn中使用服务器的CA、证书、以及秘钥,复制过去即可:

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

  这时,OpenVPN服务器已经配置完成,开启并查看:

 service openvpn start
 service openvpn status

  状态输出:

VPN 'server' is running

第三步:生成客户端证书和秘钥

  到目前为止已经安装和配置好OpenVPN服务器,创建了CA,服务器证书和秘钥。在此,使用服务器CA来生成客户端证书秘钥,以保证客户端可以通过服务器的验证。这些客户端文件之后需要放置到客户端机器内。

创建秘钥和证书:

  连接到VPN的每个客户端都最好有其自己独特的证书和秘钥。不过所有客户端都公用一个证书和秘钥有时候也是可以的。

默认:OpenVPN不允许客户端使用相同的证书和秘钥同时连接服务器。(参见“/etc/openvpn/server.conf”中的“duplicate-cn”)

  为使得不同的设备同时连接VPN服务器,此步骤必须为所有的客户端都执行一遍。取不同的名字,例如client2,mi2,iPhoneX。为client1建立秘钥证书:

./build-key client1

  按回车执行参数确认,确认问题y。输出:

 Write out database with  new entries
 Data Base Updated

  client配置文件也需要复制到Easy-RSA目录中,在下载到不同客户端编辑配置文件时,这个可以当做模板。在客户端中,此文件后缀名需要由“client.conf”变为“client.ovpn”:

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

  为不同的客户端重复执行以上步骤,但是要将“client1”改为不同的名字。

将证书和秘钥复制到客户端设备:

  之前我们将客户端的证书和秘钥存在了OpenVPN服务器端的/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

  至此下载如下四个文件到客户端机器中:

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

第四步:为客户端设备创建一个公用的OpenVPN配置文件

  管理客户端文件最简单的方式是使用统一配置文件(unified profile),由“client.ovpn”修改而成。我们将服务器搭载在腾讯云上,我们将“client.ovpn”名字修改为“qcloud.ovpn”,打开并修改为服务器ip:

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

  取消注释:

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

  注释:

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

  粘贴ca.crt client1.crt client1.key的内容到qcloud.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设备的统一OpenVPN客户端配置文件就做好了。

第五步:安装客户配置文件

  现在我们可以利用qcloud.ovpn文件来登陆VPN服务器了。客户端支持Windows,Mac,Android,Linux。

  在Linux中

乔思祎 未完待续 2017年9月18日23:57:20

在ubuntu14.04上搭建OpenVPN服务的更多相关文章

  1. 在Ubuntu14.04上搭建自己的OpenVPN服务器并通过它上网

    背景 学校宿舍端口可以配置静态IP连校内网,也可以连到实验室的服务器:实验室的服务器可以连外网:但宿舍要连外网就要花钱买PPPoE账号了.作为壮哉我大计院的一员,本着发扬专(neng)业(sheng) ...

  2. ubuntu14.04上搭建android开发环境

    这几天心血来潮,想在ubuntu上写写android软件.所以就上网找些资料在ubuntu上搭建android环境.结果要么时不完整的,要么就是过时的. 所以我把我搭建android环境的过程写下了, ...

  3. Ubuntu14.04下搭建VPN服务 -pptp

    在Ubantu下采用PPTP搭建VPN,优点是配置简单快捷.本教程亲自测试,熟练了在新机器上5分钟搞定VPN. - - - - - - - - - - - - - - - - - - - - - - ...

  4. AWS ec2的ubuntu14.04上安装git服务

    http://imerc.xyz/2015/11/13/Ubuntu-14-04%E4%B8%8AGit%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%90%AD%E5 ...

  5. Ubuntu14.04下搭建VPN服务

    直接上步骤: 1.第一步需要安装PPTP,以用来提供VPN服务. sudo apt-get install pptpd 如果有问题的话比如提示找不到之类的,apt-get update 一下应该就可以 ...

  6. Ubuntu14.04上搭建FTP服务器

    Ubuntu上常用的Ftp服务器是vsFTPd.安装前检查下是否已经装好了.用 sudo service vsftpd restart,如果提示重启成功之类的信息,说明此服务器已经安装好了vsFTPd ...

  7. Ubuntu14.04上安装tftpd服务

    首先sudo apt-get install tftpd-hpa,  tftp-hpa 然后sudo vim /etc/default/tftpd-hpa 配置文件如下 TFTP_USERNAME=& ...

  8. 在 Ubuntu14.04 上搭建 Spark 2.3.1(latest version)

    搭建最新的 Spark 2.3.1 . 首先需要下载最新版 jdk .目前 2.3.1 需要 8.0 及其以上 jdk 才可以允许. 所以如果你没有 8.0  jdk 安装好了之后会报错.不要尝试安装 ...

  9. 【转】Linux(ubuntu14.04)上编译Android4.4源码的环境搭建及编译全过程

    原文网址:http://jileniao.net/linux-android-building.html sublime text让我伤心.本来很信任sublime text的自动保存功能,之前使用一 ...

随机推荐

  1. Java实现时钟小程序【代码】

    哎,好久没上博客园发东西了,上一次还是两个月前的五一写的一篇计算器博客,不过意外的是那个程序成了这学期的Java大作业,所以后来稍微改了一下那个程序就交了上去,这还是美滋滋.然后五月中旬的时候写了一个 ...

  2. [转]Linux下彻底卸载mysql详解

    http://www.jb51.net/article/97516.htm 一.使用以下命令查看当前安装mysql情况,查找以前是否装有mysql 1 rpm -qa|grep -i mysql 可以 ...

  3. 一起玩转mysql

    mysql安装 一起玩转mysql linux命令

  4. keras_基本网络层结构(1)_常用层

    参考文献: https://blog.csdn.net/sinat_26917383/article/details/72857454 http://keras-cn.readthedocs.io/e ...

  5. 一台 linux 主机装两个mysql

    启动 3306 nohup /usr/local/mysql5.1.7/bin/mysqld_safe & 启动 3307/usr/local/mysql/bin/mysqld --defau ...

  6. free命令学习 输出理解

    命令 [root@localhost ~]# free -m total used free shared buffers cached Mem: 7869 7651 218 1 191 5081 - ...

  7. socket编程---UDP

    头文件 #include <sys/types.h> #include <sys/socket.h> 函数原型 int sendto (int s, const void *b ...

  8. UDP的connect

    UDP的connect没有三次握手过程,内核只是检测是否存在立即可知的错误(如一个显然不可达的目的地), 记录对端的的IP地址和端口号,然后立即返回调用进程. 未连接UDP套接字(unconnecte ...

  9. Mplayer1.0rc2移植到am335x开发板

    因项目需要媒体播放器,所以准备使用QT+Mplayer来做,但遇到了屏幕闪烁的问题,无法满足需求. 1.参考<mplayer 移植到 arm 心得> ,http://blog.csdn.n ...

  10. CentOS6.6安装(转)

    2015-3-6CentOS6.6安装 环境:工控机 1.选择安装software development workstation,其他参考以下文档过程 一.安装CentOS 6.6,安装结束重新启动 ...