openvpn部署
原文发表于cu:2016-03-29
参考文档:
- 安装:http://qicheng0211.blog.51cto.com/3958621/1575273
- 安装:http://www.ipython.me/centos/centos6-5-build-install-openvpn.html
- 安装:http://my.oschina.net/deepblue/blog/532014?fromerr=DV0DExXF#OSC_h3_15
- 配置文件详解:http://www.360doc.com/content/11/1225/00/4171006_174788280.shtml
- 应用场景:http://www.linuxfly.org/post/86/
一.环境
1. 拓扑示意
2. 环境
Client:Win7 x86_64, 10.19.1.200
Server:CentOS6.7 x86_64,eth0 10.19.1.100,eth0 172.16.1.100
Intranet:172.16.1.200
二.部署openvpn server
1. 软件准备
检查依赖软件包与编译工具,涉及:pam pam-devel openssl openssl-devel make automake autoconf pkgconfig gcc gcc-c++ libtool gettext lzo lzo-devel等,其中pam pam-devel openssl openssl-devel lzo lzo-devel (openvpn数据压缩使用lzo)必须安装。
可以使用rpm命令检查:rpm -qa | grep xxx
如果不存在,可以使用yum安装:yum install xxx -y
2. 内核支持
1) 检查CentOS系统内核是否支持tun/tap驱动,
[root@localhost ~]# modinfo tun
filename: /lib/modules/2.6.32-573.el6.x86_64/kernel/drivers/net/tun.ko
alias: char-major-10-200
license: GPL
author: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
description: Universal TUN/TAP device driver
srcversion: 7E378005ED4D694F19D6024
depends:
vermagic: 2.6.32-573.el6.x86_64 SMP mod_unload modversions
上面返回结果表示内核支持驱动,如果返回error类错误表明不支持相应驱动。
2) 确认内核支持驱动后,检查驱动是否加载,
[root@localhost ~]# lsmod | grep tun
tun 16934 0
如果没有返回值,表示驱动未加载,通常使用如下命令加载,
[root@localhost ~]# modprobe tun
#也可以使用ls /dev/net/tun检查文件是否存在判断tun模块是否加载。
3. openvpn server安装
获取软件
获取最新版本的安装软件,放置在/usr/local/src/目录下,
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# wget https://swupdate.openvpn.org/community/releases/openvpn-2.3.10.tar.gz
[root@localhost src]# wget http://build.openvpn.net/downloads/releases/easy-rsa-2.2.0_master.tar.gz
编译安装openvpn服务器
[root@localhost src]# mkdir /usr/local/openvpn/
[root@localhost src]# tar -zxvf openvpn-2.3.10.tar.gz
[root@localhost src]# cd openvpn-2.3.10
[root@localhost openvpn-2.3.10]# ./configure --prefix=/usr/local/openvpn/
[root@localhost openvpn-2.3.10]# make ; make install
[root@localhost openvpn-2.3.10]# mkdir /usr/local/openvpn/etc/
[root@localhost openvpn-2.3.10]# cp /usr/local/src/openvpn-2.3.10/sample/sample-config-files/server.conf /usr/local/openvpn/etc/
[root@localhost openvpn-2.3.10]# mkdir /etc/openvpn/
[root@localhost openvpn-2.3.10]# ln -s /usr/local/openvpn/etc/server.conf /etc/openvpn/
#将openvpn服务器端配置文件复制到/usr/local/openvpn/etc/,并在/etc/openvpn/目录下建立软连接
部署easy-rsa
使用easy-rsa制作CA证书、服务端证书以及客户端证书,openvpn 2.3以上版本的源码包不再含easy-rsa。
[root@localhost src]# tar -zxvf easy-rsa-2.2.0_master.tar.gz
[root@localhost src]# mv easy-rsa-2.2.0_master /usr/local/openvpn/easy-rsa
#easy-rsa不用安装,解压之后复制到相应目录即可 (此处变更了目录名)。
制作证书 (CA证书,服务端证书及客户端证书)
配置PKI
[root@localhost src]# cd /usr/local/openvpn/easy-rsa/easy-rsa/2.0/
[root@localhost 2.0]# chmod +x vars
[root@localhost 2.0]# vim vars
修改: export KEY_SIZE=1024 为 export KEY_SIZE=2048
#对性能有一定影响,酌情处理。
如下 (标红的地方为需要修改的值,69/70/73/74行注释):
64 export KEY_COUNTRY="CN"
65 export KEY_PROVINCE="XX"
66 export KEY_CITY="XXX"
67 export KEY_ORG="XXX"
68 export KEY_EMAIL="xx@xx.com"
69 #export KEY_EMAIL=mail@host.domain
70 #export KEY_CN=changeme
71 export KEY_NAME="EasyRsa"
72 export KEY_OU="XXX"
73 #export PKCS11_MODULE_PATH=changeme
74 #export PKCS11_PIN=1234
#证书变量修改后,生成服务端ca证书时,这里的配置会作为缺省配置;也可以使用export修改变量。
#其实vars文件不修改也可以,主要涉及变量,酌情处理。
#建立openssl软链接
[root@localhost 2.0]# ln -s openssl-1.0.0.cnf openssl.cnf
#使变量生效
[root@localhost 2.0]# source ./vars
生成证书
清空原有证书
#慎用,特别在非首次操作时,会清除%easy-rsa%/2.0/keys/下的所有已经生成的证书
[root@localhost 2.0]# ./clean-all
生成服务端ca证书
#缺省配置已修改,可以一直回车
[root@localhost 2.0]# ./build-ca
生成服务端密钥证书
# server是自定义的服务器名, 可以一直回车,直到提示输入"y/n"时,输入"y"再按回车;"A challenge password []: " 处可以自定义密码,与后面生成客户端证书保持一致即可
[root@localhost 2.0]# ./build-key-server server
生成diffie hellman参数
#生成dh2048.pem文件,用于增强openvpn安全性。
[root@localhost 2.0]# ./build-dh
生成客户端证书
# client是自定义的客户端名,可以一直回车,直到提示输入"y/n"时,输入"y"再按回车;"A challenge password []: " 处与服务端保持一致即可
[root@localhost 2.0]# ./build-key client
生成ta.key文件
#防DDos攻击、UDP淹没等恶意攻击
[root@localhost 2.0]# /usr/local/openvpn/sbin/openvpn --genkey --secret keys/ta.key
在%easy-rsa%/2.0/keys/目录下是生成的各类证书,将ca.crt,client.crt,client.key,ta.key,发送到客户端备用。
4. openvpn server配置部署
[root@localhost 2.0]# cd /usr/local/openvpn/etc/
[root@localhost etc]# vim server.conf #红色标注为本次生效的服务端配置
# 定义openvpn监听的IP地址,默认注释掉,如果服务器是单网卡的可不注明,服务器多网卡时建议注明
local 10.19.1.100
# 定义openvpn服务进程端口,默认1194
port 1194
# TCP or UDP,在不使用http proxy时建议采用udp,有其他机制可以保证传输的可靠性,且降低DDoS攻击的可能性
proto udp
# 设置路由模式,tap是桥接模式,通过软件在系统中模拟出一个tap设备,该设备是一个二层设备,同时支持链路层协议;tun是路由模式,通过软件在系统中模拟出一个tun路由,tun是ip层的点对点协议
dev tun
# 设置SSL/TLS root certificate (ca), 即生成的证书,采用绝对路径
ca /usr/local/openvpn/easy-rsa/easy-rsa/2.0/keys/ca.crt
cert /usr/local/openvpn/easy-rsa/easy-rsa/2.0/keys/server.crt
key /usr/local/openvpn/easy-rsa/easy-rsa/2.0/keys/server.key # This file should be kept secret
# 设置Diffie hellman parameters,采用绝对路径
dh /usr/local/openvpn/easy-rsa/easy-rsa/2.0/keys/dh2048.pem
# 为客户端分配地址和掩码,".1"这个地址会留给服务器端TUN/TAP设备
server 172.16.99.0 255.255.255.0
# 维持客户端与虚拟IP的对应表,方便客户端再次连接时获得同样的IP,默认路径同server.conf同目录
ifconfig-pool-persist /usr/local/openvpn/etc/ipp.txt
# 推送网段路由到客户端,这里针对上面拓扑图的Intranet
push "route 192.168.10.0 255.255.255.0"
# 如果客户端"Thelonious"后端还有1个网段,服务端需要将此网段注入本地路由表,作为客户端后端网络访问的回程路由;同时在ccd/Thelonious文件中写入"iroute 192.168.40.128 255.255.255.248",ccd目录默认与server.conf同目录
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# 如果客户端"Thelonious" (假设的1个名字) 需要1个固定ip,可以在ccd/Thelonious文件中写入"ifconfig-push 10.9.0.1 255.255.255.252"
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# 修改客户端网关,默认禁用
;push "redirect-gateway def1 bypass-dhcp"
# 推送dns信息
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
# 允许openvpn客户端之间互通,默认禁止
client-to-client
# 允许多客户端采用1个客户端证书,默认1个证书同时只能1个客户端连接,多客户端同时连接需生成多个客户端证书
duplicate-cn
# 设置服务端检测的间隔和超时时间,10s检测1次,120s超时
keepalive 10 120
# ta.key文件增强安全性,防DDos攻击、UDP淹没等恶意攻击,默认不开启;此key文件在服务端/客户端各1份,服务端参数为"0",客户端参数为"1"
tls-auth /usr/local/openvpn/easy-rsa/easy-rsa/2.0/keys/ta.key 0 # This file is secret
# 数据采用lzo压缩传输
comp-lzo
# 设置允许同时连接的最大客户端数
max-clients 10
# nobody账户连接,增强安全性
user nobody
group nobody
# 通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
# 通过keepalive检测超时后,重新启动VPN,一直保持tun或tap设备是linkup,否则网络连接会先linkdown然后linkup
persist-tun
# 设置openvpn状态日志
status /usr/local/openvpn/etc/openvpn-status.log
# 设置日志文件
log /usr/local/openvpn/etc/openvpn.log
# 设置运行日志文件,一般禁用,在openvpn启动错误时可打开定位
;log-append /usr/local/openvpn/etc/openvpn.log
# 日志级别
verb 3
5. 启动openvpn server
#从解压的源码文件中复制openvpn的启动脚本到/etc/init.d/目录,启动脚本根据系统选择,centos选择rhel
#添加openvpne到服务管理中并设置开机启动
[root@localhost ~]# cp /usr/local/src/openvpn-2.3.10/distro/rpm/openvpn.init.d.rhel /etc/init.d/openvpn
[root@localhost ~]# chkconfig --add openvpn
[root@localhost ~]# chkconfig --level 35 openvpn on
#添加openvpn执行文件的软链接
[root@localhost ~]# ln -s /usr/local/openvpn/sbin/openvpn /usr/sbin/openvpn
[root@localhost ~]# service openvpn start
三.转发设置
1. 启动系统(内核)路由转发功能
[root@localhost ~]# sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
[root@localhost ~]# sysctl -p
如果是centos7,/etc/sysctl.conf为空文件,可以在/etc/sysctl.conf文件中添加如下内容并立即使能路由转发功能:
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
2. 配置iptables
#允许客户端访问服务器udp 1194端口,与server.conf文件中采用的协议有关
#源地址为openvpn虚拟网段的ip nat为eth1网口ip实现内网穿透;当然,如果Intranet需要访问openvpn虚拟网段,需要在Intranet内部或边界设置回程路由
#如果iptables提示nat有问题,可能是因为nat模块没有加载,可以通过"modprobe iptable_nat"命令加载nat模块,再通过"lsmod | grep nat"命令确认其是否正确加载到内核
#切记保存rules到/etc/sysconfig/iptables文件,可以使用cat检查文件
[root@localhost ~]# iptables -I INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 172.16.99.0/24 -o eth1 -j MASQUERADE
[root@localhost ~]# service iptables save
四.部署openvpn client for windows
1. 下载软件
下载地址 (xp, x86_64位环境):http://swupdate.openvpn.org/community/releases/openvpn-install-2.3.10-I002-x86_64.exe
下载地址 (vista and later, x86_64位环境):https://swupdate.openvpn.org/community/releases/openvpn-install-2.3.10-I603-x86_64.exe
2. 安装openvpn客户端
安装openvpn-install-2.3.10-I603-x86_64.exe,其中要求安装虚拟tap网卡,同意"安装"。
3. 配置客户端
证书准备
下载服务器端%easy-rsa%/2.0/keys/目录下是生成的证书,涉及ca.crt,client.crt,client.key,ta.key,存放到openvpn安装目录的config金沙官网线上,目录。
# ta.key非必须证书,主要增强安全性
openvpn client配置部署
进入openvpn安装目录,复制 sample-configclient.ovpn 文件到 config 目录,是否修改文件名酌情处理。
文本文件打开client.ovpn,注意与服务器端的配置对应即可。
##############################################
client
dev tun
proto udp
remote 10.19.1.100 1194
# 不停的尝试解析服务器端的主机名,对于非永久连接到internet的设备有用
resolv-retry infinite
# 客户端不需要绑定1个端口号
Nobind
# nobody账号仅适用linux系统,这里是否注释不影响连接性
user nobody
group nobody
persist-key
persist-tun
# 可以不使用绝对路径,默认路径同*.ovpn相同的config目录
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
# ta.key,服务器与客户端各保存1份,服务器端参数为"0",客户端参数为"1"
tls-auth ta.key 1
comp-lzo
verb 3
启动OpenVPN GUI
启动openvpn客户端,通过以下三种方式检查openvpn连接状态:
客户端cmd下查看网卡ip: ipconfig /all;
在客户端cmd下查看路由表: route print;
在客户端cmd下ping Intranet。
#ping Intranet时,注意服务器端**iptables中原生有1条rule禁止转发数据包 (-A FORWARD -j REJECT --reject-with icmp-host-prohibited,禁止转发且返回“icmp-host-prohibited”信息),可以注释此条rule,然后重启iptables**。