openvpn部署

原文发表于cu:2016-03-29

参考文档:

  1. 安装:http://qicheng0211.blog.51cto.com/3958621/1575273
  2. 安装:http://www.ipython.me/centos/centos6-5-build-install-openvpn.html
  3. 安装:http://my.oschina.net/deepblue/blog/532014?fromerr=DV0DExXF#OSC_h3_15
  4. 配置文件详解:http://www.360doc.com/content/11/1225/00/4171006_174788280.shtml
  5. 应用场景:http://www.linuxfly.org/post/86/

一.环境

1. 拓扑示意

金沙官网线上 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.crtclient.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网卡,同意"安装"。

 金沙官网线上 2

3. 配置客户端

证书准备

下载服务器端%easy-rsa%/2.0/keys/目录下是生成的证书,涉及ca.crt,client.crtclient.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**。

本文由金沙官网线上发布于操作系统,转载请注明出处:openvpn部署

您可能还会对下面的文章感兴趣: