openvpn VPN, Virtual Private Network, 虚拟专用网络 OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现, 最早由James Yonan编写
OpenVpn的技术核心是虚拟网卡,其次是SSL协议实现
虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装后在主机上多出现一个网卡,可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件 (如IE) 向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现,这也是OpenVpn能够跨平台一个很重要的理由.
在OpenVpn中,如果用户访问一个远程的虚拟地址 (属于虚拟网卡配用的地址系列,区别于真实地址) ,则操作系统会通过路由机制将数据包 (TUN模式) 或数据帧 (TAP模式) 发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,通过SOCKET从外网上发送出去,远程服务程序通过SOCKET从外网上接收数据,并进行相应的处理后,发送给虚拟网卡,则应用软件可以接收到,完成了一个单向传输的过程,反之亦然。
加密 OpenVPN使用OpenSSL库加密数据与控制信息: 它使用了OpenSSL的加密以及验证功能,意味着,它能够使用任何OpenSSL支持的算法。它提供了可选的数据包 HMAC 功能以提高连接的安全性。此外,OpenSSL的硬件加速也能提高它的性能。[1]
验证
OpenVPN提供了多种身份验证方式,
用以确认参与连接双方的身份,包括: 预享私钥,第三方证书以及用户名/密码组合。预享密钥最为简单,但同时它只能用于建立点对点的VPN;基于PKI的第三方证书提供了最完善的功能,但是需要额外的精力去维护一个PKI证书体系。 OpenVPN2.0后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍有一份服务器证书需要被用作加密。
网络
OpenVPN所有的通信都基于一个单一的IP端口,默认且推荐使用UDP协议通讯,同时TCP也被支持。OpenVPN连接能通过大多数的代理服务器,并且能够在NAT的环境中很好地工作。服务端具有向客户端"推送"某些网络配置信息的功能,这些信息包括: IP地址、路由设置等。OpenVPN提供了两种虚拟网络接口: 通用Tun/Tap驱动,通过它们,可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网络数据。传送的数据可通过LZO算法压缩。IANA (Internet Assigned Numbers Authority) 指定给OpenVPN的官方端口为1194。OpenVPN 2.0以后版本每个进程可以同时管理数个并发的隧道。[1]
OpenVPN使用通用网络协议 (TCP与UDP) 的特点使它成为 IPsec 等协议的理想替代,尤其是在ISP (Internet service provider) 过滤某些特定VPN协议的情况下。[1]
在选择协议时候,需要注意2个加密隧道之间的网络状况,如有高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致要隧道上层的协议进行重传,效率非常低下。[1]
安全
OpenVPN与生俱来便具备了许多安全特性: 它在用户空间运行,无须对内核及网络协议栈作修改;初始完毕后以chroot方式运行,放弃root权限;使用mlockall以防止敏感数据交换到磁盘。[1]
OpenVPN通过PKCS#11支持硬件加密标识,如智能卡。
install #install sudo pacman -S openvpn apt-get install openvpn server create keys pacman -S easy-rsa use Elliptic curve instead of RSA # append line to /etc/easy-rsa/vars set_var EASYRSA_ALGO ec set_var EASYRSA_CURVE secp521r1 set_var EASYRSA_DIGEST "sha512" set_var EASYRSA_NS_SUPPORT "yes" easy-rsa cd /etc/easy-rsa export EASYRSA=$(pwd) export EASYRSA_VARS_FILE=/etc/easy-rsa/vars easyrsa init-pki easyrsa build-ca # new ca certificate file: /etc/easy-rsa/pki/ca.crt scp /etc/easy-rsa/pki/ca.crt foo@hostname-of-openvpn-server:/tmp/ca.crt mv /tmp/ca.crt /etc/openvpn/server/ chown root:openvpn /etc/openvpn/server/ca.crt # install easy-rsa on openvpn server pacman -S easy-rsa easyrsa init-pki easyrsa gen-req pingd nopass cp /etc/easy-rsa/pki/private/pingd.key /etc/openvpn/server/ openvpn --genkey secret /etc/openvpn/server/ta.key # The server and client(s) certificates need to be signed by the CA then transferred back to the OpenVPN server/client(s). cp /etc/easy-rsa/pki/reqs/*.req /tmp scp /tmp/*.req foo@hostname-of-CA:/tmp # on ca server cd /etc/easy-rsa easyrsa import-req /tmp/servername.req servername easyrsa sign-req server servername scp /etc/easy-rsa/pki/issued/*.crt foo@hostname-of-openvpn_server:/tmp mv /tmp/servername.crt /etc/openvpn/server/ chown root:openvpn /etc/openvpn/server/servername.crt client pacman -S easy-rsa use Elliptic curve instead of RSA ... easy-rsa cd /etc/easy-rsa export EASYRSA=$(pwd) export EASYRSA_VARS_FILE=/etc/easy-rsa/vars easyrsa init-pki easyrsa gen-req client1 nopass # sign the certificates cp /etc/easy-rsa/pki/reqs/*.req /tmp # cd /etc/easy-rsa # easyrsa import-req /tmp/servername.req servername # easyrsa import-req /tmp/client1.req client1 # easyrsa sign-req server servername # easyrsa sign-req client client1 config “#”前缀是指定的注释标签。openvpn网站上的示例广泛使用’#‘注释。另外,分号 ‘;’ 用于注释掉单行或单项。
...