ocserv 是一个 OpenConnect SSL VPN 协议服务端,0.3.0 版后兼容使用 AnyConnect SSL VPN 协议的终端。官方主页/ocserv/。ocserv 已经在 epel 仓库中提供了,所以可以直接通过 yum 安装
安装 ocserv
$ yum install epel-release
$ yum install ocserv
生成证书
官方文档,具体步骤如下
-
创建工作文件夹
$ mkdir anyconnect $ cd anyconnect
-
生成ca证书
$ certtool --generate-privkey --outfile $ cat > <<EOF cn = "CA" organization = "Big Corp" serial = 1 expiration_days = 3650 ca signing_key cert_signing_key crl_signing_key EOF $ certtool --generate-self-signed --load-privkey \ --template --outfile $ cp /etc/pki/ocserv/cacerts
-
生成服务器证书
$ certtool --generate-privkey --outfile $ cat > <<EOF cn = "" organization = "Beyondkmp" serial = 2 expiration_days = 3650 encryption_key signing_key tls_www_server EOF $ certtool --generate-certificate --load-privkey \ --load-ca-certificate --load-ca-privkey \ --template --outfile $ cp /etc/pki/ocserv/public/ $ cp /etc/pki/ocserv/private/
-
生成本地服务器证书(如果不用证书登录,此步骤可以不做)
创建 ,并将下面内容复制进去
#!/bin/bash USER=$1 CA_DIR=$2 SERIAL=`date +%s` certtool --generate-privkey --outfile $ cat << _EOF_ > cn = "$USER" unit = "users" serial = "$SERIAL" expiration_days = 9999 signing_key tls_www_client _EOF_ certtool --generate-certificate --load-privkey $ --load-ca-certificate $CA_DIR/ --load-ca-privkey $CA_DIR/ --template --outfile $ openssl pkcs12 -export -inkey $ -in $ -name "$USER VPN Client Cert" -certfile $CA_DIR/ -out $USER.p12
创建用户文件夹并调用 生成证书
$ mkdir user $ cd user # user 指的是用户名,.. 指的是 ca 证书所在的目录 $ ../ user .. # 按提示设置证书使用密码,或直接回车不设密码
最后,通过 http 服务器或其他方式将 user.p12 传输给客户端导入即可
ocserv配置
-
配置 ocserv, 配置文件/etc/ocserv/
#ocserv支持多种认证方式,这是自带的密码认证,使用ocpasswd创建密码文件 #ocserv还支持证书认证,可以通过Pluggable Authentication Modules (PAM)使用radius等认证方式 auth = "plain[passwd=/etc/ocserv/ocpasswd]" #指定替代的登录方式,这里使用证书登录作为第二种登录方式 enable-auth = "certificate" #证书路径 server-cert = /etc/ocserv/ server-key = /etc/ocserv/ #ca路径 ca-cert = /etc/ocserv/ #从证书中提取用户名的方式,这里提取的是证书中的 CN 字段作为用户名 cert-user-oid = 2.5.4.3 #最大用户数量 max-clients = 16 #同一个用户最多同时登陆数 max-same-clients = 10 #tcp和udp端口 tcp-port = 4433 udp-port = 4433 #运行用户和组 run-as-user = ocserv run-as-group = ocserv #虚拟设备名称 device = vpns #分配给VPN客户端的IP段 ipv4-network = 10.12.0.0 ipv4-netmask = 255.255.255.0 #DNS dns = 114.114.114.114 dns = 8.8.8.8 #压缩,提高效率 compression = true no-compression-limit = 256 #注释掉route的字段,这样表示所有流量都通过 VPN # route配置表示这个网段会经过vpn,这个网段一般是客户的内网网段 route = 192.168.1.0/255.255.255.0 #route = 192.168.5.0/255.255.255.0
-
建立用户
#username为你要添加的用户名 $ sudo ocpasswd -c /etc/ocserv/ocpasswd username
-
系统配置
- 开启内核转发
$ echo "net.ipv4.ip_forward = 1" >> /etc/ $ sysctl -p /etc/
-
配置防火墙规则
#使用firewalled firewall-cmd --permanent --add-port=4433/tcp firewall-cmd --permanent --add-port=4433/udp # Allow firewall to forward firewall-cmd --permanent --add-masquerade firewall-cmd --reload # 使用iptables,vpnnetwork为配置中的内网网址,此配置为10.12.0.0/24,eth为公网ip iptables -I INPUT -p tcp --dport 4433 -j ACCEPT iptables -I INPUT -p udp --dport 4433 -j ACCEPT iptables -I FORWARD -s ${vpnnetwork} -j ACCEPT iptables -I FORWARD -d ${vpnnetwork} -j ACCEPT iptables -t nat -A POSTROUTING -s ${vpnnetwork} -o ${eth} -j MASQUERADE #iptables -t nat -A POSTROUTING -j MASQUERADE service iptables save
- 开启内核转发
日志输出
-
修改systemctl的标准输出与错误输出
vim /usr/lib/systemd/system/ ExecStart=/usr/sbin/ocserv --pid-file /var/run/ --config /etc/ocserv/ -f #修改为 ExecStart=/bin/sh -c '/usr/sbin/ocserv --pid-file /var/run/ --config /etc/ocserv/ -f >> /var/log/ 2>&1'
-
输出用户连接和断开的日志信息
vim /etc/ocserv/ # 修改下面的配置 connect-script = /etc/ocserv/connect-script disconnect-script = /etc/ocserv/connect-script cert-user-oid = 2.5.4.3 cert-group-oid = 2.5.4.11 vim /etc/ocserv/connect-script # 输入下面内容,可以自己定制 #!/bin/sh #echo $USERNAME : $REASON : $DEVICE case "$REASON" in connect) echo `date` $USERNAME "connected" echo `date` $REASON $USERNAME $DEVICE $IP_LOCAL $IP_REMOTE $IP_REAL ;; disconnect) echo `date` $USERNAME "disconnected" ;; esac exit 0
radius cli配置
-
Radcli installation,目前yum 安装ocserv时会自动安装radcli
-
radcli configuration (No TLS)
vim /etc/radcli/ # 修改下面配置 nas-identifier fw01 authserver 192.168.5.5 acctserver 192.168.5.5 servers /etc/radcli/servers dictionary /etc/radcli/dictionary default_realm radius_timeout 10 radius_retries 3 bindaddr *
配置servers的密码
vim servers # 根据radius server的配置来设置servers的密码 192.168.5.5 radiustestsecretpassword #Save and exit
-
Security considerations and radcli configuration with TLS
如果安全考虑,使用 和 servers-tls这两个配置设置tls.
-
修改ocserv的认证方式
vim /etc/ocserv/ #auth = "pam" #auth = "pam[gid-min=1000]" #auth = "plain[passwd=./]" #auth = "certificate" #auth = "radius[config=/etc/radcli/,groupconfig=true]" #Add a line as follows: auth = "radius [config=/etc/radcli/,groupconfig=true]" #If you need RADIUS accounting, add a line in the "Accounting methods available" Section: acct = "radius [config=/etc/radcli/,groupconfig=true]"
常用命令
简单用户操作
-
添加用户
ocpasswd -c /etc/ocserv/ocpasswd 【用户名】
-
添加用户至某个分组
ocpasswd -c /etc/ocserv/ocpasswd -g 【分组名称】 【用户名】
-
锁定用户
ocpasswd -c /etc/ocserv/ocpasswd -l 【用户名】
-
解锁用户
ocpasswd -c /etc/ocserv/ocpasswd -u 【用户名】
-
删除用户
ocpasswd -c /etc/ocserv/ocpasswd -d 【用户名】
查看当前状态:
-
查看当前服务运行状态
occtl -n show status
-
查看当前在线用户详情:
occtl -n show users
-
踢掉当前在线用户:
- 通过用户名:
occtl disconnect user 【用户名】
-
通过id
occtl disconnect id 【id号】
- 通过用户名: