ocserv服务搭建、AnyConnect下载
服务端:
ocserver安装:
yum install ocserv -y
配置:主要修改以下几项。
vim /etc/ocserv/ocserv.conf # 登陆方式,账号密码方式 auth = "plain[/etc/ocserv/ocpasswd]" # 监听地址 listen-host = 0.0.0.0 # vpn的网段,不要跟连接的网段冲突,如:10.2.0.0/16 ipv4-network = 192.168.2.0/24 # 不设置要不然连不上网 dns = 114.114.114.114
设置用户名密码:
ocpasswd -c /etc/ocserv/ocpasswd user123
开启路由转发:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
添加iptables规则:网段是vpn网段。
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
开机自动添加iptables:
chmod +x /etc/rc.d/rc.local echo "iptables-restore < /root/iptables" >> /etc/rc.d/rc.local
启动服务:
systemctl enable --now ocserv.service
常见配置项:一般不用设置
# 登陆方式,目前先用密码登录 auth = "plain[/etc/ocserv/ocpasswd]" # 允许同时连接的客户端数量 max-clients = 400 # 限制同一客户端的并行登陆数量 max-same-clients = 0 # 服务监听的IP(服务器IP,可不设置) listen-host = 1.2.3.4 # 服务监听的TCP/UDP端口(选择你喜欢的数字) tcp-port = 443 udp-port = 443 # 自动优化VPN的网络性能 try-mtu-discovery = true # 确保服务器正确读取用户证书(后面会用到用户证书) cert-user-oid = 2.5.4.3 # 服务器证书与密钥存放位置 server-cert = /etc/ssl/selfsigned/certs/server-cert.pem server-key = /etc/ssl/selfsigned/private/server-key.pem # 客户端连上后使用的dns dns = 8.8.8.8 dns = 8.8.4.4 # 这里的路由不路由指的是服务端的网段,并非控制客户端的流量, # 因为客户端所有的流量都走ocserv,除非在客户端配置路由。 # route = 192.168.1.0/255.255.255.0 # no-route = 192.168.5.0/255.255.255.0 # 启用cisco客户端兼容性支持 cisco-client-compat = true
管理命令:
查看服务状态:
occtl -n show status
查看在线用户:
occtl -n show users
剔除当前用户:
occtl disconnect user username occtl disconnect id userid
用户管理:
创建用户:
ocpasswd -c /etc/ocserv/ocpasswd username
添加用户到组:
ocpasswd -c /etc/ocserv/ocpasswd -g groupname username
锁定用户:
ocpasswd -c /etc/ocserv/ocpasswd -l username
解锁用户:
ocpasswd -c /etc/ocserv/ocpasswd -u username
删除用户:
ocpasswd -c /etc/ocserv/ocpasswd -d username
更多命令:
occtl --help
occtl disconnect user [NAME]断开指定用户
occtl disconnect id [ID]断开指定ID的用户
occtl unban ip [IP]解禁IP
occtl reload重载配置
occtl show status显示服务器状态
occtl show users显示在线用户
occtl show ip bans显示禁用IP
occtl show ip ban pointsPrints all the known IP addresses which have points
occtl show iroutes显示路由信息
occtl show sessions all显示sessions信息
occtl show sessions valid显示重连的会话信息
occtl show session [SID]Prints information on the specified session
occtl show user [NAME]显示指定用户信息
occtl show id [ID]显示指定用户ID的信息
occtl show events显示关联用户信息
occtl stop now停止服务
windows客户端:
AnyConnect下载地址:这是ocserver的windows客户端
https://www.catpaws2011.com/download/anyconnect/anyconnect-win-4.10.03104.zip https://olemiss.edu/helpdesk/vpn/_files/anyconnect-win-4.10.00093-core-vpn-predeploy-k9.msi
客户端设置中 设置图标->Preferences->Block connections to untrusted servers(去掉勾选)。
连接时因为证书不受信任直接点"Connect Anyway"。
Linux客户端:
yum install openconnect -y openconnect <vpn_server_address>
非必要配置:
记录用户连接和断开的日志信息:
vim /etc/ocserv/ocserv.conf # 修改下面的配置 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.1
记录日志脚本:
创建脚本:
touch /etc/ocserv/connect-script
内容如下:
#!/bin/bash export LOGFILE=/etc/ocserv/login.log #echo $USERNAME : $REASON : $DEVICE case "$REASON" in connect) echo `date` $USERNAME "connected" >> $LOGFILE echo `date` $REASON $USERNAME $DEVICE $IP_LOCAL $IP_REMOTE $IP_REAL >> $LOGFILE ;; disconnect) echo `date` $USERNAME "disconnected" >> $LOGFILE ;; esac exit 0
添加权限:
chmod +x /etc/ocserv/connect-script
监控ocserv的脚本:
#!/bin/bash #--------------------------------- # 监控日志脚本 #--------------------------------- export SITENAME=`hostname` # 名称,用于区分报警名称 export LOGFILE='/etc/ocserv/login.log' # 要监控的日志 export SHELLLOG="/home/bin/monitor.log" # 脚本运行日志 export BEFORELINENUM=`sed -n '$=' $LOGFILE` # 开始读取的行 export SECONDSPAN=10 # 每次循环间隔的时间,秒 export T1=`date '+%Y-%m-%d %H:%M:%S'` # 时间 export MONITOR_STRING='connect' # 要监控的字符串 export ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # dingding的token export FEISHU_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxx-xxxx-xxxx-xxxx-xxxxxx function snedmsg { CONTENT=$1 curl "https://oapi.dingtalk.com/robot/send?access_token=$ACCESS_TOKEN" \ -H 'Content-Type: application/json' \ -d "{\"msgtype\": \"text\",\"text\": {\"content\": \"${CONTENT}\" }}" echo -e } send_message() { local message="$1" curl -s "$FEISHU_WEBHOOK" \ -H "Content-Type: application/json" \ -d '{ "msg_type": "text", "content": { "text": "'"$message"'" } }' } echo "$T1 $SITENAME 开始监听 $LOGFILE, $BEFORELINENUM" >> $SHELLLOG while true do afterlinenum=`sed -n '$=' $LOGFILE` #当日志文件清空时重置起始点,通常日志会换天写文件 if [ $afterlinenum -lt $BEFORELINENUM ];then BEFORELINENUM=0 fi line=$(( $afterlinenum - $BEFORELINENUM )) #echo " line:"$line >> $SHELLLOG BEFORELINENUM=$afterlinenum content=`tail -n $line $LOGFILE | grep -A 20 $MONITOR_STRING` if [ -n "$content" ]; then T1=`date '+%Y-%m-%d %H:%M:%S'` IP=`hostname -I | awk '{print $1}'` msg="Time: $T1\nHostname: $SITENAME\nNumber: $line\nIP: $IP\nContent: $content" echo -e $msg >> $SHELLLOG echo -e "匹配到相应的字符串,准备发送告警" >> $SHELLLOG send_message "$msg" echo "发送完成..." >> $SHELLLOG fi sleep $SECONDSPAN done echo "程序退出." >> $SHELLLOG exit
参考地址:
https://beyondkmp.com/post/centos7-ocser-config/