open0pn的一次踩坑
open0pn的一些介绍
open0pn的原理
Open0pn的技术核心是虚拟网卡,其次是SSL协议实现:
虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装后在主机上多出现一个网卡,可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件(如IE)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现,这也是Open0pn能够跨平台一个很重要的理由。
在Open0pn中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配用的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,通过SOCKET从外网上发送出去,远程服务程序通过SOCKET从外网上接收数据,并进行相应的处理后,发送给虚拟网卡,则应用软件可以接收到,完成了一个单向传输的过程,反之亦然。
open0pn的优缺点
优点:成本低,是一个廉价有效的构建私有网络的方式,用它可以替代昂贵的实体专线;灵活,比实体专线更灵活。例如,一个公司可以在0pn站点的数量调整,根据不断变化的需求。
缺点:搭建不容易,对技术要求非常高,需要对网络和安全问题有高水平的理解以及认真地规划和配置。由于在互联网上缺乏质量服务(QoS)管理,可能会导致数据包丢失和其他性能问题。若公共网络条件发生问题,则私网的管理员不能控制。出于这个原因,许多大公司一般购买使用可信0pn使用专用网络,以保证服务质量。
0pn的作用
- 访问外网
- 提升网速(案例网游加速)
0pn的分类
- PPTP
点对点隧道协议 (PPTP) 是由包括微软和3Com等公司组成的PPTP论坛开发的一种点对点隧道协,基于拨号使用的PPP协议使用PAP或CHAP之类的加密算法,或者使用Microsoft的点对点加密算法MPPE。其通过跨越基于 TCP/IP 的数据网络创建0pn实现了从远程客户端到专用企业服务器之间数据的安全传输。PPTP 支持通过公共网络(例如 Internet)建立按需的、多协议的、虚拟专用网络。PPTP 允许加密 IP 通讯,然后在要跨越公司 IP 网络或公共 IP 网络(如 Internet)发送的 IP 头中对其进行封装。 - L2TP
第 2 层隧道协议 (L2TP) 是IETF基于L2F (Cisco的第二层转发协议)开发的PPTP的后续版本。是一种工业标准 Internet 隧道协议,其可以为跨越面向数据包的媒体发送点到点协议 (PPP) 框架提供封装。PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加包头用于数据在互联网络上的传输。PPTP只能在两端点间建立单一隧道。 L2TP支持在两端点间使用多隧道,用户可以针对不同的服务质量创建不同的隧道。L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP 或PPTP与IPSEC共同使用时,可以由IPSEC提供隧道验证,不需要在第2层协议上验证隧道使用L2TP。 PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接,L2TP可以在IP(使用UDP),桢中继永久虚拟电路 (PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。 - IPSec
IPSec 的隧道是封装、路由与解封装的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部。该新的数据包可能会有新的寻址与路由信息,从而使其能够通过网络传输。隧道与数据保密性结合使用时,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目标)。封装的数据包到达目的地后,会删除封装,原始数据包头用于将数据包路由到最终目的地。 - SSL0pn
SSL协议提供了数据私密性、端点验证、信息完整性等特性。SSL协议由许多子协议组成,其中两个主要的子协议是握手协议和记录协议。握手协议允许服务器 和客户端在应用协议传输第一个数据字节以前,彼此确认,协商一种加密算法和密码钥匙。在数据传输期间,记录协议利用握手协议生成的密钥加密和解密后来交换 的数据。
open0pn的部署
1.关闭selinux
setenforce 0
2.安装编译环境
yum -y install gcc gcc-c++ makeyum -y install pam-devel.x86_64
3.配置0pn时间同步服务器
- 安装ntpdate
yum -y install ntp ntpdate
- 设置时间同步
ntpdate cn.pool.ntp.org
- 设置定时任务同步时间
crontab -e00 12 * * * /usr/sbin/ntpdate cn.pool.ntp.org#亲测由于时间问题导致连接失败
4.安装lzo压缩模块
#准备包wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz#解压安装tar xf lzo-2.10.tar.gzcd lzo-2.10.tar.gz./configuremake && make install
5.安装open0pn 软件
#安装sslyum -y install openssl*#源码包wget https://swupdate.open***.org/community/releases/open***-2.4.6.tar.gz#解压安装tar xf open***-2.4.6.tar.gzcd open***-2.4.6./configure --prefix=/usr/local/open*** --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/libmake && make install
- 检查版本
#把包里的脚本做软链接ln -sv /home/open***-2.4.6/src/open***/open***/usr/bin/open***open*** --version
7.配置CA证书#下载easy-rsawget http://build.open***.net/downloads/releases/easy-rsa-2.2.0_master.tar.gztar xf easy-rsa-2.2.0_master.tar.gzcd easy-rsa-2.2.0_master./configuremake && make install#放置/etc/open0pnmkdir /etc/open***cp -rf /home/easy-rsa /etc/open***/#配置varsvi /etc/open***/easy-rsa/vars
cd /etc/open***/easy-rsasource vars //执行脚本生成证书时,需要设置一些环境变量 #生成根证书-CA证书,CA证书同时需要部署在服务器和客户端上./build-ca #一路回车#查看ca[root@aliyun ~]# ll /etc/open***/keys/ca*-rw-r--r-- 1 root root 1643 Dec 12 11:05 /etc/open***/keys/ca.crt-rw------- 1 root root 1704 Dec 12 11:05 /etc/open***/keys/ca.key
介绍一下easy-rsa的的工具功能
[root@aliyun easy-rsa]# ll
build-ca #生成CA证书
build-dh #生成密码协议交换文件
build-key #生成免密码客户端密钥对
build-key-pass #生成带密码客户端密钥对
build-key-server #生成服务端密钥对
clean-all #初始化配置,清空所有keys
pkitool #各证书生成主要调用此命令执行
revoke-full #证书吊销
vars #预定义的证书基本信息
8.生成server证书和密钥key
./build-key-server jhrdc
[root@aliyun ~]# ll /etc/open***/easy-rsa/keys/jhrdc.*#查看证书-rw-r--r-- 1 root root 5340 Dec 12 11:08 /etc/open***/easy-rsa/keys/jhrdc.crt #服务端证书-rw-r--r-- 1 root root 1115 Dec 12 11:08 /etc/open***/easy-rsa/keys/jhrdc.csr #服务端证书请求文件-rw------- 1 root root 1708 Dec 12 11:08 /etc/open***/easy-rsa/keys/jhrdc.key #服务端私钥
8.生成客户端证书和密钥,若要生成多个证书,重复步骤即可(一个证书仅限一人使用)
./build-key test#和之前server一样一路回车即可
9.生成需要密码验证的客户端密钥ett
./build-key-pass ettGenerating a 2024 bit RSA private key.........................+++...........................................................+++writing new private key to 'ett.key'Enter PEM pass phrase: #此处需要输入用户密码 (***拨号的密码)Verifying - Enter PEM pass phrase: #确认密码-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [cn]:State or Province Name (full name) [BJ]:Locality Name (eg, city) [Beijing]:Organization Name (eg, company) [oldboy]:Organizational Unit Name (eg, section) [oldboy]:Common Name (eg, your name or your server's hostname) [ett]:Name [oldboy]:Email Address [mail@host.domain]:Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:123456An optional company name []:oldboyUsing configuration from /etc/open***/easy-rsa/openssl-1.0.0.cnfCheck that the request matches the signatureSignature okThe Subject's Distinguished Name is as followscountryName :PRINTABLE:'cn'stateOrProvinceName :PRINTABLE:'BJ'localityName :PRINTABLE:'Beijing'organizationName :PRINTABLE:'oldboy'organizationalUnitName:PRINTABLE:'oldboy'commonName :PRINTABLE:'ett'name :PRINTABLE:'oldboy'emailAddress :IA5STRING:'mail@host.domain'Certificate is to be certified until Oct 23 08:45:44 2028 GMT (3650 days)Sign the certificate? [y/n]:y1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated#查看证书[root@aliyun ~]# ll /etc/open***/easy-rsa/keys/ett*-rw-r--r-- 1 root root 5217 Dec 12 11:12 /etc/open***/easy-rsa/keys/ett.crt-rw-r--r-- 1 root root 1110 Dec 12 11:12 /etc/open***/easy-rsa/keys/ett.csr-rw------- 1 root root 1834 Dec 12 11:12 /etc/open***/easy-rsa/keys/ett.key
10.生成密钥协议交换文件
./build-dh #视网络环境,等待即可
11.防止恶意连接(如DOS、UDP port flooding),生成一个"HMAC firewalls"
open*** --genkey --secret keys/ta.key[root@aliyun ~]# ll /etc/open***/easy-rsa/keys/ta*-rw------- 1 root root 636 Dec 12 11:20 /etc/open***/easy-rsa/keys/ta.key#复制证书cp -ap keys /etc/open***/将服务端配置文件拷贝到/etc/open***/目录[root@aliyun ~]# cp open***-2.4.6/sample/sample-config-files/{client,server}.conf /etc/open***/[root@aliyun open***] lsclient.conf easy-rsa keys server.conf
12.备份配置文件
cp client.conf client.conf.bakcp server.conf server.conf.bak#server配置[root@aliyun ~]# grep -vE ";|#|^$" /etc/open***/server.confport 52115proto tcp #指定监听的协议,当并发访问多时,推荐tcpdev tun #*** server的模式采用路由模式。可选tap或tunca /etc/open***/keys/ca.crt #写绝对路径cert /etc/open***/keys/jhrdc.crtdh /etc/open***/keys/dh3048.pemserver 10.8.0.0 255.255.255.0ifconfig-pool-persist ipp.txtpush "route 172.18.249.0 255.255.240.0" #加一条路由client-to-client #允许拨号的多个client互相通信duplicate-cn #允许多个客户端使用一个账号连接keepalive 10 120cipher AES-256-CBCpersist-key # 当超时后,当重新启动后,保持上一次使用的私钥,而不重新读取私钥persist-tunstatus open***-status.loglog /var/log/open***.logverb 3#
13.调试服务启动
#开启路由转发功能sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#' /etc/sysctl.conf#开启服务/usr/local/sbin/open*** --config /etc/open***/server.conf 检查***服务端口:netstat -lntup | grep ***#加入开机启动echo "#startup open***" >>/etc/rc.localecho "/usr/local/sbin/open*** --config /etc/open***/server.conf &" >>/etc/rc.local
14.window客户端配置
下载客户端 https://swupdate.open***.org/community/releases/open***-install-2.4.1-I601.exe
配置客户端证书
将ca.crt test.crt test.key 下载,
配置文件如下:
clientdev tunproto tcpremote IP 52115resolv-retry infinitenobindpersist-keypersist-tunca D:\\Open***\\config\\test\\ca.crt #注意window的文件格式呵Linux不一样cert D:\\Open***\\config\\test\\test.crtkey D:\\Open***\\config\\test\\test.keyns-cert-type servercomp-lzoverb 3log D:\\Open***\\config\\test\\open***.log
导入配置点击登录,如下成功
参考https://idc.wanyunshuju.com/***/915.html