对于提供服务的程序,一般而言喜欢使用0.0.0.0这个地址,但是如果这个服务是UDP的,那么就有可能出现一些问题,比如如果某块网卡配置了多个IP地址,那么问题就可能重现。最近使用OpenVPN的时候就遇到了这样的问题。OpenVPN建议使用UDP协议,然而正是由于使用了UDP协议才出现了问题。以下几个要点帮助解决这样的问题,记之备忘:
OpenVPN碰到Windows一些问题的解决
基本描述
tap-win32虚拟网卡
tap-win32虚拟网卡并不包含任何实际硬件,仅仅是一个驱动,该驱动中包含了一个DHCP服务器程序,可以回复DHCP协议的offer/ack/nak数据包。该驱动的DHCP服务器的参数是可配置的。 tap-win32驱动分为三大部分,首先它作为一个网卡驱动和NDIS中间驱动接口并且设置了一些回调函数,第二部分是一个DHCP服务器,但是这个DHCP的功能是简化的,这部分不和 NDIS接口。二者的关系在NDIS的网卡发送数据的回调函数中体现,网卡发送数据的回调函数中将特殊处理DHCP数据包,然后直接回复。第三部分,tap-win32实现了一个可以读/写/控制的文件,导出给用户态程序比如OpenVPN作为接口。
MacOS上安装OpenVPN
这完全是一次需求驱动的行为,而不是工作驱动或者兴趣驱动的行为。我准备完全放弃我那牛慢的台式机,完全使用MacBook,而且绝不安装Windows虚拟机。因此所有 Windows上有的软件在Mac上都要能找到对应物,当然也包括OpenVPN,因为我需要使用OpenVPN连入公司。
OpenVPN211在windows上的编译
总述:
- 对于openvpn-2.1.0的编译,由于微软cl编译器和GNU的gcc行为不同,需要修改不多的几个源文件来适应微软的编译器
- 对于openvpn-2.1.1的编译,根目录下没有了Makefile.w32-vc,估计作者们觉得不应该修改源文件以适应编译器,也不能保证修改源文件这种事普通用户一定能用好,因此采用了一种别的编译方式,即使用MinGW和MSYS来支持编译,不过这些包都要下载,安装,这些也要消耗不小的工作量,但是一劳永逸
- 但是仍然能通过2.1.0的方式编译2.1.1,就是将Makefile.w32-vc复制过来,然后修改源文件
- OpenVPN依赖OpenSSL,lzo以及pkcs11-helper,因此在编译OpenVPN之前必须确保上述依赖库均存在,如果都已经存在了,那么直接跳到第五节开始编译OpenVPN;
- OpenVPN的2.1.0以及之前的版本和2.1.1版本在windows上的编译方式不同,但是基本原理都是一样的(编译+链接),因此不妨采用老版本的方式,手动拷贝makefile到新版本目录;
- 由于windows的C编译器和GNU的编译器行为有所不同,所以需要手工修改一些文件来适应windows的编译器,下面的编译均使用“Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86”编译器以及“Microsoft (R) Incremental Linker Version 8.00.50727.42”链接器,使用其它编译器的可能需要修改的文件以及怎样修改和此处不同甚至不用修改。
编译OpenSSL
(略)
OpenVP简易文档
OpenVPN简介
VPN 替代昂贵的专线用以在开放的 Internet 上实现了一个虚拟的网络,该虚拟网络本身在不安全的真实网络上对数据提供安全保护。
OpenVPN 实现了一个灵活的 VPN,和通过修改协议栈而实现的基于 IPSec 的 VPN 相比,OpenVPN 有以下的优点:
Linux平台VPN技术概论 续
虚拟专用网处理的任务只有两个:
1. 虚拟
2. 专用
其中虚拟是次要的,专用才是主要的,只要能实现专用,不虚拟也行。
“专用”这个概念有两个含义:
Linux平台VPN技术概论
第一部分 VPN要解决的问题以及方案
基于主机的第三层 VPN 的要旨就是“透明/安全的接入”,其中透明的含义就是配置要简单,尽量让用户感觉不到 VPN 的存在,因此这种 VPN 的实现其实只要解决两个问题即可:
VPN原理及实现之TCP还是UDP
有了 ip over ssl 的关键思想,OpenVPN 就是一个必然结果了,于是就不多说了,OpenVPN 和 OpenSSL 并不在一个层次上,虽然都很 open。OpenVPN 的配置非常复杂,主要就是为了建立更加合理的隧道,虽然 IPSec 实现的 VPN 不区分客户端和服务器,建立 sa 的时候全靠 dh 对称的协商加密密钥和算法,但是基于 OpenSSL 的 OpenVPN 却区分二者,因为 OpenVPN 的安全是 ssl 实现的,而 ssl 区分客户端和服务器,虚拟网卡已经说的很多了,现在说说隧道的一些细节,OpenVPN 可以建立 tcp 隧道和 udp 隧道,tcp 隧道顾名思义就是用 tcp 来封装 VPN 数据流,udp 亦然,但是虽然可以使用 udp 封装,在 OpenVPN 中你却不需要担心数据失序,因为 udp 之上还有 ssl ,而 ssl 不允许数据失序,确切的说不应说是 ssl,基于 udp 的 ssl 实际上是 tls,ssl 数据由于并不是流式的,而是基于记录的,每次必然读取一条记录,因此 ssl 是存储接收和存储发送的,如果下面用 udp 传输,那么就可能出现丢包或者失序的情况,如此一来读取的记录就会不正确,在 ssl 解密特别是 cbc 方式解密时就会出错,所以 ssl 下面必然是可靠而按序的,即使用 udp,那么在 ssl 和 udp 之间也必须实现可靠和按序。