在Linux环境中搭建的l2tp协议vpn服务,日志文件并没有像nginx一样有指定的日志格式写到指定的文件当中,而是统统写到了系统日志messages里,这样一来我们想查询一些记录或者做一些日志审计就非常的麻烦,那么我们可以通过ppp的控制来做自定义的日志

其实简单的来说就是写两个脚本,一个是/etc/ppp/ip-up,另一个是/etc/ppp/ip-down

  • /etc/ppp/ip-up:当连接vpn服务的时候触发执行
  • /etc/ppp/ip-down:当断开连接vpn服务的时候触发执行

当然,这两个文件都各自定义了一些内置的变量从而大大的方便了我们进行使用,两个文件中定义的内置变量都大为相同,不过ip-down所定义的比ip-up的多了几个,下面进行详细一点的说明

  • $1:连接到服务器的虚拟网卡口名称
  • $4:连接到服务器的网关地址
  • $5:分配给客户端的IP地址
  • $6:客户端的源IP地址(好像不行,不知道是不是我自己的问题,反正这个变量输出为空)
  • $PEERNAME:连接时所使用的认证用户名
  • $CONNECT_TIME:关闭连接后统计总共的连接时间,以秒为单位
  • $BYTES_SENT:关闭连接后统计总共发送的字节数,以字节为单位
  • $BYTES_RCVD:关闭连接后统计总共接收的字节数,以字节为单位

了解上面的内置变量后,那么我们就可以开始自定义我们的日志输出脚本了,我们直接在ip-up文件和ip-down文件中添加即可

vim /etc/ppp/ip-up
#获取客户源IP地址
a1=`date +"%h"`
a2=`date +"%H:%M"`
sip=`grep "$a1" /var/log/messages | grep "$a2" | grep "xl2tpd" | grep "Connection established to" | awk '{print $9}' | awk -F, '{print $1}'`

#获取当前时间
time=`date +"%Y-%m-%d %H:%M:%S"`

#将信息写入到日志文件中
echo "------------Login------------" >> /var/log/pptpd.log
echo "Time: $time" >> /var/log/pptpd.log
echo "SourceIP: $sip" >> /var/log/pptpd.log
echo "User: $PEERNAME" >> /var/log/pptpd.log
echo "Device: $1" >> /var/log/pptpd.log
echo "ServerIP: $4" >> /var/log/pptpd.log
echo "ClientIP: $5" >> /var/log/pptpd.log
echo "ServerArea: HK" >> /var/log/pptpd.log

#将信息写入到数据库中
/usr/bin/mysql -h127.0.0.1 -uvpn -p'123456' -e "INSERT INTO vpn.conn_log(Time,SourceIP,User,Device,ServerIP,ClientIP,ServerArea) VALUES ('$time','$sip','$PEERNAME','$1','$4','$5','HK');"

vim /etc/ppp/ip-down
#获取客户源IP地址
a1=`date +"%h"`
a2=`date +"%H:%M"`
sip=`grep "$a1" /var/log/messages | grep "$a2" | grep "xl2tpd" | grep "control_finish: Connection closed" | awk '{print $10}' | awk -F, '{print $1}' | head -n 1`

#计算总传输字节数
bs=`expr $BYTES_SENT + $BYTES_RCVD`
#计算平均每秒传输字节数
as=`expr $bs / $CONNECT_TIME`

#获取开始连接的时间
st=`date -d "-$CONNECT_TIME second" +"%Y-%m-%d %H:%M:%S"`
#获取断开连接的时间
pt=`date +"%Y-%m-%d %H:%M:%S"`

#获取uuid值
uuid=`/usr/bin/mysql -h127.0.0.1 -uvpn -p'123456' -e "SELECT UUID FROM vpn.conn_log WHERE Time='$st';" | grep "\|" | tail -n 1`

#将信息写入到日志文件中
echo "------------Logout------------" >> /var/log/pptpd.log
echo "UUID: $uuid" >> /var/log/pptpd.log
echo "StartTime: $st" >> /var/log/pptpd.log
echo "StopTime: $pt" >> /var/log/pptpd.log
echo "SourceIP: $sip" >> /var/log/pptpd.log
echo "User: $PEERNAME" >> /var/log/pptpd.log
echo "Device: $1" >> /var/log/pptpd.log
echo "ServerIP: $4" >> /var/log/pptpd.log
echo "ClientIP: $5" >> /var/log/pptpd.log
echo "ConnectTime: $CONNECT_TIME" >> /var/log/pptpd.log
echo "BbytesSum: $bs" >> /var/log/pptpd.log
echo "AverageSpeed: $as" >> /var/log/pptpd.log
echo "BytesSend: $BYTES_SENT" >> /var/log/pptpd.log
echo "BytesRcvd: $BYTES_RCVD" >> /var/log/pptpd.log
echo "ServerArea: HK" >> /var/log/pptpd.log

#将信息写入到数据库中
/usr/bin/mysql -h127.0.0.1 -uvpn -p'123456' -e "INSERT INTO vpn.cloes_log(UUID,StartTime,StopTime,SourceIP,User,Device,ServerIP,ClientIP,ConnectTime,BbytesSum,AverageSpeed,BytesSent,BytesRcvd,ServerArea) VALUES ($uuid,'$st','$pt','$sip','$PEERNAME','$1','$4','$5','$CONNECT_TIME','$bs','$as','$BYTES_SENT','$BYTES_RCVD','HK');"

这里编写的不仅输出到了文件中,同时还输出到了数据库里,当然各位可以根据自己的需求而定

最后修改:2019 年 10 月 28 日
-