什么是OpenVPN
VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI。 [1]
它大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。 [1]
OpenVpn的技术核心是虚拟网卡,其次是SSL协议实现,由于SSL协议在其它的词条中介绍的比较清楚了,这里重点对虚拟网卡及其在OpenVpn的中的工作机理进行介绍: [1]
虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装后在主机上多出现一个网卡,可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件(如IE)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现,这也是OpenVpn能够跨平台一个很重要的理由。 [1]
在OpenVpn中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配用的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,通过SOCKET从外网上发送出去,远程服务程序通过SOCKET从外网上接收数据,并进行相应的处理后,发送给虚拟网卡,则应用软件可以接收到,完成了一个单向传输的过程,反之亦然。 [1]
openvpn和pptp的区别
PPTP点对点隧道协议(PPTP)是一种实现虚拟专用网络的方法。 PPTP使用用于封装PPP数据包的TCP及GRE隧道控制通道。 OpenVPNOpenVPN是一免费开源软件,以路由器或桥接配置和远程访问设备方式实现虚拟专用网络(VPN)创建安全的点对点或站对站连接的解决方案。它使用SSL / TLS安全加密,具有穿越网络地址转换(NATs)和防火墙的功能。 在PPTP和OpenVPN二者之间做出选择的一个重要考虑因素,也是我们无法控制的因素,就是有时互联网服务供应商会阻止PPTP连接。次情况下我们无计可施,只能选择使用OpenVPN。 PPTP具有一些独特优势,但此刻用OpenVPN会是不错的选择。 PPTP可以应用到几乎所有的操作系统软件,无需安装任何软件。它也兼容许多移动设备,如iphone,ipad和Windows移动,安装简易。相比之下,OpenVPN的安装比PPTP要复杂一点,但只要按照正确的指示安装则无太大困难。请注意OpenVPN不兼容移动设备。 PPTP加密技术使用密码作为密钥,它的数据流载有可获取的混编密码。如果中间有人拦截到了数据流并且破译了密码(尽管可能但很难),那么他就可以破译你的信息。然而OpenVPN使用非常强大的加密(Blowfish)技术。即使有人拦截你的数据流,他们也无计可施。这使得OpenVPN比PPTP安全得多。 选择如果你希望得到高安全性以及更加关注数据安全传输问题,那么你应该使用OpenVPN。如果您为了简便或者想在移动设备上使用VPN那么PPTP适合你。还有其他协议,例如L2P或IPSec,但他们在用户友好或成本上没有优势。
安装vpn
代码语言:javascript复制sudo apt-get update
sudo apt-get install openvpn easy-rsa
安装CA
建立CA目录,OpenVPN是一个TLS/SSLVPN,这意味着它需要使用证书来在客户端和服务器之间加密数据。为了发布可信的证书,我需要建立我们自己的简单CA
复制easy-rsa临时目录到home目录
代码语言:javascript复制make-cadir ~/openvpn-ca
cd ~/openvpn-ca
vim vars
系统默认如下
代码语言:javascript复制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="SX"
export KEY_CITY="TaiYuan"
export KEY_ORG="SYSU"
export KEY_EMAIL="bjernsen@163.com"
export KEY_OU="SDCS"
# X509 Subject Field
export KEY_NAME="server"
source FileName 作用:在当前bash环境下读取并执行FileName中的命令。
代码语言:javascript复制cd ~/openvpn-ca
source vars
提示如下则正确 NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/sammy/openvpn-ca/keys
但是我的报错如下
代码语言:javascript复制**************************************************************
No /home/ubuntu/openvpn-ca/openssl.cnf file could be found
Further invocations will fail
**************************************************************
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/ubuntu/openvpn-ca/keys
输入在opencpn-ca目录下,ls指令我们会看到很多个openssl的conf文件,我们将他们更名为openssl.conf就可以了
代码语言:javascript复制cp ~/openvpn-ca/openssl-1.0.0.cnf ~/openvpn-ca/openssl.cnf
然后再输入source vars借口
还是在openvpn-ca目录下 ,构建ca
代码语言:javascript复制./clean-all
./build-ca
一直按回车确认即可
创建服务器证书,密钥和加密文档
接下来,我们将生成服务器证书和密钥对,以及加密过程中使用的一些其他文档。首先生成 OpenVPN 服务器证书和密钥对。我们可以通过输入:
代码语言:javascript复制./build-key-server server
接下来,我们将生成一些其他项目。 我们可以通过键入生成一个强大的 Diffie-Hellman 密钥,以便在密钥交换期间使用
代码语言:javascript复制./build-dh
之后,我们可以生成 HMAC 签名以增强服务器的 TLS 完整性验证功能,这步完成之后会生成一个ta.key在~/openvpn-ca/keys文件夹下
代码语言:javascript复制openvpn --genkey --secret keys/ta.key
生成客户端证书和密钥对
在 openvpn 中,这种配置方法是每一个登陆的 VPN 客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接(如果有两个机器安装相同证书,同时拨服务器,都能拨上,但是只有第一个拨上的才能连通网络)。所以需要建立许多份证书。
代码语言:javascript复制cd ~/openvpn-casource vars./build-key client1
配置 OpenVPN 服务
开始之前,把我们需要的相关文档复制到/etc/openvpn
这个配置目录中去,即把~/openvpn-ca/keys
目录下面的 ca.crt,ca.key,server.crt,server.key,HMAC 签名以及 Diffie-Hellman 文档复制到/etc/openvpn 这个目录下面
cd ~/openvpn-ca/keyssudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
然后从 OpenVPN 自带的配置模板中复制配置文档
代码语言:javascript复制sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/cd /etc/openvpn/sudo gzip -d server.conf.gz
接下来修改配置文档
代码语言:javascript复制sudo vim /etc/openvpn/server.conf
然后找到tls-auth ta.key 0
,在下方增加一个 key-direction 参数,设置其参数值为 0
tls-auth ta.key 0key-direction 0
然后找到cipher AES-256-CBC
,在下方增加auth SHA256
user nobodygroup nobody
调整服务的网络配置
允许 IP 转发 首先,我们需要让我们的服务器来转发流量,这是我们需要 VPN 服务器来提供的最基本的功能。我们可以通过修改/etc/sysctl.conf 文档来调整网络设置
代码语言:javascript复制sudo vim /etc/sysctl.conf
在这个文档里面,找到net.ipv4.ip_forward
,去除这一行之前的”#” 来解注释这个参数:
net.ipv4.ip_forward=1
然后保存退出 为了读取 sysctl.conf 文档并且让调整后设置对当前系统的 session 生效,键入如下命令:
代码语言:javascript复制sudo sysctl -p
然后保存退出 为了读取 sysctl.conf 文档并且让调整后设置对当前系统的 session 生效,键入如下命令:
代码语言:javascript复制sudo sysctl -p
开启 vpn 服务
代码语言:javascript复制sudo service openvpn start
查看 vpn 状态
代码语言:javascript复制sudo service openvpn status
配置防火墙
查看网卡名,默认eth0
代码语言:javascript复制ip route | grep default
可以看到终端中输出了一行内容,我们需要的口号应该是紧跟在“开发”后面的字符串
例如,我的输出如下,则我的公共网络接口为 enp2s0
$ ip route | grep default default via 172.18.159.254 dev enp2s0 proto static metric 100
知道接口后,我们就可以进行具体的 UFW 规则配置(为 NAT 表设置POSTROUTING 默认规则),从而为来自 VPN 的任何流量设置伪装连接。
以root权限打开/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
代码语言:javascript复制DEFAULT_FORWARD_POLICY="ACCEPT"
调整防火墙本身,以允许流量到OpenVPN,如果更改了配置文件中端口号,这里需要对应
代码语言:javascript复制ufw allow 1193/udpufw allow OpenSSH
重启防火墙,到这里我们的服务器可以正确地处理OpenVPN流量了
代码语言:javascript复制ufw disableufw enable
配置客户端
config文件夹中应该有5个东西,ca.crt,client.crt,client1.ket,ta.key以及配置文件cilent.ovpn
代码语言:javascript复制############################################### Sample client-side OpenVPN 2.0 config file ## for connecting to multi-client server. ## ## This configuration can be used by multiple ## clients, however each client should have ## its own cert and key files. ## ## On Windows, you might want to rename this ## file so it has a .ovpn extension ################################################ Specify that we are a client and that we# will be pulling certain config file directives# from the server.client# Use the same setting as you are using on# the server.# On most systems, the VPN will not function# unless you partially or fully disable# the firewall for the TUN/TAP interface.;dev tapdev tun# Windows needs the TAP-Win32 adapter name# from the Network Connections panel# if you have more than one. On XP SP2,# you may need to disable the firewall# for the TAP adapter.;dev-node MyTap# Are we connecting to a TCP or# UDP server? Use the same setting as# on the server.;proto tcpproto udp# The hostname/IP and port of the server.# You can have multiple remote entries# to load balance between the servers.remote 81.70.205.40 1194;remote my-server-1 1194;remote my-server-2 1194# Choose a random host from the remote# list for load-balancing. Otherwise# try hosts in the order specified.;remote-random# Keep trying indefinitely to resolve the# host name of the OpenVPN server. Very useful# on machines which are not permanently connected# to the internet such as laptops.resolv-retry infinite# Most clients don't need to bind to# a specific local port number.nobind# Downgrade privileges after initialization (non-Windows only)user nobodygroup nobody# Try to preserve some state across restarts.persist-keypersist-tun# If you are connecting through an# HTTP proxy to reach the actual OpenVPN# server, put the proxy server/IP and# port number here. See the man page# if your proxy server requires# authentication.;http-proxy-retry # retry on connection failures;http-proxy [proxy server] [proxy port #]# Wireless networks often produce a lot# of duplicate packets. Set this flag# to silence duplicate packet warnings.;mute-replay-warnings# SSL/TLS parms.# See the server config file for more# description. It's best to use# a separate .crt/.key file pair# for each client. A single ca# file can be used for all clients.ca ca.crtcert client1.crtkey client1.key# Verify server certificate by checking that the# certicate has the correct key usage set.# This is an important precaution to protect against# a potential attack discussed here:# http://openvpn.net/howto.html#mitm## To use this feature, you will need to generate# your server certificates with the keyUsage set to# digitalSignature, keyEncipherment# and the extendedKeyUsage to# serverAuth# EasyRSA can do this for you.remote-cert-tls server# If a tls-auth key is used on the server# then every client must also have the key.tls-auth ta.key 1key-direction 1# Select a cryptographic cipher.# If the cipher option is used on the server# then you must also specify it here.;cipher xcipher AES-256-CBCauth SHA256# Enable compression on the VPN link.# Don't enable this unless it is also# enabled in the server config file.comp-lzo# Set log file verbosity.verb 3# Silence repeating messages;mute 20
用到的链接:
https://james-yip.github.io/2017/11/23/construct-VPN/
https://www.dazhuanlan.com/wuxinxiangshan/topics/1100854
https://cloud.tencent.com/developer/article/1840491