28
2024
11
15:36:21

ocserv 配置

记录一些ocserv容易踩坑的配置

1、证书认证

修改ocserv.conf

#只启用证书认证
auth = "certificate"

#服务器ssl证书
server-cert = /opt/certs/server_cert/ssl-cert.pem
server-key = /opt/certs/server_cert/ssl-key.pem

#CA根证书
ca-cert = /opt/certs/ca_cert/ca-cert.pem

#证书用户识别
cert-user-oid = 2.5.4.3

#证书用户组识别,这个需要注释掉,否则思科客户端证书认证不成功。openconnect客户端正常
#cert-group-oid = 2.5.4.11

#兼容思科anyconnect 客户端
cisco-client-compat = true

以上为只启用证书认证的配置,若优先用户为密码认证,备用证书认证,则

auth = "plain[passwd=/etc/ocserv/ocpasswd]"
enable-auth = "certificate"

#auth = "radius[config=/etc/ocserv/radiusclient.conf]"
#auth = "radius[config=/etc/radiusclient/radiusclient.conf,groupconfig=true]"
#auth = "radius [config=/etc/radcli/radiusclient.conf,groupconfig=false]"
#acct = "radius [config=/etc/radcli/radiusclient.conf,groupconfig=false]"
#acct = "radius [config=/etc/ocserv/radiusclient.conf]"
# Specify alternative authentication methods that are sufficient
# for authentication. That is, if set, any of the methods enabled
# will be sufficient to login.
#enable-auth = "gssapi"
#enable-auth = "gssapi[keytab=/etc/key.tab,require-local-user-map=true,tgt-freshness-time=900]"

1.2 证书生成

写了一个证书生成的脚本,将脚本保存至gen_cert文件,执行命令bash gen_cert运行

脚本默认检测当前目录下是否存在ca_cert server_cert user_cert 三个文件,不存在则创建

脚本执行后有如下提示,可根据提示选择

  • 1、生成CA根证书

  • 2、生成服务器SSL证书

  • 3、生成用户证书

  • 4、吊销用户证书

1) Generate CA Certificate	4) Revoke User Certificate
2) Generate Server Certificate	5) Quit
3) Generate User Certificate
Please enter your choice:

以下为脚本的内容 :

#!/bin/bashfunction generate_ca() {    # Generate a CA Private Key
    certtool --generate-privkey --rsa --bits 4096 --outfile ./ca_cert/ca-key.pem    # Generate a CA Certificate
    cat > ca-temp.txt <<EOF
cn = "Root CA"
organization = "vpn.test.cn"
serial = 001
expiration_days = -1
ca
signing_key  
cert_signing_key  
crl_signing_key  
EOF

    certtool --generate-self-signed --load-privkey ./ca_cert/ca-key.pem --template ca-temp.txt --outfile ./ca_cert/ca-cert.pem    rm ca-temp.txt    exit 1
}function generate_server_cert() {    read -p "Enter Domain Name: " domain_name    # Server Private Key
    certtool --generate-privkey --rsa --bits 4096  --outfile ./server_cert/$domain_name-key.pem    # Server Certificate
    echo "organization = $domain_name" > server-temp.txt    cat <<EOF >server-temp.txt
cn = $domain_name
organization = $domain_name
serial = 2
expiration_days = 360
signing_key
encryption_key 
tls_www_server
dns_name = $domain_name
EOF

    certtool --generate-certificate --hash SHA256 --load-privkey ./server_cert/$domain_name-key.pem --load-ca-certificate ./ca_cert/ca-cert.pem --load-ca-privkey ./ca_cert/ca-key.pem --template server-temp.txt --outfile ./server_cert/$domain_name-cert.pem    rm server-temp.txt    exit 1
}function generate_user_cert() {    read -p "Enter Username: " username    read -p "Enter Group: " group    # User Private Key
    certtool --generate-privkey --rsa --bits 4096 --outfile ./user_cert/$username-key.pem    # User Certificate
    echo "cn = $username" > user-temp.txt    #echo "uid = $username" >> user-temp.txt
    echo "organization = vpn.test.cn" >> user-temp.txt    echo "unit = $group" >> user-temp.txt    echo "signing_key" >> user-temp.txt    echo "tls_www_client" >> user-temp.txt
    certtool --generate-certificate --hash SHA256 --load-privkey ./user_cert/$username-key.pem --load-ca-certificate ./ca_cert/ca-cert.pem --load-ca-privkey ./ca_cert/ca-key.pem --template user-temp.txt --outfile ./user_cert/$username-cert.pem    rm user-temp.txt    # User Certificate in PKCS#12 Format
    openssl pkcs12 -export -in ./user_cert/$username-cert.pem -inkey ./user_cert/$username-key.pem -certfile ./ca_cert/ca-cert.pem -out ./user_cert/$username.p12 -name "$username User Certificate"

    #certtool --to-p12 --load-privkey ./user_cert/$username-key.pem --load-certificate ./user_cert/$username-cert.pem --pkcs-cipher 3des-pkcs12 --outfile ./user_cert/$username-ios.p12 --outder

    exit 1
}function revoke_user_cert() {    read -p "Enter Username to Revoke: " username    # Revoke Certificate
    echo "crl_next_update = 365" > revoke-temp.txt    echo "crl_number = 1" >> revoke-temp.txt
    certtool --generate-crl --hash SHA256 --load-ca-privkey ./ca_cert/ca-key.pem --load-ca-certificate ./ca_cert/ca-cert.pem --load-certificate ./user_cert/$username-cert.pem --template revoke-temp.txt --outfile crl.pem    rm revoke-temp.txt    exit 1
}dirs=("ca_cert" "server_cert" "user_cert")# 遍历目录名for dir in "${dirs[@]}"do
    # 如果目录不存在,则创建它
    if [[ ! -d $dir ]]; then
        echo "Directory $dir does not exist. Creating now..."
        mkdir $dir
        echo "Directory $dir created."
    else
        echo "Directory $dir exists."
    fidonePS3='Please enter your choice: 'options=("Generate CA Certificate" "Generate Server Certificate" "Generate User Certificate" "Revoke User Certificate" "Quit")
select opt in "${options[@]}"do
    case $opt in
        "Generate CA Certificate")
            generate_ca
            ;;        "Generate Server Certificate")
            generate_server_cert
            ;;        "Generate User Certificate")
            generate_user_cert
            ;;        "Revoke User Certificate")
            revoke_user_cert
            ;;        "Quit")            break
            ;;
        *) echo "invalid option $REPLY";;    esacdone

1.3 证书认证分组配置

⚠️ 测试发现使用openconnect 客户端正常,但使用思科anyconnect客户端无法正常登录

若需要证书认证的同时用户能够根据不同的用户组分配权限.

生成的用户证书需要配置OU属性,服务器根据OU判断用户组

同时修改ocserv.conf

#只启用证书认证auth = "certificate"#服务器ssl证书server-cert = /opt/certs/server_cert/ssl-cert.pemserver-key = /opt/certs/server_cert/ssl-key.pem#CA根证书ca-cert = /opt/certs/ca_cert/ca-cert.pem#证书用户识别cert-user-oid = 2.5.4.3#证书用户组识别,这个需要注释掉,否则思科客户端证书认证不成功cert-group-oid = 2.5.4.11#兼容思科anyconnect 客户端cisco-client-compat = trueconfig-per-group = /etc/ocserv/group/#default-group-config = /etc/ocserv/group/users#default-select-group = usersauto-select-group = true

1.3.1 用户组权限

配置三个用户组 user1 、 user2 、admin

在/etc/ocserv/group分别建立三个文件 user1 、user2 、 admin

user1:
(DNS隧道分离)

dns =223.5.5.5dns =114.114.114.114split-dns = wiki.test.cnroute = 10.0.1.0/255.255.255.0

user2:
(限制指定端口)

dns =223.5.5.5route = 10.0.0.2/255.255.255.255route = 10.0.0.1/255.255.255.255restrict-user-to-ports = "tcp(8080), tcp(445), tcp(80), udp(443), sctp(99), tcp(583), icmp(), icmpv6()"

admin:
(所有流量都走VPN)

dns=223.5.5.5

2、其它配置

2.1 记录用户登录注销日志

配置文件修改:

connect-script = /etc/ocserv/connect-script
disconnect-script = /etc/ocserv/connect-script

connect-script 文件内容

#!/bin/bashexport LOGFILE=/etc/ocserv/login.log#echo $USERNAME : $REASON : $DEVICEcase "$REASON" in
  connect)echo `date` $USERNAME "connected" >> $LOGFILEecho `date` $REASON $USERNAME $DEVICE $IP_LOCAL $IP_REMOTE $IP_REAL >> $LOGFILE
    ;;
  disconnect)echo `date` $USERNAME "disconnected" >> $LOGFILE
    ;;esacexit 0

⚠️ 一定要通过chmod +x connect-script给这个配置文件可执行权限,否则脚本无法执行同时用户登录会报错

用户登录、注销日志记录在 /etc/ocserv/login.log

2.2 启用occtl命令行工具

修改配置文件

use-occtl = true

具体的命令可执行occtl ?查看

disconnect user [NAME]	Disconnect the specified userdisconnect id [ID]	    Disconnect the specified ID
     unban ip [IP]	    Unban the specified IP
           reload       Reloads the server configuration      show status	    Prints the status and statistics of the server       show users       Prints the connected users     show ip bans  	    Prints the banned IP addresses show ip ban points	    Prints all the known IP addresses which have points     show iroutes     	Prints the routes provided by users of the server show sessions all    	Prints all the session IDs show sessions valid  	Prints all the valid for reconnection sessions show session [SID]	    Prints information on the specified session    show user [NAME]	Prints information on the specified user      show id [ID]	    Prints information on the specified ID      show events	    Provides information about connecting users
         stop now	    Terminates the server
            reset	    Resets the screen and terminal
         help or ?	    Prints this help
             exit     	Exits this application

2.3 密码登录的用户按组别划分权限

修改配置文件

auth = "plain[passwd=/etc/ocserv/ocpasswd]"
#auth = "certificate"
#auth = "radius[config=/etc/ocserv/radiusclient.conf]"
#auth = "radius[config=/etc/radiusclient/radiusclient.conf,groupconfig=true]"
#auth = "radius [config=/etc/radcli/radiusclient.conf,groupconfig=false]"
#acct = "radius [config=/etc/radcli/radiusclient.conf,groupconfig=false]"
#acct = "radius [config=/etc/ocserv/radiusclient.conf]"
#enable-auth = "certificate"
#enable-auth = "gssapi"
#enable-auth = "gssapi[keytab=/etc/key.tab,require-local-user-map=true,tgt-freshness-time=900]"

config-per-group = /etc/ocserv/group/
default-group-config = /etc/ocserv/group/users
default-select-group = users
auto-select-group = false

在用户密码保存文件/etc/ocserv/ocpasswd中配置用户组,用户组配置在用户名和密码之间,中间用:分隔.组名可以自定义,和/etc/ocserv/group/里面的文件对应即可

user1:group1:$5$124fVO/ctAyf.azb$ZR4GUQNtScnL3lPdSJqVUaAKNGb7user2:group2:$5$bINdojFGGgzv0G84$YkPB5P.fZIZnH1uWr7IjapI4A
user3:group3:$5$WHVrqmSibrwtIayE$6tM9DNm9fIfzrVYqi4.nPBBO7
user4:$5$WHVrqmSibrwtIayE$6tM9DNm9fIfzrVYqi4.nPBBO7

user4没有分配至用户组,则默认按ocserv.conf配置文件里的路由

另外划分了三个组,分别为

  • group1

  • group2

  • group3

需要分别为这三个组赋予用户可访问的网络资源
分别新建三个文件

/etc/ocserv/group/group1

/etc/ocserv/group/group2

/etc/ocserv/group/group3

group1 文件内容为:

route = 10.0.1.0/255.255.255.0
route = 10.0.0.0/255.255.255.0

则属于group1的用户可以访问10.0.0.0/24 和10.0.1.0/24的内容

group2 文件内空如下:

dns=223.5.5.5

则属于group2的用户,所有流量都会转发至ocserv服务器

group3的文件内容如下

route = 10.0.0.2/255.255.255.255
route = 10.0.0.1/255.255.255.255
restrict-user-to-ports = "tcp(8080), tcp(80), udp(53), icmp()"

则属于group3组的用户只能访问10.0.0.1、10.0.0.2两个IP的tcp8080、tcp80、udp53端口和icmp




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

以下内容需要兑换:

本文链接:https://hqyman.cn/post/8645.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: