OpenVPN + Ldap + OTP

× 文章目录
  1. 1. OpenVPN 服务端的一些配置
  2. 2. AS 版本破解
  3. 3. 社区版OpenVPN
  4. 4. 配置LDAP
  5. 5. 配置OTP
  6. 6. 客户端连接VPN

OpenVPN 服务端的一些配置

VPN是企业内比较重要的一个资产,不能从网上乱下载,去官网看看 https://openvpn.net/,第一次不懂事,不清楚OpenVPN还有商业版,OpenVPN Access Server 和 OpenVPN Community,直接就安装了OpenVPN AS,没有网上说的那么难,还有图形化界面,登陆进行发现2个并发license???去官网注册购买需要花钱???

AS 版本破解

下载的最新版本的2.10.1,从网上搜了一下,这玩意还有破解版的,试一下最新版能不能破解

参考《XX Access Server 2.9.x 破解在线人数限制》,这是找到的最新的了,发现使用相同的办法,也能破解2.10.1

待破解的文件仍是 pyovpn-2.0-py3.6.egg,解压,反编译pyovpn/lic/uprop.pyc

修改uprop.py,搜索return ret,在上面添加一行ret['concurrent_connections'] = 4096

编译,替换

初始化AS
/usr/local/openvpn_as/bin/ovpn-init

配置VPN 路由、LDAP 、MFA,真丝滑

社区版OpenVPN

从官网上找教程

部署参考《openvpn部署》

server端配置文件 /etc/openvpn/server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
port 1194   # 监听的端口号
proto udp # 服务端用的协议,udp,默认udp
dev tun
ca /etc/openvpn/server/certs/ca.crt # CA 根证书路径
cert /etc/openvpn/server/certs/server.crt # open VPN 服务器证书路径
key /etc/openvpn/server/certs/server.key # open VPN 服务器密钥路径,This file should be kept secret
dh /etc/openvpn/server/certs/dh.pem # Diffie-Hellman 算法密钥文件路径
tls-auth /etc/openvpn/server/certs/ta.key 0 # 开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
ifconfig-pool-persist ipp.txt #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
push "route 10.0.0.0 255.0.0.0" # # 推送路由和DNS到客户端
push "route 192.168.0.0 255.255.0.0"
push "route 172.16.0.0 255.240.0.0" # 推送路由到客户端,如果内网服务器地址是172.21.16.0的网段,可以增加此行,然后就可以ping通内网地址的所有服务器
server 10.8.0.0 255.255.255.0 # 该网段为 open VPN 虚拟网卡网段,不要和内网网段冲突即可。open VPN 默认为 10.8.0.0/24
push "dhcp-option DNS 8.8.8.8" # DNS 服务器配置,可以根据需要指定其他 ns
push "dhcp-option DNS 8.8.4.4"
# push "redirect-gateway def1" # 客户端所有流量都通过 open VPN 转发,类似于代理开全局,VPN服务器本身要通过客户端原来的网关访问(取消redirect-gateway def1 bypass-dhcp选项后这项必须开启,否则无法访问OpenVPN服务器)
compress lzo
duplicate-cn # 如果客户端都使用相同的证书和密钥连接VPN,一定要打开这个选项,否则每个证书只允许一个人连接VPN
keepalive 10 120 # 每10秒ping一次,连接超时时间设为120秒。
comp-lzo # 开启VPN连接压缩,如果服务器端开启,客户端也必须开启
client-to-client #设置客户端是否可以访问客户端
persist-key # 持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
persist-tun
max-clients 1000 # 允许最大的客户端连接数,默认100
user openvpn # open VPN 进程启动用户,openvpn 用户在安装完 openvpn 后就自动生成了
group openvpn
log /var/log/openvpn/server.log # 指定 log 文件位置
log-append /var/log/openvpn/server.log
status /var/log/openvpn/status.log
verb 3
explicit-exit-notify 1 # 设置断线重连功能
cipher AES-256-CBC #指定数据对称加密算法
reneg-sec 0 #reneg-sec服务器端会定期检查认证情况,默认3600秒一小时,使用OTP的话尽量时间长一些,否则客户端需要重新输入用户名密码和OTP一次性密码。
auth-nocache #断线后防止内存中保存用户名和密码来提高安全性

防火墙相关配置

1
2
3
4
5
6
7
8
# 将 openvpn 的网络流量转发到公网:snat 规则
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE

# iptables 规则持久化保存
iptables-save > /etc/sysconfig/iptables

# 规则查看
iptables -nvL -t nat

客户端配置文件 config.ovpn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
client
proto udp
dev tun
remote [open VPN服务端公网 ip,根据实际情况填写] 1194 //openvpn服务器的外网IP和端口(可以写多个做到高可用)
ca ca.crt
cert admin.crt
key admin.key
tls-auth ta.key 1
remote-cert-tls server //指定采用服务器校验方式
comp-lzo
verb 3 //调试信息级别
mute-replay-warnings
resolv-retry infinite //断线自动重新连接
nobind //不绑定特定的本地端口号
persist-key //与服务器端的保持一致
persist-tun //与服务器端的保持一致
cipher AES-256-CBC //指定数据对称加密算法

配置LDAP

这里参考《openvpn配置ldap》

LDAP接入还是很省事的,安装openvpn-auth-ldap插件

配置 /etc/openvpn/auth/ldap.conf

1
2
3
4
5
6
7
8
9
10
11
12
<LDAP>
URL ldap://xx.xx.xx.xx:389
Password xx
Timeout 15
TLSEnable no
FollowReferrals no
</LDAP>
<Authorization>
BaseDN "ou=xx,dc=xx,dc=cn"
SearchFilter "sAMAccountName=%u"
RequireGroup false
</Authorization>

编辑server配置文件,添加

1
2
3
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf"
client-cert-not-required
username-as-common-name

修改客户端配置

1
2
ns-cert-type server
auth-user-pass

测试成功

配置OTP

这个有点难啊,一直没有配置成功
参考《OpenVPN启用LDAP+GoogleAuthenticator认证》
使用了https://github.com/evgeny-gridasov/openvpn-otp插件,一直没有成功,放弃了

参考《OpenVPN+AD+Google authenticator 安装、配置》,使用了google-authenticator-libpam,不是专业运维,配置pam头疼,放弃了

继续搜索可用教程
找到了https://github.com/wheelybird/openvpn-server-ldap-otp,通过docker部署,集成好了ldap和otp,丝滑,简单看了下配置参数,启动容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker run \
--name openvpn \
--volume /etc/openvpn:/etc/openvpn \
-v /etc/localtime:/etc/localtime:ro \
--detach=true \
--restart=always \
-p 61194:1194/udp \
-e "OVPN_SERVER_CN=vpn.pa55w0rd.com" \
-e "LDAP_URI=ldap://xx.xx.xx.xx" \
-e "LDAP_BASE_DN=OU=xx,DC=xx" \
-e "LDAP_BIND_USER_DN=CN=xx,OU=xx,DC=xx" \
-e "LDAP_BIND_USER_PASS=xx" \
-e "LDAP_LOGIN_ATTRIBUTE=sAMAccountName" \
-e "LDAP_FILTER=(objectClass=user)" \
-e "OVPN_NETWORK=10.118.0.0 255.255.0.0" \
-e "OVPN_ROUTES=172.16.0.0 255.240.0.0,10.0.0.0 255.0.0.0,192.168.0.0 255.255.0.0" \
-e "OVPN_DNS_SERVERS=192.168.1.2" \
-e "OVPN_IDLE_TIMEOUT=36000" \
-e "ENABLE_OTP=true" \
-e "FAIL2BAN_ENABLED=true" \
-e "FAIL2BAN_MAXRETRIES=20" \
--cap-add=NET_ADMIN \
wheelybird/openvpn-ldap-otp:v1.5

打印客户端配置文件 docker exec -ti openvpn show-client-config

添加OTP docker exec -ti openvpn add-otp-user <username> where username matches the LDAP username.

还有fail2ban防止暴力破解

测试,登陆成功

客户端连接VPN

偷懒,阿里云都写好了 《客户端远程连接VPC》