OpenVPN 简介:

openvpn的作用google之。openvpn有两种模式:一种是网桥模式,一种是路由模式,以前本人就是搞不清这两种模式的具体区别。

在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。

操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。

openVPN 提供两种类型的虚拟网络接口:TUN和TAP,tun用于建立IP隧道,tap用于建立以太网桥,这两种模式我们也称为路由模式和网桥模式。 TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。

桥接是在一个子网上面创建一个虚拟的,广域的以太网技术,他相当于连通不同局域网之间的桥梁,桥接的优点是广播可以穿透vpn,允许依赖局域网广播的软件运行,桥接无需配置路由,可以和以太网上的任何协议工作,但是桥接的效率比路由模式要低,而且不容易扩展,使用桥接方式连接远端网络时,客户端被分配一个远端物理以太网的IP地址,从而能够和远端子网的其他机器进行通信,就像是连接在本地一样,

路由的优点是效率高可扩展,可以更好的调节MTU,路由模式的缺点是广播不能穿越vpn,仅支持ipv4,如果使用桥接模式,C/S两端都必须是tap,如果使用路由模式,C/S两端可以是tun也可以是tap,但是两端必须一致。

以下版本及以后的内核都已经默认支持tun/tap:

Linux kernels 2.2.x, 2.4.x 
FreeBSD 3.x, 4.x, 5.x
Solaris 2.6, 7.0, 8.0

搭建 OpenVPN:

下面开始搭建openvpn,基于debian系统

打开路由转发

echo 1 > /proc/sys/net/ipv4/ip_forward

安装openvpn :服务端

apt-get install openvpn

查看openvpn包都安装了哪些文件

dpkg -L openvpn

把配置文件复制到/etc/openvpn目录下

cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
gzip –d server.conf.gz
cp –a /usr/share/doc/openvpn/examples/easy-rsa/ .

修改基本配置文件

vi /etc/openvpn/easy-rsa/2.0/vars

#让key生成到/etc/openvpn/keys目录下
export KEY_DIR="/etc/openvpn/keys"

#定义所在的国家
export KEY_COUNTRY="CN"

#定义所在的省份
export KEY_PROVINCE="SH"

#定义所在的城市
export KEY_CITY="ShangHai"

#定义所在的组织
export KEY_ORG="H3C"

#定义你的电子邮件
export KEY_EMAIL="kefu@softool.cn"

在包中copy的配置文件中,没有export KEY_OU这个选项,可以添加到vars配置文件中:export KEY_OU=”H3C”

它定义你所在的单位。

使基本配置文件生效

#或者使用source vars 加载vars文件
. vars

加载完毕后会产生如下输出:

NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/keys

他表示当你运行./clean-all脚本时会删除/etc/openvpn/keys下的所有key文件

现在初始化keys目录,创建所需要的文件和目录,如果生成了第一个客户端证书文件,以后生成第二个客户端证书文件时这一步就不要执行了,否则他会清空所有的证书文件。

./clean-all

接下来开始产生root CA证书,用于签发server和client证书,如果没有需要修改的一路回车即可:

在/etc/openvpn/keys目录下可以看到产生了两个文件ca.crt ca.key

接着为服务器生成 Diffie-Hellman 文件:

在keys目录下可以看到一个dh1024.pem文件。

为服务器生成证书和密钥:

在./build-key-server server 中红色的server是生成CA证书的名字。

为客户端生成证书和密钥:

在./build-key client中,红色的client是生成的客户端的CA证书的名字,由于我们只有一个客户端所以叫client了,如果有多个客户端则可以以客户端的主机名做CA证书的名字,方便区分。

开始配置openvpn的配置文件:

vi /etc/openvpn/server.conf

#openvpn的默认监听端口
port 1194

#默认使用的协议
proto udp

#采用路由模式,不过使用的却是tap
dev tap

#验证客户端证书是否合法
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt

#server端使用的证书
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key  

#dh文件
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem

#设定server端虚拟出来的网段
server 10.8.9.0 255.255.255.0

#防止Openvpn 重启后忘记client端曾经使用过的IP地址
ifconfig-pool-persist ipp.txt

#给客户端push一条路由
push "route 192.168.250.0 255.255.255.0"

#客户端所在的子网网段
route 10.1.1.0 255.255.255.0

#Nat后面使用VPN,如果长时间不通信,NAT session 可能会失效,导致vpn连接丢失。#所有keepalive提供一个类似ping的机制,每10秒通过vpn的control通道ping对方,
#如果120秒无法ping通,则认为丢失,并重启vpn,重新连接。
keepalive 10 120

#可以让vpn的client之间互相访问,直接通过openvpn程序转发
client-to-client

#允许多个客户端使用同一个证书连接服务端
duplicate-cn

#对数据进行压缩,注意server和client 一致
comp-lzo

#通过keepalive检测超时后,重新启动vpn,不重新读取keys,保留第一次使用的keys
persist-key

#通过keepalive检测超时后,重新启动vpn,一直保持tun或tap设备是linkup的,否则网络连接会先linkdown然后linkup
persist-tun

#把openvpn的状态写入日志中
status openvpn-status.log

#openvpn的log
log   openvpn.log

#openvpn重启后会删除log内容,log-append则是追加log内容,并不删除。
log-append  openvpn.log

#日志记录级别
verb 5

注:
server 10.8.9.0 255.255.255.0 命令解释:这条命令的结果相当于一系列命令的集合,server用在路由模式下
如果是tap则相当于:
ifconfig 10.8.9.1 255.255.255.0 设置服务端的tap地址为10.8.9.1
ifconfig-pool 10.8.9.2 10.8.9.254 255.255.255.0 客户端使用的地址池
push “route-gateway 10.8.9.1”

OpenVPN 客户端安装:

安装步骤和安装服务端一样,不用生成CA文件,把服务端/etc/openvpn/keys目录下的ca.crt,client.*拷贝到客户端的/etc/openvpn/keys目录下。

cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .

配置openvpn客户端

vi /etc/openvpn/client.conf

#指定openvpn为客户端
client
dev tap
proto udp

#openvpn服务端的IP地址和端口,如果有多台服务端做负载均衡,则可以出现多个#remote
remote 10.1.1.174 1194

#始终重新解析Server的IP地址,如果remote后面跟的是域名,保证Server IP地址是动#态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址,这#样无需人为重新启动,即可重新接入VPN
resolv-retry infinite

#在本机不绑定任何端口监听进入的数据
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
verb 3

来源:https://my.oschina.net/guol/blog/39924