什么是OPENVPN VPN直译就是虚拟专用通道是提供给企业之间或者个人与公司之间安全数据传输的隧道OpenVPN无疑是Linux下开源VPN的先锋提供了良好的性能和友好的用户GUI,使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库,目前OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Microsoft Windows以及Android和iOS上运行并包含了许多安全性的功能。它并不是一个基于Web的VPN软件也不与IPsec及其他VPN软件包兼容。
原理 openvpn技术核心是虚拟网卡然后是ssl协议实现。虚拟网卡使用网络底层编程实现的软件驱动。安装后在主机上多出一个网卡可以向其他网卡一样进行配置。服务程序可以在应用层打开虚拟网卡如果应用软件如IE向虚拟网卡发送数据则服务程序可以读取到该数据如果服务程序写合适的数据到虚拟网卡应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现这也是OpenVpn能够跨平台一个很重要的理由。
在OpenVpn中如果用户访问一个远程的虚拟地址属于虚拟网卡配用的地址系列区别于真实地址则操作系统会通过路由机制将数据包TUN模式或数据帧TAP模式发送到虚拟网卡上服务程序接收该数据并进行相应的处理后通过SOCKET从外网上发送出去远程服务程序通过SOCKET从外网上接收数据并进行相应的处理后发送给虚拟网卡则应用软件可以接收到完成了一个单向传输的过程反之亦然。
OPENVPN搭建 yum安装 1 yum install openvpn easy-rsa -y
配置服务器初始化 1 2 3 4 5 6 7 8 9 10 11 12 # 注openvpn-2.4.3这个目录是以当前openvpn版本命名的 cp /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf /etc/openvpn/ cp -r /usr/share/easy-rsa/2.0/* /etc/openvpn/ # 修改vars文件中的 变量作为服务端ca证书的缺省配置 # export KEY_COUNTRY="CN" # export KEY_PROVINCE="BJ" # export KEY_CITY="Beijing" # export KEY_ORG="IT" # export KEY_EMAIL="admin@admin.com" vi vars # 修改vars权限为可执行 chmod +x vars
证书配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 清空已有证书 ./clean-all # 生成服务端证书 # 下面这个命令在第一次安装时可以运行以后在添加完客户端后慎用因为这个命令会清除所有已经生成的证书密钥和上面的提示对应 # 由于之前做过缺省配置vars一路确认即可 ./build-ca # 生成服务端秘钥证书,名字可以随便起但是后面会用到 ./build-key-server server # 生成diffie hellman参数用于增强openvpn安全性,生成需要漫长等待 ./build-dh # 生成客户端 # 名字任意建议写成你要发给的人的姓名方便管理这里与生成服务端证书配置类似中间一步提示输入服务端密码也可以不设置密码其他按照缺省提示一路回车即可 ./build-key client
服务器端配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 cat /etc/openvpn/server.conf port 11940 proto tcp dev tun ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh2048.pem server 10.18.18.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log log /var/log/openvpn/openvpn.log log-append /var/log/openvpn/openvpn.log push "route 172.16.10.0 255.255.255.0" mode server client-to-client verb 3 duplicate-cn
配置项说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 ;local a.b.c.d //设置监听IP默认是监听所有IP port 11940 //设置监听端口必须要对应的在防火墙里面打开 proto tcp //设置用TCP还是UDP协议 dev tun // 设置创建tun的路由IP通道还是创建tap的以太网通道由于路由IP容易控制所以推荐使用tunnel // certificate(cert), and private key (key)// ca文件是服务端和客户端都必须使用的但不需要ca.key// 服务端和客户端指定各自的.crt和.key// 请注意路径,可以使用以配置文件开始为根的相对路径,// 也可以使用绝对路径// 请小心存放.key密钥文件 ca keys/ca.crt cert keys/server.crt key keys/server.key // 指定Diffie hellman parameters.默认是2048如果生成ca的时候修改过dh参数“export KEY_SIZE”则改为对应的数字 dh keys/dh2048.pem // 配置VPN使用的网段OpenVPN会自动提供基于该网段的DHCP服务但不能和任何一方的局域网段重复保证唯一server 10.18.18.0 255.255.255.0 // 维持一个客户端和virtual IP的对应表以方便客户端重新连接可以获得同样的IP ifconfig-pool-persist ipp.txt // 设置服务端检测的间隔和超时时间 每 10 秒 ping 一次如果 120 秒没有回应则认为对方已经 down keepalive 10 120 // 使用lzo压缩的通讯,服务端和客户端都必须配置 comp-lzo // 重启时仍保留一些状态 persist-keypersist-tun // 输出短日志,每分钟刷新一次,以显示当前的客户端 status openvpn-status.log // 缺省日志会记录在系统日志中但也可以导向到其他地方/ / 建议调试的使用先不要设置,调试完成后再定义 log /var/log/openvpn/openvpn.log log-append /var/log/openvpn/openvpn.log // 这里主要填写openvpn所在局域网的网段我的openvpn所在的局域网是172.16.10.0 push "route 172.16.10.0 255.255.255.0" // 默认客户端之间是不能直接通讯的除非把下面的语句注释掉 client-to-client //持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源//指定日志文件的记录详细级别可选0-9等级越高日志内容越详细 verb 3 // 常用于测试开启的话一个证书可以多个客户端连接 duplicate-cn
创建日志目录
1 mkdir -p /var/log/openvpn/
启动OPENVPN服务 1 systemctl start openvpn@server.service
设置开机启动 1 systemctl enable openvpn@server.service
开启路由转发功能 1 2 3 vim /etc/sysctl.conf # 找到net.ipv4.ip_forward = 0 把0改成1 sysctl -p
iptables设置
这一条至关重要通过配置nat将vpn网段IP转发到server内网,10.18.18.0/24是vpn网段
1 2 3 4 5 # 智能选择 iptables -t nat -A POSTROUTING -s 10.18.18.0/24 -j MASQUERADE iptables -A INPUT -p TCP --dport 11940 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT service iptables save
客户端使用 将服务器端生成的key
ca.crt
client.crt
client.key
下载到本地
复制OpenVPN目录将sample-config下的client.ovpn下载到本地
将client.ovpn配置文件做相应的修改
1 2 3 4 5 6 7 8 9 client dev tun proto tcp remote 1.2.3.5 11940 ca ca.crtcert client.crt key client.key comp-lzo verb 3
客户端可安装Tunnelblick进行连接。
OPENVPN用户管理 证书有效期管理 默认的OpenVPN配置,客户端证书有效期是10年。如何自定义客户端证书的时间呢?其实比较简单,编辑vars文件,找到export KEY_EXPIRE=3650这一行,把默认的3650,改为你想设置的天数即可。编辑后保存,运行一次vars,设置好环境变量,再用build-key生成客户端证书,即可。这样一来,客户端证书的有效期,就是你所设置的有效期了。
客户端证书的吊销 和PPTP VPN不一样,PPTP VPN直接删除客户端帐号,就可以了。在OpenVPN中,是通过revoke操作,吊销客户端证书,来实现禁止客户端连接OpenVPN的。 具体的方法如下:
1 2 3 4 5 6 #进入OpenVPN配置文件所在目录 #执行vars,初始化环境 . vars #使用revoke-full命令,吊销客户端证书 ./revoke-full clientName #clientName是被吊销的客户端证书名称
命令执行后,我们能在keys目录中找到一个文件,名叫:crl.pem ,这个文件中包含了吊销证书的名单。然后,在服务端配置文件中,加入如下一行:
最后一步,重启OpenVPN服务,即可