0%

OpenvpnAs

OpenvpnAS

openvpnas全称为:openvpn access server,是openvpn的商业版本,与openvpn不同的是,openvpnas自身提供了一个管理web服务,并且openvpnas连接使用的客户端也与openvpn不一样。

官方网站:https://openvpn.net/

centos部署

安装部署注意点:

1
2
3
1.由于官网需翻墙访问(无国内访问地址),所以访问官网以及下载官网安装包都需要科学翻墙。
2.如果要在官网手动下载最新的部署包文件需要注册账号并登录
3.as本身为商业版本,在免费使用的情况下仅支持两个用户的连接,需破解(连接人数限制)。

部署

通过yum源部署

官方有直接可以用的yum源可以部署使用(如果是ubuntu或其他系统可以在官方找对应的apt源)。

1
2
3
yum -y install  yum install net-tools wget ntp python3 #安装依赖
yum -y install https://as-repository.openvpn.net/as-repo-centos7.rpm
yum -y install openvpn-as

通过rpm包部署

1
2
3
4
wget https://openvpn.net/downloads/openvpn-as-latest-CentOS7.x86_64.rpm # openvpn-as
wget https://openvpn.net/downloads/openvpn-as-bundled-clients-latest.rpm # openvpn-as-bundled-clients
yum -y install yum install net-tools wget ntp python3 #安装依赖

1
2
3
4
5
6
7
8
9
这里无论是yum还是rpm包安装,在安装完后都会打印出如下信息,包括访问地址以及管理员账号密码:
Admin UI: https://192.168.111.218:943/admin
Client UI: https://192.168.111.218:943/
To login please use the "openvpn" account with "IulcqeySq9Mp" password.
(password can be changed on Admin UI)
+++++++++++++++++++++++++++++++++++++++++++++++
----
这里的Admin UI(/admin)是web管理地址,Client UI(/)是客户端下载的地址,管理员账号为:openvpn(默认),密码这里为:IulcqeySq9Mp
如果没看到该信息或者忘记了管理员账号密码可以在/usr/local/openvpn_as/init.log中查看

修改用户限制(破解)

安装完以后还需要破解修改其用户限制人数,由于安装完会自动启动openvpnas服务,所以这里首先要先关闭服务。

1
systemctl stop openvpnas

破解步骤:需要进入openvpnas家目录的python路径下,将pyovpn-2.0-py3.6.egg通过unzip解压并将其解压目录pyovpn/lic/uprop.py修改concurrent_connections连接数并编译uprop.py文件,再将其刚刚解压的文件重新打包成pyovpn-2.0-py3.6.egg并替换原文件即可。

我这里准备了破解的脚本,一键执行即可,但需要提前安装zip和unzip工具。

1
yum -y install unzip zip

unlimited.sh

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
#!/bin/bash
openvpnas_python_location='/usr/local/openvpn_as/lib/python'
cd $openvpnas_python_location && mkdir unlock_license && mv pyovpn-2.0-py3.6.egg pyovpn-2.0-py3.6.egg_bak
cd $openvpnas_python_location && cp -rp pyovpn-2.0-py3.6.egg_bak unlock_license/pyovpn-2.0-py3.6.zip
cd ${openvpnas_python_location}/unlock_license && unzip pyovpn-2.0-py3.6.zip
cd ${openvpnas_python_location}/unlock_license/pyovpn/lic/ && mv uprop.pyc uprop2.pyc
cat > ${openvpnas_python_location}/unlock_license/pyovpn/lic/uprop.py << EOF
from pyovpn.lic import uprop2
old_figure = None

def new_figure(self, licdict):
ret = old_figure(self, licdict)
ret['concurrent_connections'] = 1024
return ret


for x in dir(uprop2):
if x[:2] == '__':
continue
if x == 'UsageProperties':
exec('old_figure = uprop2.UsageProperties.figure')
exec('uprop2.UsageProperties.figure = new_figure')
exec('%s = uprop2.%s' % (x, x))
EOF
cd ${openvpnas_python_location}/unlock_license/pyovpn/lic/ && python -O -m compileall uprop.py
cd /usr/local/openvpn_as/lib/python/unlock_license && zip -r pyovpn-2.0-py3.6_cracked.zip common EGG-INFO pyovpn
mv /usr/local/openvpn_as/lib/python/unlock_license/pyovpn-2.0-py3.6_cracked.zip /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.6.egg
1
2
bash unlimited.sh #执行破解脚本
systemctl start openvpnas #启动openvpnas

破解完有两种方式可以查看到是否生效了。根据上面的python代码:ret[‘concurrent_connections’] = 1024,这里表示连接数上限为1024,在其openvpnas服务的启动日志中可以看到。

1
2
3
cat /var/log/openvpnas.log
2023-07-12T03:15:17-0400 [stdout#info] Server Agent started
2023-07-12T03:15:22-0400 [stdout#info] License Info {'concurrent_connections': 1024, 'apc': False} #启动成功会打印该行

第二种方法是登录管理后台页面,在首先可以看到:

image-20230712152208704

备注

1
2
3
4
1.openvpnas针对不对版本破解方式略有不同,本文中使用的openvpnas2.11版本在破解时无任何问题,如果有问题,可以参考以下文档:
https://6xyun.cn/article/112
https://github.com/s884812/openvpn_as_crack/tree/master
http://www.blogme.club/2021/12/20/centos7%E5%AE%89%E8%A3%85openvpnas/

Docker部署

Dockerfile

首先是镜像的dockerfile,需要提前准备好openvpnas的rpm包和破解脚本unlimited.sh(rpm和脚本获取参考上面的rpm包部署)。

1
2
3
4
5
6
7
8
9
10
11
12
From centos:7
RUN yum -y install epel-release zip unzip curl wget lzo net-tools dmidecode cyrus-sasl libpcap xmlsec1 xmlsec1-openssl python3
RUN mkdir /app
USER root
WORKDIR /app
COPY openvpn-as-bundled-clients-27.rpm /app
COPY openvpn-as-2.11.3_af31575c-CentOS7.x86_64.rpm /app
COPY unlimited.sh /app
RUN rpm -ivh /app/*.rpm
RUN /bin/bash /app/unlimited.sh
EXPOSE 1194 943
CMD /usr/local/openvpn_as/scripts/openvpnas --nodaemon #--logfile=/var/log/openvpnas.log

打包镜像

1
2
3
4
5
6
7
[root@edge openvpnm]# ll
总用量 297912
-rw-r--r-- 1 root root 465 7月 12 15:38 Dockerfile
-rw-r--r-- 1 root root 28127916 7月 11 10:39 openvpn-as-2.11.3_af31575c-CentOS7.x86_64.rpm
-rw-r--r-- 1 root root 276919192 7月 11 10:40 openvpn-as-bundled-clients-27.rpm
-rw-r--r-- 1 root root 1290 7月 11 11:04 unlimited.sh
[root@edge openvpnm]# docker build . -t docker-registry.finsiot.com/finsiot/openvpnas:1.0

运行

1
2
3
4
5
6
docker run -d --cap-add=NET_ADMIN --device /dev/net/tun:/dev/net/tun -p 943:943 -p 1194:1194 -p 443:443  -v ${PWD}/db:/usr/local/openvpn_as/etc/db docker-registry.finsiot.com/finsiot/openvpnas:1.0

参数说明: --device /dev/net/tun:/dev/net/tun /dev/net/tun文件的挂载,tun文件用于支持TUN/TAP虚拟网络设备(docker运行不挂载该文件会出现无法生成虚拟ip的错误)。
-p 943:943 -p 1194:1194 -p 443:443 分别是管理端口,udp通信端口(默认),tcp通信端口(默认)
-v ${PWD}/db:/usr/local/openvpn_as/etc/db 挂载当前目录下的db目录到容器的db目录(openvpn sqlite的数据库文件目录),但因为这个目录是容器打包安装时就生成的(rpm安装时就生成了),所以如果启动直接将db文件夹目录覆盖会启动失败,找不到数据库。这里需要提前运行一次将该文件夹下面的数据库文件复制到当前目录的db目录下,再重新运行该服务。
运行之后管理员账号密码需进入容器后在:/usr/local/openvpn_as/init.log中查看

k8s部署

部署使用的镜像取自上面docker部署中通过dockerfile构建的镜像,下面直接附上部署yaml文件。这里需要注意的是这个挂载目录/usr/local/openvpn_as/etc/db/,和上面docker部署一样,由于镜像启动前就生成的目录以及数据文件,所以没办法直接覆盖挂载(需要提前复制到挂载路径中)。我这边常用的方式是第一次启动时将其挂载目录挂载到其它地方,然后进入容器将里面的文件复制到挂载目录,再更改挂载目录位置重启服务。

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
apiVersion: apps/v1
kind: Deployment
metadata:
name: openvpn-as
spec:
replicas: 1
selector:
matchLabels:
app: openvpn-as
template:
metadata:
labels:
app: openvpn-as
spec:
nodeName: node1
imagePullSecrets:
- name: docker-registry
containers:
- name: openvpn-as
securityContext:
privileged: true
resources:
limits:
cpu: "4"
memory: 4Gi
requests:
cpu: "100m"
memory: 100Mi
image: docker-registry.finsiot.com/finsiot/openvpn-as:v1.0
imagePullPolicy: Always
ports:
- containerPort: 1194
- containerPort: 443
- containerPort: 943
volumeMounts:
- mountPath: /usr/local/openvpn_as/etc/db/
name: data
- mountPath: /etc/localtime
name: time-zone
volumes:
- name: data
persistentVolumeClaim:
claimName: openvpn-as-pvc
- hostPath:
path: /etc/localtime
type: ""
name: time-zone
---
apiVersion: v1
kind: Service
metadata:
name: openvpn-as
spec:
externalIPs:
- 192.168.110.200
selector:
app: openvpn-as
type: ClusterIP
ports:
- port: 1194
targetPort: 1194
protocol: UDP
name: udp
- port: 1443
targetPort: 443
protocol: TCP
name: tcp-https
- port: 943
targetPort: 943
protocol: TCP
name: tcp-management
---

管理页面操作使用

通过https://服务器ip:943/admin可以访问到后台管理页面,管理员账号默认是openvpn,密码在/usr/local/openvpn_as/init.log中可以查看到。

image-20230712165953479

这里仅说明较为重要的配置项以及初始化需要操作的配置项

cluster

位于configuration选项卡,改配置可以将openvpnas部署为集群模式(多节点),但前提是需要把数据库换成mysql(所有节点连接mysql)。

image-20230712170346146

network setting

定义服务的网络配置,位于configuration选项卡。

首先是Hostname or IP Address,这个配置会直接影响生成的所有客户端证书文件里面的地址(IP),但改地址并非一定是访问地址(不影响管理页面访问),相当于只是生成的证书里面的客户端连接地址

image-20230712170632126

protocal主要是定义监听方式,tcp和udp选用一种就行(默认是两种都启用),但生产环境建议使用TCP连接

image-20230712170729820

vpn settings

位于configuration选项卡,这里面的Routing项中有一个是部署后必配置的配置项:**Specify the private subnets to which all clients should be given access (one per line)**。

改配置定义了客户端可以访问到的私网网段,例如一般公司内网所有网站为192.168.x.x,如果不在这里填上该网段,将无法访问到,这里填写规则为一行一个网段 ip/掩码。

image-20230712171140787

user permissions

用户管理,位于user management。默认用户除了使用客户端登录以外无任何权限,这里需要注意的是openvpn默认是支持自动登录的(通过证书),但as的安全性要求更高,默认不支持自动登录(Allow Auto-login),每次登录都需要用户输入其密码,如需要自动登录,需要额外在这里做配置允许。

image-20230712171603920

user profiles

用户证书管理,位于user management。username下面列出所有当前用户,右边有三个选项:new token url、new profile、all profiles。

image-20230713105825156

new token url是添加临时token,需要设置一个过期时间,然后点击添加会生成一个url,在客户端使用该url就可以认证登录。(有过期时间,适合临时使用)

1
2
3
注意点:
1.生成的token直接在浏览器访问就会提示打开openvpn客户端,然后就会导入证书登录认证。
2.该功能在2.11暂时存在bug,无法使用,导入到客户端会失败。

image-20230713105948431

new profile就是添加一个用户证书(autologin默认不能添加,除非该用户有autologin权限,拥有autologin证书可以免密自动登录)

image-20230713110056830

all profiles是显示所有证书(不包括token),通过手动生成的证书以及通过账号密码登录生成的证书都会在这里显示。

ldap

位于authentication选项卡,主要作用将ldap用户源接入进openvpn中,实现用ldap账号连接登录openvpn。

首先需要在LDAP Settings中Enable LDAP authentication选择为Yes启用ldap认证。

然后是LDAP SERVER的配置

1
2
3
4
5
6
Primary server:  serverIP(url):port
Bind DN: ldap管理员的DN地址
password: ldap管理员密码
Base DN for User Entries: 用户所在DN地址
Username Attribute: 用户名字段
LDAP filter: 用户过滤规则,例如这里的:&(objectClass=posixAccount)(ou=openvpn) 表示只允许字段为objectClass=posixAccount并且ou=openvpn的用户登录。

image-20230713094718159

备注:在配置完ldap之后,需要ldap用户至少登录过一次才能在用户管理中看到该用户的信息

db convert

位于tools的db convert,可以将默认的sqlite数据库转换为mysql数据库,只需要输入数据库ip端口以及账号密码即可。输入以后点击convert db就转换成功了,此时会在数据库生成以下几个数据库(如果原本存在会覆盖数据)。

image-20230713104927182

然后页面会弹出以下弹框提示需要重启服务,点击重启。

image-20230713095655347

重启之后在db convert设置里面会看到已经使用mysql作为数据库。

image-20230713105444672

连接使用

直接访问https://ip:943进入openvpnas的web页面(非管理页面/admin),登录以后下载对应客户端。

image-20230713133330898

下载安装以后直接可以看到一个自己账号的连接,点击连接会弹出登录输入密码,输入后即可成功连接使用。

image-20230713133456304

image-20230713133503888

image-20230713133534838