1. OpenVPN工作原理
openvpn简介
VPN直译就是虚拟专用通道,vpn技术通过密钥交换、封装、认证、加密手段在公共网络上建立起私密的隧道,保障传输数据的完整性、私密性和有效性。OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。
工作原理
虚拟网卡在Linux2.4版本以上,操作系统开始支持一个名为tun的设备,tun设备的驱动程序中包含两个部分,一部分是字符设备驱动,一部分是网卡驱动。网卡驱动把从TCP/IP协议栈收到的数据包结构skb放于tun设备的读取队列,用户进程通过调用字符设备接口read获取完整的IP数据包,字符驱动read函数的功能是从设备的读取队列读取数据,将核心态的skb传递给用户;反过来字符驱动设备write函数给用户提供了把用户态的数据写入核心态的接口,write函数把用户数据写入核心空间并穿入TCP/IP协议栈。该设备既能以字符设备的方式被读写,作为系统的虚拟网卡,也具有和物理网卡相同的特点:能够配置IP地址和路由。对虚拟网卡的使用是OpenVPN实现其SSL VPN功能的关键。
地址池以及路由OpenVPN服务器一般需要配置一个虚拟IP地址池和一个自用的静态虚拟IP地址(静态地址和地址池必须在同一个子网中),然后为每一个成功建立SSL连接的客户端动态分配一个虚拟IP地址池中未分配的地址。这样,物理网络中的客户端和OpenVPN服务器就连接成一个虚拟网络上的星型结构局域网,OpenVPN服务器成为每个客户端在虚拟网络上的网关。OpenVPN服务器同时提供对虚拟网卡的路由管理。当客户端对OpenVPN服务器后端的应用服务器任何访问时,数据包都会经过路由流经虚拟网卡,OpenVPN程序在虚拟网卡上获取数据IP报文,然后使用SSL协议将这些IP报文封装起来,再经过物理网卡发送出去。OpenVPN的服务器和客户端在虚拟网卡之上建立起来一个虚拟的局域网网络,这个虚拟的局域网络对系统的用户来说是透明的。
客户端与服务端安全连接的建立OpenVPN的服务器和客户端支持tcp和udp两种连接方式,只需要在服务端和客户端预先定义好使用的连接方式(tcp或udp)和端口号,客户端和服务端在这个连接的基础上进行SSL握手。连接包括SSL的握手以及虚拟网络上的管理信息,OpenVPN将虚拟网上的网段、地址、路由发送给客户端。连接成功后,客户端和服务端建立起SSL安全连接,客户端和服务端的数据都流入虚拟网卡做SSL的处理,再在tcp或udp的连接上从物理网卡发送出去。
数据发送流程
应用层的外出数据,经过系统调用接口传入核心TCP/IP层做处理,在TCP/IP经过路由到虚拟网卡,虚拟网卡的网卡驱动发送处理程序hard_start_xmit()将数据包加入skb表并完成数据包从核心区到用户区的复制,OpenVPN调用虚拟网卡的字符处理程序tun_read(),读取到设备上的数据包,对读取的数据包使用SSL协议做封装处理后,通过socket系统调用发送出去。
数据接收流程
物理网卡接收数据包,经过核心的TCP/IP上传到OpenVPN,OpenVPN通过link_socket_read()接收数据包,使用SSL协议进行解包处理,经过处理的数据包OpenVPN调用虚拟网卡的字符处理程序tun_write()写入虚拟网卡的字符设备,设备驱动程序完成数据从用户区到核心区的复制,并将数据写入skb链表,然后调用网卡netif_rx()接收程序,数据包再次进入系统TCP/IP协议栈,传到上层应用程序。
数据流图如下:
2. openvpn交叉编译
安装包
openssl: https://pan.baidu.com/s/1KXfiLUh8cNjZN40spI-gOQ (版本:1.0.1e)
lzo: https://pan.baidu.com/s/16JbScqDusAFXKEzbTvs1jQ (版本:2.06)
openvpn: https://pan.baidu.com/s/1TKnMlBqd-720mz4OtEXl-A (版本:2.2.2)
openssl编译
./config no-asm shared --prefix=/home/WORK/DSPG/yizhi/openvpn/opensslout
make
make install
lzo编译
./configure --prefix=/home/WORK/DSPG/yizhi/openvpn/lzoout --host=arm-linux --enable-shared
make
make install
openvpn编译
./configure --prefix=/home/WORK/DSPG/yizhi/openvpn/openvpnout --host=arm-linux --enable-password-save --with-ssl-headers=/home/WORK/DSPG/yizhi/openvpn/opensslout/include --with-ssl-lib=/home/WORK/DSPG/yizhi/openvpn/opensslout/lib --with-lzo-headers=/home/WORK/DSPG/yizhi/openvpn/lzoout/include --with-lzo-lib=/home/WORK/DSPG/yizhi/openvpn/lzoout/lib --with-ifconfig-path=/sbin/ifconfig --with-route-path=/sbin/route
make
make install
编译完成后,在生成的openvpnout/sbin文件夹中包含我们所需要的openvpn程序
3. openvpn使用
服务器搭建
openvpn的服务器既可以搭建在windows上也可以搭建在linux上,搭建参考:
https://linux.cn/article-3706-1.html
开发板openvpn使用
1. 将上述编译好的openvpn程序复制到开发板
2. 准备好认证所需的证书和客户端配置文件
3. 启动openvpn
./openvpn --config crt/vpn.cnf --log /tmp/openvpn.log --writepid /var/run/openvpn.pid &
连接成功,成功从openvpnserver获取到ip