内容简介

OpenVPN在服务器端的安装,密钥文件的配置和生成,密钥文件分发,Linux以及Android下OpenVPN客户端设置与运行。另外如果习惯英文教程的朋友请移步这里,感谢原作者Justin Ellingwood!这篇博文基本上就是一翻译。

第1步

以非root的身份链接到服务器,并且更新一下软件源,并且安装openvpn和easy-rsa。openvpn不用多说,easy-rsa是实现文件加密

sudo apt-get update
sudo apt-get install openvpn easy-rsa
第2步

OpenVPN是需要证书颁发机构CA,而这个CA就需要借助刚刚安装的easy-rsa咯。首先输入如下命令:

cd ~

将服务器的操作目录转移到这个身份的根目录~/。之后输入如下命令,

make-cadir ~/openvpn-ca
cd ~/openvpn-ca

建立一个文件夹专门放easy-rsa的模板。我们之后就会在这个模板里面进行客制化CA操作。

第3步

客制化需要改编的文件:~/openvpn-ca/vars,因为我们当前的工作目录就是~/openvpn-ca,所以只需要输入如下命令打开文件:

nano vars

通过ctrl + w这个命令我们可以用关键词搜索文件中的位置。第一个需要搜索的是“export KEY_COUNTRY=”US””,找到这一串默认的

export KEY_COUNTRY=”US”
export KEY_PROVINCE=”CA”
export KEY_CITY=”SanFrancisco”
export KEY_ORG=”Fort-Funston”
export KEY_EMAIL=”该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。”
export KEY_OU=”MyOrganizationalUnit”

按照我们各自的实际情况来改,给一个例子:

export KEY_COUNTRY=”US”
export KEY_PROVINCE=”NY”
export KEY_CITY=”New York City”
export KEY_ORG=”DigitalOcean”
export KEY_EMAIL=”该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。”
export KEY_OU=”Community”

可以照着这个自己改。这些都是一些为生成CA添加的附加信息。除此之外,紧跟这这段,加一句export KEY_NAME="server"。然后ctrl + x保存关闭文件。然后输入如下命令:

source vars

让系统重新加载一下刚才修改好的 vars。之后如果系统中原来已经有了一些密钥文件放在~/openvpn-ca/keys的话,推荐将他们删除,对应的命令是

./clean-all

第4步

客制化结束之后真正使用easy-rsa生成CA文件,首先保证工作目录为~/openvpn-ca,之后生成CA

./build-ca

在这步的过程中会有提示我们一些关于CA附加信息的确认问题,我们直接回车就可以,一路回车到底。完成!恭喜你,已经生成了用于授权密钥的CA啦!

第5步

生成server端使用的密钥。

rsa其实是一个加密算法,easy-rsa就是实现这个算法的一款linux程序,所以继续用easy-rsa去生成密钥,然后再添加给openvpn。那可以理解为上一步生成CA就是为了密钥而准备的,前续工作。

运行如下命令:

./build-key-server server

注意这里的参数server是对应我们第三步中,export KEY_NAME="server"这个密钥名称的。所以之前其实你想叫啥都可以,只要两个地方统一就好。但是下面的教程都是按照叫做server来写的,所以为了方便就叫它server吧。依然,这个build过程会问很多问题,都回车enter或者y就好了。其中有一个问题是要我们给一个challenge password,不用担心它,也直接回车就好。

下一步是生成用于密钥交换的dh密钥,以及将我们这步产生的ta.key配置给openvpn

./build-dh
openvpn –genkey –secret keys/ta.key
第6步

生成client端使用的密钥。因为这步我们可能会重复很多次,openvpn支持多用户共同使用,所以首先保证我们已经做了

cd ~/openvpn-ca
source vars

然后生成client的密钥,这里我们给进的参数client1是给client密钥的名称,随便取辣,不过鉴于这是我们第一次生成client密钥,就不妨叫它client1吧,好记。

./build-key client1

同样的,这一步也会有问这问那,直接enter或者y。

第7步

配置openvpn,首先将之前生成的keys目录下的文件拷贝到openvpn下:

cd ~/openvpn-ca/keys
sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn

注意这里的server.crt以及server.key都是与第4步中你的选择相一致的,如果你选择取别的名字就需要自己改过来。然后将openvpn自带的一个预定义配置解压出来供我们之后更改,这样就不用从头写了。

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

然后开始修改这个配置,依旧用nano打开它。

sudo nano /etc/openvpn/server.conf

注意这里的server.conf是与第4步中你的选择相一致的,如果你选择取别的名字就需要自己改过来。

找到tls-auth,将这行最前面的;去掉解除注释。另外在它下面加上key-direction 0,长成这样:

tls-auth ta.key 0 # This file is secret
key-direction 0

找到cipher,选择cipher AES-128-CBC这种加密密码。同样的也是把它前面的;去掉。另外在它下面加上auth SHA256,指定TLS的授权算法。

cipher AES-128-CBC
auth SHA256

找到user和group,将它们的;去掉。

user nobody
group nogroup

为了让我们所有的网络请求都通过vpn流转,我们必须给client一个OpenDNS,以及设置openvpn流转方式。找到redirect-gateway,去掉;。

push “redirect-gateway def1 bypass-dhcp

找到dhcp-option,去掉两行的;。

push “dhcp-option DNS 208.67.222.222”
push “dhcp-option DNS 208.67.220.220”

改vpn端口和传输层协议为tcp,找到port改为你想要用的端口,找到proto改为tcp

port 12345
proto tcp

最后如果你在第4步中把key_name叫成了其他名字而不是server,那么需要找到cert和key,将cert和key改为你自己叫得名字。这里我们贴出原来默认的server.crt 与 server.key。

cert server.crt
key server.key

保存并且关闭nano。

第8步

允许系统进行ip包转发, 打开/etc/sysctl.conf

sudo nano /etc/sysctl.conf

找到net.ipv4.ip_forward,将前面的#去掉,也是取消注释的意思。

net.ipv4.ip_forward=1

保存关闭nano,并且重新让系统读取一遍这个文件

sudo sysctl -p

接下来找到VPS的公共网络接口,复制它。

ip route | grep default

在输出中的dev后面那个就是公共网络接口,例如 wlp11s0就是。

default via 203.0.113.1 dev wlp11s0 proto static metric 600

打开/etc/ufw/before.rules,随便在哪里添加一下OpenVPN的防火墙规则。继续用上面这个wlp11s0的例子。

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o wlp11s0 -j MASQUERADE
COMMIT

保存关闭。

打开/etc/default/ufw,找到DEFAULT_FORWARD_POLICY,将它改为:

DEFAULT_FORWARD_POLICY=”ACCEPT”

保存关闭。

设置ufw ,允许OpenVPN的端口和使用的tcp协议,保证ufw允许ssh。并且重启。XXXXX是我们在第7步中设置的端口。

sudo ufw allow XXXXX/tcp
sudo ufw allow OpenSSH
sudo ufw disable
sudo ufw enable
第9步

开启VPS的OpenVPN服务,并设置开机自动启动。

sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server
第10步

OpenVPN的服务器端的设置就搞定辣!接下来是client的内容。当然之前也用了easy-rsa去生成client的密钥。创建一个OpenVPN的client文件夹,然后设置为只有我们这个用户可以读,可以写,可以允许。然后将OpenVPN提供的关于client的设置拷贝进去,之后用nano打开这个设置,准备修改。

mkdir -p ~/client-configs/files
chmod 700 ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
nano ~/client-configs/base.conf

找到remote,将后面的ip和端口设置为自己的VPS的公网IP(VPS_IP_address)以及,我们在第7步中设置的端口(XXXXX)。

remote VPS_IP_address XXXXX

找到proto,改为tcp

proto tcp

找到user和group,去掉前面的;

user nobody
group nogroup

找到ca ca.crt,cert client.crt,key client.key,将他们最前面加上#注释掉。找到tls-auth,在它下面加上key-direction 1,长成这样:

key-direction 1

找到cipher,选择cipher AES-128-CBC这种加密密码。同样的也是把它前面的;去掉。另外在它下面加上auth SHA256,指定TLS的授权算法。

cipher AES-128-CBC
auth SHA256

然后再任意地方加上三行代码,在linux安装OpenVPN时会用到。

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

保存关闭。

第11步

建立client.opvn生成bash file.

nano ~/client-configs/make_config.sh

将下面内容复制进去。

#!/bin/bash

# First argument: Client identifier

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

cat ${BASE_CONFIG} \
    <(echo -e '') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '\n') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '\n') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '\n') \
    ${KEY_DIR}/ta.key \
    <(echo -e '') \
    > ${OUTPUT_DIR}/${1}.ovpn

保存关闭。设置执行权限:

chmod 700 ~/client-configs/make_config.sh

生成client的OpenVPN文件,注意里面的参数client1是我们在第6步中定的名字。

./make_config.sh client1

ok!在~/client-configs/files文件夹下面有一个client1.ovpn文件了,这个就是我们client需要的唯一一个文件了!到这里我们所有OpenVPN的设置都完成了。下面是具体如何操作。

Ubuntu客户端链接VPN服务器

同样将client1.ovpn从远程VPS用sftp命令下载到本地电脑:

scp -i xxx.pem username@SERVER_IP:client-configs/files/client1.ovpn ./

更新软件源,然后安装OpenVPN。

sudo apt-get update
sudo apt-get install openvpn

然后检查是否本地有/etc/openvpn/update-resolv-conf这个文件存在,如果不存在则跳过这点,反之打开client1.ovpn,找到script-security,删除三个#。

nano client1.ovpn

删除#后是这样的。

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

保存关闭。然后在本地运行OpenVPN

sudo openvpn --config client1.ovpn