OpenVPN 101
OpenVPN简介
VPN功能简介
任何VPN都具备的几个功能:
- 虚拟网络,即tunnel: 把位于不同地理位置,不同网段的网络打通
- 安全: VPN最常见的使用场景是通过Internet接入, 所以必须得提供安全机制来保证数据包在Internet上传输的安全
- Packet Encryption
- Packet Authentication
- User Authentication
- Peer Authentication
OpenVPN也不例外. 只不过OpenVPN是一个轻量级的所谓的SSL VPN的实现,它是基于网络模型,层2/3的.
相比与IPSec它的主要优势在于:
- 简单易用,易维护
- 可移植性强(多种操作系统的支持,甚至可以嵌入到路由器里)
- 开销小
- 灵活,易扩展(plugin/cmd机制)
- 加密复用了OpenSSL(mbedTLS): OpenSSL支持啥加密算法OpenVPN就支持. (PS: 不支持我朝的 国密)
基础功能
Tunneling
- 安全通道接入控制:
- 静态预共享密钥机制(不推荐用于multi clients/server模式)
- 动态密钥机制:
- Data Channel的密钥协商
- 密钥rotation机制
- HMAC firewall(
-tls-auth
) - 用户身份认证
- 外接AD/LDAP
- 可扩展plugin外接其他身份体系
- peer authentication(PKI机制)
- 客户端/服务端双向证书校验
- 安全数据传输通道:
- 路由机制(
route -n
)
- 路由机制(
- DNS: tunnel可以使用内网的DNS服务
Security Overview
全部复用OpenSSL/mbedTLS的API:
- 数据包的Encryption/Decryption
- 数据包的Authentication(HMAC)
- 高版本通过ncp升级为AEAD模式,见man帮助的–ncp-ciphers
- 防重放攻击, buffer overflow攻击等
Compress
--compress
:- lzo
- on
- off
- adaptive
- lz4
- lzo
Client
- OpenVPN 3 library
- C++, 供Android,iPhone,Mac,Linux等通用
- Per-App VPN Service
- Android: 调用系统的VPNService, 类似ss client的实现方式
- IOS: 貌似是和MDM配合使用的?tbd
技术原理
从技术上简单来讲, OpenVPN就是 tun/tap, OpenSSL(mbedTLS,以前叫PolarSSL), TLS,PKI,路由技术的合体.
- tun/tap, 路由: 负责打通 vpn tunnel
- OpenSSL: 数据包的加密/解密(Encryption), 数据包的Authention(HMAC)
- TLS: 握手密钥协商
- PKI: 证书校验
从网络传输层来讲,OpenVPN可以:
- 以UDP作为上层传输协议(推荐)
- OpenVPN实现了所谓的reliable层,从而保证TLS协议能够运行在UDP之上(其实现在的DTLS可以做到这个,只不过DTLS诞生的较晚)
- reliable层: 通过简单的sliding window机制来实现
- OpenVPN实现了所谓的reliable层,从而保证TLS协议能够运行在UDP之上(其实现在的DTLS可以做到这个,只不过DTLS诞生的较晚)
- 以TCP作为上层传输协议(不推荐)
- Why TCP Over TCP Is A Bad Idea
- Senlime的NOC其实是基于Quic协议的: similar to TCP+TLS+HTTP/2 implemented on UDP
从 网络协议 上讲,多路复用了两个Channel, 即:
- Control Channel:
- Client -> Server 建立连接, 握手,协商Data Channel的密钥(加密密钥以及HMAC密钥), 其他控制指令
- Data Channel:
多路复用模块: 两个死循环,一个用来监听各种signal,一个用来监听socket event, 区分出是Control Channel或Data Channel的事件,分发进行后续处理
从网络包交互流程上讲,How is a tun interface used to build a VPN?
- Suppose I have a tun interface on machine A, and another on machine B
- I write a simple network application with two threads
- Copy bits from tun device -> network socket.
- Copy bits from network socket -> tun device.
- If I run this app on machine A and B I will have constructed a very simple VPN minus the security component.
从模块上讲,主要包括,
常见使用场景
- P2P: 异地的LAN网段打通
- 多客户端/单服务端模式:
- 配合我司的其他产品线,作为除SAG外,内网接入的另外一个项目实施方案
常见网络拓扑:
- host-host
- host-network
- network-network
如何测试
可以把OpenVPN当成一个路由器来测,测试需要从如下两个维度来考虑不同的Metrics. 注意:测试的重心是tunnel, 即网络层,不需要关心一些次要模块, 比如用户身份认证,连接接入流程等
- 移动端的测试:
- 耗电量
- 维持heartbeat的额外流量开销
- 网络切换,弱网状态, 掉线自动重连
- 服务端的测试:
建议阅读资料
man openvpn
或者openvpn --help
: man文档详细说明了OpenVPN的各种参数的用法,建议深入阅读- 配置模板: /usr/share/doc/openvpn-2.4.6/sample, 里面包含了几个常见使用场景对应的配置模板,防火墙配置脚本等
- RSA工具: easy-rsa
- The User-Space VPN and OpenVPN
- OpenVPN Community
- 搞定OpenVPN需要几方面的专家:
- 网络协议, 路由器工作原理
- 网络安全,密码学
- Linux内核
ToDos
- DTLS(Quic?)
- 事件驱动:单线程模型 -> 多线程模型
- OpenVPN 3 library:
- 在苹果手机上不能使用(需要自己创建tun/tap), 在苹果电脑上可以直接使用
- android没啥问题
- 两个平台的wrapping
Demo Labs
Written on May 30, 2018