什么是openvpn?
OpenVPN是一个基于OpenSSL库的应用层VPN实现
openvpn可工作于两种模式:
tun 一种是IP遂道路由模式,主要应用于点对点
eth 一种是基于以太网的遂道桥模式, 应用于点对多点,有多个分支机构
openvpn提供两种安全模式:
Static Key
X509 PKI (Public Key Infrastructure)
1.基础环境安装:
os:CentOS release 6.4 2.6.32-358.el6.x86_64 yum install -y openssl openssl-devel lzo gcc gcc-c++
安装LZO 用于压缩通讯数据加快传输速度
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.09.tar.gz tar zxvf lzo-2.09.tar.gz cd lzo-2.09.tar.gz ./configure make && make install
TUN/TAP
OpenVpn要使用到TUN/TAP作为接口建立隧道,但需要内核支持。TUN 接口创建的是三层路由隧道,建立方便;
TAP 是二层网卡桥接隧道,即创建一个以太网桥接,相对复杂。
TUN 接口下所有的客户端处于一个完全独立的子网内,与 VPN 服务器所在的子网没有关系;
TAP 接口的好处相较之下则相当明显,客户端可以获得 VPN 服务器所处子网的 IP
(即,忽略物理上的区别,可以完全将客户端看做是于 VPN 服务器处于同一子网的另一台机器)
检查内核是否支持TUN/TAP设备驱动
# modinfo tun 如果有正常的输出,则支持
确定内核支持TUN/TAP模块之后,加载模块
# modinfo tun # 加载
# lsmod tun # 检查
# ls /dev/net/tun # 检查文件是否存在判断tun模块是否加载
2.安装openVPN
a) RPM安装epel源
rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm sed -i ‘s/^mirrorlist=https/mirrorlist=http/‘ /etc/yum.repos.d/epel.repo
b) 源码安装OpenVPN
下载 http://openvpn.net/
tar zxvf openvpn-2.1.3.tar.gz cd openvpn-2.1.3 ./configure make && make install
3.配置OpenVPN
a)初始化PKI 设置环境变量 # mkdir -pv /etc/openvpn # cp -r ../../openvpn-2.1.3/easy-rsa /etc/openvpn 修改证书变量 # cd /etc/openvpn/easy-rsa/2.0 # cat /etc/openvpn/easy-rsa/2.0 # 自定义修改如下内容 export KEY_COUNTRY="CN" # 国家 export KEY_PROVINCE="SH" # 省 export KEY_CITY="SH" # 市 export KEY_ORG="ZZT" # 公司 export KEY_OU="IT" # 部门 export KEY_EMAIL="[email protected]" # 邮箱 初始化环境变量 # source vars # ./clean-all # ./build-ca # 生成根证书ca.crt和根密钥ca.key(一路按回车即可),因为vars文件已经在上面自定义默认的变量值 # ./build-key-server server # 为服务端生成证书和密钥(一路按回车,直到提示需要输入y/n时,输入y再按回车,一共两次) 每一个登陆的VPN客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接,下面建立 # ./build-key client # 为客户端生成证书和密钥(一路按回车,直到提示需要输入y/n时,输入y再按回车,一共两次) # ./build-dh # 创建迪菲·赫尔曼密钥,会生成dh2048.pem文件(生成过程比较慢,在此期间不要去中断它) # openvpn --genkey --secret keys/ta.key # 生成ta.key文件(防DDos攻击、UDP淹没等恶意攻击)
4.创建服务器端配置文件
将需要用到的openvpn证书和密钥复制一份到刚创建好的keys目录中
mkdir -pv /etc/openvpn/keys cp /etc/openvpn/easy-rsa/2.0/keys/{ca.crt,server.{crt,key},dh1024.pem,ta.key} /etc/openvpn/keys/
复制一份服务器端配置文件模板server.conf到/etc/openvpn/
# cp ./../openvpn-2.1.3/sample-config-files/server.conf /etc/openvpn/ # cat /etc/openvpn/server.conf ;local a.b.c.d # 申明本机使用的IP地址,也可以不说明 port 1194 # 端口 proto tcp # 协议,默认使用udp,如果使用HTTP Proxy,必须使用tcp协议 dev tun # 申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议;tun是ip层的点对点协议,限制稍微多一些 ca keys/ca.crt # 全路径为/etc/openvpn/keys/ca.crt,用于验证客户是证书是否合法 cert keys/server.crt # 全路径为/etc/openvpn/keys/server.crt,Server使用的证书文件 key keys/server.key # 全路径为/etc/openvpn/keys/server.key,Server使用的证书对应的key,注意文件的权限,防止被盗 dh keys/dh1024.pem # 全路径为/etc/openvpn/keys/dh1024.pem server 10.8.0.0 255.255.255.0 # 地址池,配置VPN使用的网段,OpenVPN会自动提供基于该网段的DHCP服务,保证唯一,不要和实际的局域网冲突即可 ifconfig-pool-persist ipp.txt # 用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,防止openvpn重新启动后“忘记”Client曾经使用过的IP地址 ;client-config-dir /etc/openvpn/ccd # 定义每个客户端的个性化配置文件 # 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网 # (简而言之,就是设置允许客户端访问VPN服务器自身所在的其他局域网) push "route 10.2.8.0 255.255.255.0" # 可以设置多个服务端所在的其他局域网地址范围 push "route 192.168.0.0 255.255.255.0" ;push "dhcp-option DNS 10.8.0.1" # 用OpenVPN的DHCP功能为客户端提供指定的DNS、WINS等 ;route 10.9.0.0 255.255.255.252 # VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除 client-to-client # 可以让客户端之间相互访问直接通过openvpn程序转发,不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率 duplicate-cn # 如果客户端都使用相同的证书和密钥连接VPN,一定要打开这个选项,否则每个证书只允许一个人连接VPN keepalive 10 120 # 每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,认为连接丢失,并重新启动VPN,重新连接 tls-auth keys/ta.key 0 # 全路径为/etc/openvpn/keys/ta.key,注意server端后面的数字肯定使用0,client使用1 comp-lzo # 对数据进行压缩,注意Server和Client一致 user nobody #定义运行openvpn的用户 group nobody persist-key # 通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys persist-tun # 通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup status /var/log/openvpn-status.log # 定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作 log /var/log/vpn/openvpn.log # 记录日志,每次重新启动openvpn后删除原有的log信息 log-append /var/log/vpn/openvpn.log # 和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后 verb 3 # 相当于debug level,改成verb 5可以多查看一些调试信息 ;mute 20 # 重复信息的沉默度。相同类别的信息只有前20条会输出到日志文件中
5.配置内核和防火墙,启动服务
开启路由转发功能 # echo 1 > /proc/sys/net/ipv4/ip_forward 或者 # sed -i ‘/net.ipv4.ip_forward/s/0/1/‘ /etc/sysctl.conf # sysctl -p 配置防火墙,别忘记保存 # iptables -A INPUT -s 10.2.8.0/32 -m state --state NEW -m tcp -p tcp -j ACCEPT # iptables -A INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT # iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE # service iptables save 或者直接关闭防火墙 # service iptables stop
# 启动openvpn并设置为开机启动
创建openvpn启动脚本
cp ../../openvpn-2.1.3/sample-scripts/openvpn.init /etc/init.d/openvpn /etc/init.d/openvpn start 或者 /usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf echo "/usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf" >> /etc/rc.local
为客户端分配静态IP:(可选)
在/etc/openvpn/server.conf中增加 client-config-dir /etc/openvpn/ccd 然后在 /etc/openvpn/ccd目录中放针对每个客户端的个性化配置文件。 文件名就用客户端名 生成key的时候输入的 "Common Name" 名字 比如要设置客户端 client 为 10.8.0.8 只要在 /etc/openvpn/ccd/client 文件中包含一行: ifconfig-push 10.8.0.8 255.255.255.0
Windows客户端安装
下载安装OpenVPN客户端工具
6.创建客户端配置文件,默认../OpenVPN/sample-config/client.ovpn
复制一份 client.ovpn 到 ../OpenVPN/config/client.ovpn
编辑client.ovpn
cat client.ovpn client dev tun proto tcp remote 203.195.xxx.xxx 1194 # OpenVPN服务器的外网IP和端口 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt # client1的证书 key client1.key # client1的密钥 ns-cert-type server tls-auth ta.key 1 # 客户端是1,服务器是0 comp-lzo verb 3
拷贝client.ovpn文件到地openvpn客户端 ../OpenVPN/config/目录下
从服务器上拷贝证书/秘钥 “ca.crt、client.crt、client.key、ta.key” 到本地openvpn客户端的config/目录下
然后打开OpenVPN客户端,点击连接。
ok,如果一切顺利,就会看到 "Mon Apr 11 16:26:12 2016 MANAGEMENT: >STATE:1460363172,CONNECTED,SUCCESS,10.8.0.6,10.2.8.45",客户端分配到的ip,10.8.0.6
打开CMD,ipconfig /all 可以看到分配的虚拟ip
问题:
1)客户端启动提示:TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
解决方法: 修改客户端的client.ovpn文件
proto tcp # 修改为tcp协议