一.简介
如果在一个非信任网络下比如旅社或者咖啡店的WiFi网络下,想要通过你的智能手机或者笔记本电脑安全地访问互联网,那么VPN可以满足你的要求。VPN(VirtualPrivate Network)允许你私有地(privately)安全地(securely)穿过非信任的网络,就好像为你建立了一条专属网络。你的数据流量到达VPN服务器之后,VPN服务器继续将你的网络流量送达目的地。
如果配合HTTPS连接,这个方案可以让你的无线登录和数据传输变得安全。VPN可以让你克服地理限制和审查(比如克服大陆的GFW),保护你的本地位置信息等。
OpenVPN是一个全功能的开源安全套接字层(SSL)VPN解决方案,它包含大量的配置信息。在这篇教程里,我们将在一个公网服务器(本文的服务器为Ubuntu16.04)上面安装一个OpenVPN服务器然后进行相应的配置,使得Windows,OS X,IOS以及Android客户端能够访问它。
二.部署
初始配置
1.执行脚本
wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh
2.Ubuntu的默认仓库就有openvpn的包,但要更新一下才行。还需安装一个easy-rsa包,这个包可以建立一个内部CA证书系统,帮助VPN进行认证。
apt-get update
apt-get install openvpn easy-rsa
安装CA
1.建立CA目录,OpenVPN是一个TLS/SSLVPN,这意味着它需要使用证书来在客户端和服务器之间加密数据。为了发布可信的证书,我需要建立我们自己的简单CA
复制easy-rsa临时目录到家目录
make-cadir ~/openvpn-ca
2.配置CA变量
cd ~/openvpn-ca
将最后几行更改,改成其它的,不要空着
vim vars
exportKEY_COUNTRY="US"
exportKEY_PROVINCE="CA"
exportKEY_CITY="SanFrancisco"
exportKEY_ORG="Fort-Funston"
exportKEY_EMAIL="me@myhost.mydomain"
exportKEY_OU="MyOrganizationalUnit"
例如这样
代码语言:javascript复制export KEY_COUNTRY="CN"
export KEY_PROVINCE="GD"
export KEY_CITY="ShanTou City"
export KEY_ORG="STU"
export KEY_EMAIL="qfuqin@163.com"
export KEY_OU="University"
更改KEY_NAME的值,这里设置为server,其它值也可以
代码语言:javascript复制export KEY_NAME="server"
3.用easy-rsa包来制作CA
cd ~/openvpn-ca
source vars
提示如下则正确 NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/sammy/openvpn-ca/keys
进入CA环境
./clean-all
开始制作根证书颁发机构密钥(rootcertificate authority key )和证书(certificate),由于我们刚刚填了vars文件,证书制作所需要变量的值都会自动填充,制作过程中你只需要回车来确认就行
./build-ca
制作服务端所需要的证书,这些证书就像传统的用于加密过程的文件一样。通过键入如下命令来生成服务端所需的证书,server就是KEY_NAME的值。默认回车,最后2个需要按Y
./build-key-server server
为服务器生成加密交换时的Diffie-Hellman文件,需要等几分钟
./build-dh
生成一个HMAC签名来增强服务器的TLS完整性验证能力
openvpn --genkey --secret keys/ta.key
4.制作Client端的Certificate
客户端的相关证书可以在客户端的机器上面生成,为了简单起见,这里在服务器上面来生成客户端的相关证书,然后再把服务器上生成的客户端证书下载到本地客户端上面。我们用client1来命名我们的第一个证书/密钥对,用build-key命令来生成没有密码情况下的凭证,并且用于自动连接
cd ~/openvpn-ca
source vars
./build-key client1
配置OpenVPN服务器
1.把相关文件复制到/etc/openvpn这个配置目录中去
cd ~/openvpn-ca/keys
cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
2.修改配置文件
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn
cd /etc/openvpn/
gzip -d server.conf.gz
vim /etc/openvpn/server.conf
tls-auth ta.key 0 #去掉注释
key-direction 0 #添加
cipher AES-128-CBC #去掉注释
auth SHA256 #添加
server 10.8.0.0 255.255.255.0 #添加,虚拟网段
user nobody #去掉注释
group nogroup #去掉注释
3.调整网络服务,增加内核转发
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
生效
sysctl -p
4.配置防火墙,查看网卡名,默认eth0
ip route | grep default
修改防火墙文件,在最开头注释后面 添加如下部分
/etc/ufw/before.rules
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0(changeto the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -jMASQUERADE #这里为配置文件设置的虚拟网段
COMMIT
# END OPENVPN RULES
配置防火墙默认允许转发包,DROP改成ACCEPT
vim /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"
5.调整防火墙本身,以允许流量到OpenVPN,如果更改了配置文件中端口号,这里需要对应
ufw allow 1193/udp
ufw allow OpenSSH
重启防火墙,到这里我们的服务器可以正确地处理OpenVPN流量了
ufw disable
ufw enable
6.开启OpenVPN服务
在systemd单元文件的后面,我们通过指定特定的配置文件名来作为一个实例变量来开启OpenVPN服务,我们的配置文件名称为/etc/openvpn/server.conf,所以我们在systemd单元文件的后面添加@server来开启OpenVPN服务
systemctl start openvpn@server
systemctl status openvpn@server
查看tun是否启动
ip addr show tun0
一切正常后,设置开机启动
systemctl enable openvpn@server