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

  1. 安全通道接入控制:
    • 静态预共享密钥机制(不推荐用于multi clients/server模式)
    • 动态密钥机制:
      • Data Channel的密钥协商
      • 密钥rotation机制
    • HMAC firewall(-tls-auth)
    • 用户身份认证
      • 外接AD/LDAP
      • 可扩展plugin外接其他身份体系
    • peer authentication(PKI机制)
      • 客户端/服务端双向证书校验
  2. 安全数据传输通道:
    • 路由机制(route -n)
  3. DNS: tunnel可以使用内网的DNS服务

Security Overview

全部复用OpenSSL/mbedTLS的API:

  1. 数据包的Encryption/Decryption
  2. 数据包的Authentication(HMAC)
    • 高版本通过ncp升级为AEAD模式,见man帮助的–ncp-ciphers
    • Encryption then Authentication
  3. 防重放攻击, buffer overflow攻击等

Compress

  1. --compress:
    • lzo
      • on
      • off
      • adaptive
    • lz4

Client

  1. OpenVPN 3 library
    • C++, 供Android,iPhone,Mac,Linux等通用
  2. 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机制来实现
  • 以TCP作为上层传输协议(不推荐)

网络协议 上讲,多路复用了两个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?

  1. Suppose I have a tun interface on machine A, and another on machine B
  2. I write a simple network application with two threads
  3. Copy bits from tun device -> network socket.
  4. Copy bits from network socket -> tun device.
  5. If I run this app on machine A and B I will have constructed a very simple VPN minus the security component.

从模块上讲,主要包括, OpenVpn modules

常见使用场景

  1. P2P: 异地的LAN网段打通
  2. 多客户端/单服务端模式:
    • 配合我司的其他产品线,作为除SAG外,内网接入的另外一个项目实施方案

常见网络拓扑:

  • host-host
  • host-network
  • network-network

如何测试

可以把OpenVPN当成一个路由器来测,测试需要从如下两个维度来考虑不同的Metrics. 注意:测试的重心是tunnel, 即网络层,不需要关心一些次要模块, 比如用户身份认证,连接接入流程等

  1. 移动端的测试:
    • 耗电量
    • 维持heartbeat的额外流量开销
    • 网络切换,弱网状态, 掉线自动重连
  2. 服务端的测试:

参见测试方法和测试工具

建议阅读资料

  1. man openvpn 或者 openvpn --help: man文档详细说明了OpenVPN的各种参数的用法,建议深入阅读
  2. 配置模板: /usr/share/doc/openvpn-2.4.6/sample, 里面包含了几个常见使用场景对应的配置模板,防火墙配置脚本等
  3. RSA工具: easy-rsa
  4. The User-Space VPN and OpenVPN
  5. OpenVPN Community
  6. 搞定OpenVPN需要几方面的专家:
    • 网络协议, 路由器工作原理
    • 网络安全,密码学
    • Linux内核

ToDos

  1. DTLS(Quic?)
  2. 事件驱动:单线程模型 -> 多线程模型
  3. OpenVPN 3 library:
    • 在苹果手机上不能使用(需要自己创建tun/tap), 在苹果电脑上可以直接使用
    • android没啥问题
    • 两个平台的wrapping

Demo Labs

Tags:vpn   Tags:openvpn
Written on May 30, 2018