内容简介
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