1、安装openvpn

yum install -y easy-rsa openvpn openvpn-auth-ldap

2、配置证书

配置EasyRSA

#下载EasyRSA 3.0.7
cd /opt/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
tar xf EasyRSA-3.0.7.tgz
cd /opt/EasyRSA-3.0.7
cp vars.example vars

创建相关证书和秘钥

./easyrsa init-pki

#创建根证书
#nopass 参数表示不加密;也可以不加此参数,那就需要输入密码短语
./easyrsa build-ca nopass

#创建服务端秘钥
./easyrsa gen-req server nopass

#给服务端证书签名,这里要输入yes才能完成
./easyrsa sign-req server server

##创建客户端秘钥
./easyrsa gen-req client nopass

#给客户端证书签名,这里要输入yes才能完成
./easyrsa sign-req client client

#创建Diffie-Hellman 这里耗时会比较长
./easyrsa gen-dh

#创建TLS认证密钥
openvpn --genkey --secret /etc/openvpn/ta.key

拷贝证书到目录

cd pki
cp ca.crt dh.pem /etc/openvpn/
cp private/server.key issued/server.crt /etc/openvpn/server/
cp private/client.key issued/client.crt /etc/openvpn/client/

3、server配置文件

/etc/openvpn/server.conf

#推送客户端可以访问的vpn路由网段
push "route 172.16.0.0 255.255.0.0"
push "route 192.168.0.0 255.255.255.0"

#自动推送客户端上的网关及DHCP (此参数会让客户端都走vpn的网络,不加此参数可以实现正常走本地网络,访问vpn资源走vpn网络)
#push "redirect-gateway def1 bypass-dhcp"

#OpenVPN的DHCP功能为客户端提供指定的 DNS、WINS 等
#push "dhcp-option DNS 114.114.114.114"

#监听本机ip地址
local 0.0.0.0

##监控本机端口号
port 1194

##指定采用的传输协议,可以选择tcp或udp
proto tcp

##指定创建的通信隧道类型,可选tun或tap
dev tun

##指定CA证书的文件路径
ca /etc/openvpn/ca.crt

##指定服务器端的证书文件路径
cert /etc/openvpn/server/server.crt

##指定服务器端的私钥文件路径
key /etc/openvpn/server/server.key

##指定迪菲赫尔曼参数的文件路径
dh /etc/openvpn/dh.pem

##指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用.1的ip地址
server 10.8.0.0 255.255.255.0

##服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
ifconfig-pool-persist ipp.txt

##允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
client-to-client

##允许一套证书或账户多人登录
duplicate-cn

##每10秒ping一次,连接超时时间设为120秒
keepalive 10 120

##开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
tls-auth /etc/openvpn/ta.key 0

##加密认证算法
cipher AES-256-CBC

##使用lzo压缩的通讯,服务端和客户端都必须配置
comp-lzo

##最大连接用户
max-clients 100

##定义运行的用户和组
user openvpn
group openvpn

##重启时仍保留一些状态
persist-key
persist-tun

##输出短日志,每分钟刷新一次,以显示当前的客户端
status /var/log/openvpn-status.log

##日志保存路径
log /var/log/openvpn.log
log-append /var/log/openvpn.log

##指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 4

##相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中
mute 20

#对接LDAP
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf"
client-cert-not-required
username-as-common-name

4、ldap认证配置

/etc/openvpn/auth/ldap.conf  

<LDAP>
# LDAP server URL
URL ldap://ldap1.example.org

# Bind DN (If your LDAP server doesn't support anonymous binds)
BindDN uid=Manager,ou=People,dc=example,dc=com

# Bind Password
Password SecretPassword

# Network timeout (in seconds)
Timeout 15

# Enable Start TLS
# TLSEnable yes

# Follow LDAP Referrals (anonymously)
# FollowReferrals yes

# 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
BaseDN "ou=xxx,dc=xxx,dc=com"

# User Search Filter
SearchFilter "(cn=%u)"

# Require Group Membership
RequireGroup false

# Add non-group members to a PF table (disabled)
#PFTable ips_vpn_users

# <Group>
# BaseDN "ou=Groups,dc=example,dc=com"
# SearchFilter "(|(cn=developers)(cn=artists))"
# MemberAttribute uniqueMember
# Add group members to a PF table (disabled)
# PFTable ips_vpn_eng
# </Group>
</Authorization>

5、设置systemd启动脚本

/usr/lib/systemd/system/openvpn.service  

[Unit]
Description=OpenVPN service
After=syslog.target network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO

[Service]
Type=notify
PrivateTmp=true
WorkingDirectory=/etc/openvpn/server
ExecStart=/usr/sbin/openvpn --status-version 2 --suppress-timestamps --config /etc/openvpn/server.conf
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_OVERRIDE CAP_AUDIT_WRITE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
KillMode=process
RestartSec=5s
Restart=on-failure

[Install]
WantedBy=multi-user.target

6、启动服务

systemctl start openvpn.service


7、客户端配置

client
dev tun
proto tcp
remote IP 端口
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
auth-user-pass
auth-nocache
verb 4
<ca>
ca.ctr文件内容
</ca>
key-direction 1
<tls-auth>
ta.key文件内容
</tls-auth>


8、服务器iptables配置

#iptables 默认操作
# 开启转发
echo 'net.ipv4.ip_forward = 1' >> /etc/ssctl.conf
sysctl -p

# iptables 清空规则
iptables -F

# iptables 转发默认策略
iptables -P FORWARD DROP

# iptabls 开启NAT路由
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -j MASQUERADE