1、环境准备
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
[[email protected] ~]# cat /proc/version
Linux version 3.10.0-229.el7.x86_64 ([email protected]) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Fri Mar 6 11:36:42 UTC 2015
2、修改主机名并修改host
[[email protected] ~]# hostnamectl set-hostname internalssl2.meten.com
[[email protected] ~]# vi /etc/hosts
127.0.0.1 在127后面添加internalssl2.meten.com
3、OpenVPN服务器的安装与配置
1)yum install epel-release
2)OpenVPN服务器的安装
yum install openvpn -y //安装OpenVPN与LDAP认证插件
yum install easy-rsa -y //安装RSA证书管理工具
3)OpenVPN Ldap插件安装
yum install glibc* glibc.i686 libstdc++.i686 //安装依赖
rpm -ivh libobjc2-4.5.2-2-mdv2011.0.x86_64.rpm
4)设置OpenVPN Server与easy-rsa
cd /etc/openvpn //进入到OpenVPN配置目录
cp -ra /usr/share/easy-rsa/2.0 /etc/openvpn //复制样式证书管理工具到OpenVPN目录
mv 2.0 easy-rsa //重命名文件夹名称
pwd
/etc/openvpn/easy-rsa
ll /etc/openvpn/easy-rsa //文件夹结构
vars 脚本, 是用来创建环境变量,设置所需要要的变量的脚本
clean-all 脚本, 是创建生成ca证书及密钥文件所需要的文件及目录
build-ca 脚本, 生成ca证书(交互)
build-dh 脚本, 生成Diffie-Hellman文件(交互)
build-key-server 脚本, 生成服务器端密钥(交互)
build-key 脚本, 生成客户端密钥(交互)
pkitool 脚本, 直接使用vars的环境变量设置, 直接生成证书(非交互)
5)创建当前OpenSSL的符号链接
cd /etc/openvpn/easy-rsa //进入Easy-rsa目录
ln -s openssl-1.0.0.cnf openssl.cnf //设置符号链接
6)设置Vars证书变量配置文件
vim vars
<<< OUTPUT OMMITTED >>>
# Increase this to 2048 if you
# are paranoid. This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
exportKEY_SIZE=2048 //设置加密长度
# In how many days should the root CA key expire?
exportCA_EXPIRE=3650 //设置CA有效期
# In how many days should certificates expire?
exportKEY_EXPIRE=3650 //设置Key有效期
# These are the default values for fields
# which will be placed in the certificate.
# Don‘t leave any of these fields blank.
export KEY_COUNTRY="CN" //设置国家名称
export KEY_PROVINCE="GuangDong" //设置省份名称
export KEY_CITY="Shenzhen" //设置城市名称
export KEY_ORG="Shenzhen Meten Education Technology Co.,Ltd." //设置组织名称
export KEY_EMAIL="[email protected]" //设置邮件地址
export KEY_CN=METEN Root CA //设置名称
export KEY_NAME=METEN Root CA
export KEY_OU="IT Dept" //设置组织名称
export PKCS11_MODULE_PATH=METEN
export PKCS11_PIN=1234
export KEY_NAME="METEN KEY"
7)服务器端证书生成与配置
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
#######这里我并没有生成CA,而是将原来的CA证书copy到/etc/openvpn/easy-rsa/keys,就可以使之前颁发的用户证书继续在该服务器有效#########
Build "ca" //生成Root Ca证书, 用于签发Server和Client证书,可以看到已经生成了ca.crt ca.key文件
./build-ca
########结束########
Build "server" //生成服务器使用的VPN server Ca证书,server是您为CA证书起的一个名字 以server名字为例,生成的服务器使用的CA证书文件为: server.crt server.key
./build-key-server internalssl2.meten.com
#######这里生成的client证书所有用户一起使用#########
Build "client"
这里我们在前面有做相应的配置,默认即可。在后面有一个需要确认的地方,输入y继续执行即可。
./build-key client
########结束########
Build "dh2048.pem" //生成Diffie-Hellman文件,可以看到生成了2048位的Diffie-Hellman文件
由于我们采用的2048位,所以配置的时间相对来说会比较长,您可以先去喝口茶。
./build-dh dh2048.pem
8)建立对应目录,并将对应的证书复制到相关目录
cd /etc/openvpn //进入OpenVPN目录
mkdir {client,server} //建立Client与Server目录
# Server相关配置
cp easy-rsa/keys/ca.* server/
cp easy-rsa/keys/internalssl2.meten.com.* server/
cp easy-rsa/keys/dh2048.pem server/
touch server/ipp.txt
# Client相关设置
cp easy-rsa/keys/ca.crt client/
cp easy-rsa/keys/client* client/
9)配置OpenVPN配置文件Server.conf
vim /etc/openvpn/server.conf
#监听IP地址,默认监听所有IP
;local a.b.c.d
#设置模式
mode server
#使用TLS加密传输,本端为Server
tls-server
#######通讯端口设置
#OpenVPN服务器默认采用UDP 1194端口,但是很多运营商封了这个端口,注意修改
port 8083
#测试采用TCP端口,如果您的网络不是很稳定建议采用UDP端口
proto tcp
;proto udp
topology subnet
# 设置创建tun的路由IP通道,还是创建tap的以太网通道路由IP容易控制,所以推荐使用它;但如果如IPX等必须 使用第二层才能通过的通讯,则可以用tap方式,tap也就是以太网桥接
;dev tap
dev tun
#Windows需要给网卡一个名称,linux不需要设置
;dev-node MyTap
#证书位置设置最好设置成绝对路径,有时候采用相对路径会报错。
ca /etc/openvpn/server/ca.crt
#这里是重点,必须指定SSL/TLS root certificate (ca),certificate(cert), and private key (key),ca文件是服务端和客户端都必须使用的,但不需要ca.key服务端和客户端指定各自的.crt和.key,请注意路径,可以使用以配置文件开始为根的相对路径,也可以使用绝对路径,请小心存放.key密钥文件。
cert /etc/openvpn/server/internalssl2.meten.com.crt
key /etc/openvpn/server/internalssl2.meten.com.key
#指定Diffie hellman parameters.
dh /etc/openvpn/server/dh2048.pem
script-security 2
username-as-common-name
### LDAP AUTH ###
#我们采用openvpn-auth-ldap认证,所以设置如下所示:
plugin /usr/lib/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/server/ldap.conf"
#################
#tmp-dir "/tmp"
#up "/etc/openvpn/skyvpnserver/tuzfal_all"
#配置VPN使用的网段,OpenVPN会自动提供基于该网段的DHCP服务,注意不能和任何一方的局域网段重复,保证唯一性。
server 172.21.253.0 255.255.255.0
#绑定IP的记录的文本
ifconfig-pool-persist ipp.txt
#DHCP分配的地址池,注释掉
;ifconfig-pool 202.96.17.2 202.96.17.254
#为客户端创建对应的路由,以另其到达公司内网服务器。记住公司内网服务器也需要有可用路由返回到客户端。
push "route 172.21.128.0 255.255.255.0"
#若客户端希望所有的流量都通过VPN传输,则可以使用该语句,其会自动改变客户端的网关为VPN服务器,推荐关闭。一旦设置,请小心服务端的DHCP设置问题。
;push"redirect-gateway def1 bypass-dhcp"
;push"dhcp-option DNS 208.67.222.222" #VPN用户连接过来后的DNS设置
;push"dhcp-option WINS 208.67.220.220" #VPN用户连接过来后的WINS设置
# 如果您希望有相同Common Name的客户端都可以登陆
# 也可以注释下面的语句,推荐每个客户端都使用不用的Common Name
# 常用于测试
;duplicate-cn
#设置服务端检测的间隔和超时时间
keepalive 10 120
#启用LZO 压缩技术,客户端服务器端都必须设置
comp-lzo
#VPN服务器最多允许连接的有用户数
;max-clients 200
#出于安全考虑,初始化后UID 和GID 权限将降为 "nobody"
;user nobody
;group nobody
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup
persist-tun
#允许客户端之间进行互访
;client-to-client
#允许一个用户多次访问
;duplicate-cn
#输出短日志,每分钟刷新一次以显示当前的客户端,重启系统后记录丢失
status /var/log/openvpn/openvpn-status.log
# 缺省日志会记录在系统日志中,但也可以设置到其它位置
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
# 日志记录的记录等级
# 0 -- 除非发生致命错误,否则保持安静。
# 1 -- 非常安静,但会显示一些非致命网络错误。
# 3 -- 中等输出,通常情况下的很好选择。
# 9 -- 非常详细,用于诊断错误。
#设置日志记录的级别为3级,默认有4个级别。
verb 3
mute 10
#设置最大超时时间为1800秒
reneg-sec 1800
10)配置LDAP配置文件ldap.conf
vim /etc/openvpn/server/ldap.conf
OU为Meten,用户组为:Domain users,AD服务器为:USER-VI3NGDKICN.test.local。
LDAP端口为两个:LDAP服务器端口:389 全局编录服务器端口:3268。
ldap.conf设置如下:
<LDAP>
# LDAP server URL
#配置域服务器与端口号
URL ldap:#USER-VI3NGDKICN.test.local:389
# Bind DN (If your LDAP server doesn‘t support anonymous binds)
# BindDN uid=Manager,ou=People,dc=example,dc=com
#配置域管理员用户地址
BindDN "CN=administrator,CN=Users,DC=test,DC=local"
# Bind Password
# Password SecretPassword
#配置域管理员密码,这里采用明文,也可以采用加密码方式
Password ``11qq123
# Network timeout (in seconds)
#设置网络超时时间
Timeout 15
# Enable Start TLS
#设置是否启用TLS
TLSEnable no
# Follow LDAP Referrals (anonymously)
FollowReferrals no
# TLS CA Certificate File
#TLSCACertFile /usr/local/etc/ssl/ca.pem
# TLS CA Certificate Directory
#TLSCACertDir /etc/ssl/certs
# Client Certificate and key
# If TLS client authentication is required
#TLSCertFile /usr/local/etc/ssl/client-cert.pem
#TLSKeyFile /usr/local/etc/ssl/client-key.pem
# Cipher Suite
# The defaults are usually fine here
# TLSCipherSuite ALL:!ADH:@STRENGTH
</LDAP>
<Authorization>
# Base DN
#设置基础DN
BaseDN "OU=Meten,DC=test,DC=local"
# User Search Filter
#设置用户搜索
SearchFilter "(&(sAMAccountName=%u)"
# Require Group Membership
RequireGroup false
# Add non-group members to a PF table (disabled)
#PFTable ips_vpn_users
<Group>
#设置组基础DN
BaseDN "OU=Meten,dc=test,dc=local"
#查询用户组
SearchFilter "(|(cn=accept_login_vpn))"
MemberAttribute "member"
# Add group members to a PF table (disabled)
#PFTable ips_vpn_eng
</Group>
</Authorization>
11) 测试OpenVPN运行是否正常
openvpn ./server.conf
如果显示运行的最后内容为:Initialization Sequence Completed 则说明正常。
12) 客户端配置文件的配置client.conf(放在客户端上用)
# 定义是一个客户端
client
# 指定ca证书,路径和格式要一致
ca D:\\OpenVPN\\config\\ca.crt
#使用TLS加密传输,本端为client
Tls-client
# 指定客户端的证书,AD验证时所有用户的证书可共用,路径和格式要一致
cert D:\\OpenVPN\\config\\client.crt
key D:\\OpenVPN\\config\\client.key
#配置登录的时候提示输入用户名密码
auth-user-pass
# 定义使用路由IP模式,与服务端一致
;dev tap
dev tun
# 定义Windows下使用的网卡名称,linux不需要
dev-node METEN_VPN_Virtual_Network_Card
# 定义使用的协议,与服务端一致
proto udp
;proto tcp
# 指定服务端地址和端口,可以用多行指定多台服务器
# 实现负载均衡(从上往下尝试)
remote internalssl2.meten.com 8083
# 若上面配置了多台服务器,让客户端随机连接
;remote-random
#非正常断开后自动尝试重新连接
resolv-retry infinite
# 客户端不需要绑定端口
# Most clients do not need to bind to
# a specific local port number.
nobind
# 也是为了让Openvpn也nobody运行(安全)
# 注意:Windows不能设置
;user nobody
;group nobody
# Try to preserve some state across restarts.
persist-key
persist-tun
# 若客户端通过HTTP Proxy,在这里设置
# 要使用Proxy,不能使用UDP为VPN的通讯协议
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
# 无线网络有很多多余的头文件,设置忽略它
mute-replay-warnings
# 使用lzo压缩,与服务端一致
comp-lzo
# Set log file verbosity.
verb 3
# Silence repeating messages
;mute 20
# 一些安全措施
# Verify server certificate by checking
# that the certicate has the nsCertType
# field set to "server". This is an
# important precaution to protect against
# a potential attack discussed here:
# http://openvpn.net/howto.html#mitm
#
# To use this feature, you will need to generate
# your server certificates with the nsCertType
# field set to "server". The build-key-server
# script in the easy-rsa folder will do this.
;ns-cert-type server
# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1
# Select a cryptographic cipher.
# If the cipher option is used on the server
# then you must also specify it here.
;cipher x
13) 客户端文件打包
将/etc/openvpn/client里的ca.crt, client.crt, client.key, 以及配置文件client.ovpn打包
14) 防火墙与系统配置
CentOS7环境下,默认是使用FireWallD服务,即使你修改了iptables,重启又被初始化了,需要再次手动systemctl restart iptables.service才能使设置的iptables生效,
由于FireWallD暂时还没有熟悉使用方法且不知道他比iptables到底有哪些优势,保险起见,还是换回原先的iptables
a.关闭firewall:
#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service
b.安装iptables防火墙
yum install iptables-services -y
systemctl enable iptables
c.设置策略以保证路由能转发到OpenVPN的子网及开放VPN端口
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
#允许客户端访问openvpn端口:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8083 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
#允许VPN后面的服务器与交换机互访
-A FORWARD -d 172.21.128.7/32 -j ACCEPT
-A FORWARD -s 172.21.128.7/32 -j ACCEPT
-A FORWARD -d 172.21.128.21/32 -j ACCEPT
-A FORWARD -s 172.21.128.21/32 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
systemctl restart iptables
iptables -nL
d.开启系统的IP包转发
vi /etc/sysctl.conf
在文件底部添加下面的行:
net.ipv4.ip_forward = 1
使ipv4转发起作用,需要重新启动网络服务:
systemctl restart network.service
e.关闭Selinux
setenforce 0
getenforce
vi /etc/selinux/config
SELINUX=disabled
f.同步网络时间-虚拟化服务器一定要开机同步
17)时间同步(重要)
为什么这里标识为重点了,如果您的时间与AD服务器的时间不能够进行同步一样的话,那么在验证的时候有可能出现这样那样的错误,所以这里重点说明一下。
ntpdate asia.pool.ntp.org
18)设置Openvpn开机自启动
vim /usr/lib/systemd/system/openvpn.service
--------------------openvpn.service-----------------------------------
[Unit]
Description=OpenVPN 2.3.8
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --daemon --config /etc/openvpn/server.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
---------------------------End-----------------------------------------
开机自启动设置如下:
[[email protected] ~]# systemctl enable openvpn.service
ln -s ‘/usr/lib/systemd/system/openvpn.service‘ ‘/etc/systemd/system/multi-user.target.wants/openvpn.service‘
提示:服务器端运行OpenVPN前需要加载tun模块:modprobe -v tun
19) Windows GUI客户端的安装与配置
确保客户端的安装版本为:openvpn-install-2.3.2-I003-i686.exe,前期测试Win8.1的时候发现低版本的死活连接不上去,连接就报错,后来安装了这个版本后连接正常。
客户端安装完成后,在对应的目录新建一个Config文件夹,将客户端的证书与配置文件放于以下目录中。
clip_image004[14]
测试连接:已经连接成功,如下图所示。
clip_image005[4]