爱就爱了

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6908|回复: 0

怎样在 Ubuntu 16.04 上安装 OpenVPN 服务

[复制链接]
发表于 2016-6-28 20:39:09 | 显示全部楼层 |阅读模式
作者:xlzd | 时间:2016-06-27 20:32:00

参考自 How To Set Up an OpenVPN Server on Ubuntu 16.04

为什么需要 OpenVPN

对我来讲,有两个原因:

  • 安全地在不安全的网络环境下上网:如需要在酒店、咖啡厅或者不可信任的 Wi-Fi 环境下上网时,我需要确保自己不会被监听。
  • 跨过防火墙,享受自由的网络环境。

那么,为什么我不用 ShadowSocks 呢?答案是,其实我也在用,不过它在 iOS 上的表现确实无法令人满意,另外,PC 端使用 Chrome 配合 ss 翻墙的时候需要很复杂的配置(或许我不会用吧),相比之下, OpenVPN 可以非常方便的全部搞定(除了安装比较复杂)。所以,这篇博客记录下 OpenVPN 服务的安装过程,以供参考。

文中使用的服务器是 Ubuntu 16.04,不过 Debian 系的操作系统应该是可以通用的。

安装 OpenVPN,设置 CA 目录

首先,在服务器端安装 OpenVPN 服务。我们可以很方便地通过 apt-get 安装,另外我们也需要安装easy-rsa:

  1. $ sudo apt-get update
复制代码

然后,复制 easy-rsa 模板到 home 目录:

  1. $ make-cadir ~/openvpn-ca
复制代码
配置 CA 变量

进入 openvpn-ca 目录之后,用 vim (或者任意编辑器) 打开 vars 文件,到最后一部分,你将会看到如下内容:

  1. <div>. . .</div><div>export KEY_COUNTRY="US"</div><div>export KEY_PROVINCE="CA"</div><div>export KEY_CITY="SanFrancisco"</div><div>export KEY_ORG="Fort-Funston"</div><div>export KEY_EMAIL="me@myhost.mydomain"</div><div>export KEY_OU="MyOrganizationalUnit"</div><div>. . .</div>
复制代码

修改为任意你想要修改的值,只要不留空就好了:

  1. <div>. . .</div><div>export KEY_COUNTRY="CN"</div><div>export KEY_PROVINCE="BJ"export KEY_CITY="Beijing"export KEY_ORG="xlzd"export KEY_EMAIL="what@the.fuck"export KEY_OU="Community"</div><div>. . .</div>
复制代码

然后,还需要将 KEY_NAME 改为你喜欢的,这里简单起见,我们改成 server:

  1. export KEY_NAME="server"
复制代码

然后,保存并关闭文件。

构建 Certificate Authority

在刚才的目录中,执行 source vars ,然后,你将会看到如下输出:

  1. NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/xlzd/openvpn-ca/keys
复制代码

然后执行:

  1. $ ./clean-all
复制代码

这将会启动创建根证书颁发密钥、证书的过程。由于我们刚才修改了 vars 文件,所有值应该都会自动填充。所以,一路回车就好了:

  1. <div>Output</div><div>Generating a 2048 bit RSA private key</div><div>..........................................................................................+++</div><div>...............................+++</div><div>writing new private key to 'ca.key'</div><div>-----</div><div>You are about to be asked to enter information that will be incorporated</div><div>into your certificate request.</div><div>What you are about to enter is what is called a Distinguished Name or a DN.</div><div>There are quite a few fields but you can leave some blank</div><div>For some fields there will be a default value,</div><div>If you enter '.', the field will be left blank.</div><div>-----</div><div>Country Name (2 letter code) [CN]:</div><div>State or Province Name (full name) [BJ]:</div><div>Locality Name (eg, city) [Beijing]:</div><div>Organization Name (eg, company) [xlzd]:</div><div>Organizational Unit Name (eg, section) [Community]:</div><div>Common Name (eg, your name or your server's hostname) [the.fuck]:</div><div>Name [server]:</div><div>Email Address [waht@the.fuck]:</div>
复制代码

到此,我们就有了创建以下步骤需要的 CA 证书。

创建服务器端证书、密钥和加密文件

执行 ./build-key-server server 命令,然后继续一路回车就好了。到最后,你需要输入两次 y 注册证书和提交:

  1. <blockquote>. . .
复制代码

然后还需要生成一些其他东西,在终端执行 ./build-dh,这个操作大约会花费几分钟不等。然后,我们可以生成 HMAC 签名加强服务器的 TLS 完整性验证功能:

  1. openvpn --genkey --secret keys/ta.key
复制代码

生成客户端证书、密钥对

这一步之后可能会执行多次以生成不同的证书,这里我们以 xclient 作为第一组密钥对的名字:

  1. cd ~/openvpn-ca
复制代码

跟刚才一样,一路回车就好。

配置 OpenVPN 服务

首先,复制文件到 OpenVPN 的目录下:

  1. $ cd ~/openvpn-ca/keys
  2. $ sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
复制代码

然后,复制并解压一个 OpenVPN 的配置示例:

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

接着是调整配置,打开 /etc/openvpn/server.conf 文件,找到 redirect-gateway 的位置,去掉注释,修改为如下:

  1. push "redirect-gateway def1 bypass-dhcp"
复制代码

然后找到 dhcp-option 位置,修改为下面这样:

  1. push "dhcp-option DNS 208.67.222.222"
  2. push "dhcp-option DNS 208.67.220.220"
复制代码

再找到 tls-auth 位置,去掉注释,并在下面新增一行:

  1. tls-auth ta.key 0 # This file is secret
  2. key-direction 0
复制代码

最后,去掉 user 和 grup 行前的注释:

  1. user nobody
  2. group nogroup
复制代码
调整服务器网络配置允许 IP 转发

编辑 /etc/sysctl.conf 文件,去掉 net.ipv4.ip_forward 设置前的注释:

  1. net.ipv4.ip_forward=1
复制代码

输入 sudo sysctl -p 以读取文件并对当前会话生效。

调整 UFW 规则

编辑 /etc/ufw/before.rules 文件,在文件顶部,新增如下 11-18 行的内容:

  1. 01 #
  2. 02 # rules.before
  3. 03 #
  4. 04 # Rules that should be run before the ufw command line added rules. Custom
  5. 05 # rules should be added to one of these chains:
  6. 06 #   ufw-before-input
  7. 07 #   ufw-before-output
  8. 08 #   ufw-before-forward
  9. 09 #
  10. 10
  11. 11 # START OPENVPN RULES
  12. 12 # NAT table rules
  13. 13 *nat
  14. 14 :POSTROUTING ACCEPT [0:0]
  15. 15 # Allow traffic from OpenVPN client to eth0
  16. 16 -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
  17. 17 COMMIT
  18. 18 # END OPENVPN RULES
  19. 19
  20. 20 # Don't delete these required lines, otherwise there will be errors
  21. *filter
  22. . . .
复制代码

其中,第 16 行还需要做一点调整。在终端执行 ip route | grep default 命令,你会看到类似如下的输出:

  1. default via 100.110.78.1 dev ens3
复制代码

dev 之后的内容便是我们需要的,如我执行后输出如上,则我需要的是 ens3,每个人的结果可能不同,用它替换掉刚才文件第 16 行的 eth0,然后保存文件,退出。

接着需要修改 /etc/default/ufw 文件,找到 DEFAULT_FORWARD_POLICY 设置,修改为:

  1. DEFAULT_FORWARD_POLICY="ACCEPT"
复制代码

打开 OpenVPN 端口并使变化生效

执行下面的命令:

  1. $ sudo ufw allow 1194/udp

  2. $ sudo ufw disable
  3. $ sudo ufw enable
复制代码
启动 OpenVPN

执行:

  1. $ sudo systemctl start openvpn@server
复制代码

然后设置自启动:

  1. $ sudo systemctl enable openvpn@server
复制代码
创建客户端配置

执行:

  1. $ mkdir -p ~/client-configs/files

  2. $ chmod 700 ~/client-configs/files

  3. $ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
复制代码

然后打开 ~/client-configs/base.conf 文件,修改 remote server_IP_address 1194 一行为你的服务器公网 IP,然后去掉 user 和 group 前的注释:

  1. # Downgrade privileges after initialization (non-Windows only)
  2. user nobody
  3. group nogroup
复制代码

找到 ca/cert/key,注释掉:

  1. # SSL/TLS parms.
  2. # See the server config file for more
  3. # description.  It's best to use
  4. # a separate .crt/.key file pair
  5. # for each client.  A single ca
  6. # file can be used for all clients.
  7. #ca ca.crt
  8. #cert client.crt
  9. #key client.key
复制代码

最后在文件末新增一行:

  1. key-direction 1
复制代码

保存,退出文件。

创建配置生成脚本

新建 ~/client-configs/make_config.sh 文件,复制如下内容:

  1. #!/bin/bash

  2. # First argument: Client identifier

  3. KEY_DIR=~/openvpn-ca/keys
  4. OUTPUT_DIR=~/client-configs/files
  5. BASE_CONFIG=~/client-configs/base.conf

  6. cat ${BASE_CONFIG} \
  7.     <(echo -e '<ca>') \
  8.     ${KEY_DIR}/ca.crt \
  9.     <(echo -e '</ca>\n<cert>') \
  10.     ${KEY_DIR}/${1}.crt \
  11.     <(echo -e '</cert>\n<key>') \
  12.     ${KEY_DIR}/${1}.key \
  13.     <(echo -e '</key>\n<tls-auth>') \
  14.     ${KEY_DIR}/ta.key \
  15.     <(echo -e '</tls-auth>') \
  16.     > ${OUTPUT_DIR}/${1}.ovpn
复制代码

保存并赋予执行权限:

  1. $ chmod 700 ~/client-configs/make_config.sh
复制代码
生成客户端配置

执行:

  1. $ cd ~/client-configs
  2. $ ./make_config.sh xclient
复制代码

然后,在 ~/client-configs/files 目录下,便有了 xclient.ovpn 文件。将文件下载到本地即可使用了。


客户端下载

Windows: OpenVPN
OS X: Tunnelblick
iOS: OpenVPN Connect
Android: OpenVPN Connect

下载安装客户端之后,导入刚才的配置文件,就可以愉快又安全地体验没有墙的互联网啦~~~


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|平龙认个人分站 - 爱就爱了 ( 豫ICP备14029057号-2、4、5 )
豫公网安备 41010502002156号

GMT+8, 2024-4-24 07:58 , Processed in 0.044629 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表