最新消息:

openvpn流量控制

OpenVPN admin 4431浏览 1评论

公司的VPN服务器已经稳定运行一年多了,以前都是在系统里查看vpn连接的日志,这样查看既不方便也不明了,所以利用周末在家的时候写了两个脚本和一个php页面来管理openvpn的连接与流量信息,可即时显示流量。各位如果如有需求还可以在php中增按流量计费的功能。本文基于linux fc5环境,需要mysql 数据库的支持,表log结构如下图,文档中的图片分辩率较低,可至博客相册中的相关抓图分类中查看大图。

4259560822562806965

 

一、我的openvpn服务器端配置如下,贴出来各位参考。

port 1194

proto udp

dev tap

ca ca.crt

cert server.crt

key server.key  # This file should be kept secret

dh dh1024.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "route 192.168.8.0 255.255.255.0"

push "route 172.22.16.0 255.255.240.0"

push "route 172.22.80.0 255.255.240.0"

push "route 172.22.96.0 255.255.240.0"

client-config-dir ccd

push "dhcp-option DOMAIN xxx.com.sh"

push "dhcp-option DNS  192.168.8.1"

push "dhcp-option DNS  192.168.8.11"

push "dhcp-option WINS 192.168.8.12"

client-to-client

keepalive 10 120

tls-auth ta.key 0 # This file is secret

comp-lzo

user nobody

group nobody

persist-key

persist-tun

log /etc/openvpn/openvpn.log

log-append  openvpn.log

verb 2

mute 5

crl-verify crl.pem

client-connect ./connect.sh

client-disconnect ./disconnect.sh

 

二、客户端通过openvpn连入时执行脚本connect.sh代码如下:

#!/bin/sh

DB='openvpn'

DBADMIN='user'

PASSWD='xxxxxxx'

mysql -u $DBADMIN -p$PASSWD -e "INSERT into log (starting_time,trusted_ip,trusted_port,protocol,remote_ip,remote_netmask,common_name)values(now(),'$trusted_ip',$trusted_port,'$proto','$ifconfig_pool_remote_ip','$ifconfig_pool_netmask','$common_name')" $DB

 

三、客户端与openvpn服务器断开连接时执行脚本disconnect.sh代码如下:

#!/bin/sh

DB='openvpn'

DBADMIN='user'

PASSWD='xxxxxxx'

mysql -u$DBADMIN -p$PASSWD -e "UPDATE openvpn.log SET end_time=now(),bytes_received=$bytes_received,bytes_sent=$bytes_sent WHERE trusted_ip='$trusted_ip' and trusted_port=$trusted_port and remote_ip='$ifconfig_pool_remote_ip' and remote_netmask='$ifconfig_pool_netmask' and common_name='$common_name'" $DB

 

四、php网页用于显示数据库中的信息,代码如下:

<html>

<head>

<meta http-equiv="Content-Language" content="zh-tw">

<meta http-equiv="Content-Type" content="text/html; charset=big5">

<meta http-equiv="refresh" content="300">

<title>VPN狀態信息</title>

<style type="text/css">

<!--

.Content_style1 {

font-family: MingLiU;

font-size: 12px;

}

.Title_style2 {

font-family: MingLiU;

font-size: 15px;

font-weight: bold;

}

.style5 {color: #FF0000}

body {

margin-top: 0px;

margin-bottom: 0px;

 

-->

</style>

</head>

<body>

<?

function sizeformat($bytesize)

{

$i=0;

while(abs($bytesize) >= 1024)

{

$bytesize=$bytesize/1024;

$i++;

if($i==4) break;

}

 

$units = array("Bytes","KB","MB","GB","TB");

$newsize=round($bytesize,2);

return("$newsize $units[$i]");

}

$mysql_server_name="localhost";

$mysql_username    ="user";

$mysql_password    =" xxxxxxx ";

$mysql_database    ="openvpn";

 

$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password);

$sql="SELECT * FROM log  ORDER BY starting_time desc";

mysql_query("SET NAMES BIG5");

$result=mysql_db_query($mysql_database,$sql,$conn);

//$row=mysql_fetch_row($result);

//printf($row);

?>

<div align="right">

<table width="100%"  border="1" cellpadding="1" cellspacing="1">

<tr class="Title_style2" bgcolor="#808080">

<td width="12%"><div align="left"><a starting_time</a></div></td>

<td width="12%"><div align="left"><a end_time</a></div></td>

<td width="8%"><div align="left"><a trusted_ip</a></div></td>

<td width="10%"><div align="left"><a trusted_port</a></div></td>

<td width="8%"><div align="left"><a protocol</a></div></td>

<td width="11%"><div align="left"><a remote_ip</a></div></td>

<td width="11%"><div align="left"><a remote_netmask</a></div></td>

<td width="8%"><div align="left"><a common_name</a></div></td>

<td width="11%"><div align="left"><a bytes_received</a></div></td>

<td width="11%"><div align="left"><a bytes_sent</a></div></td>

</tr>

<?

while($row=mysql_fetch_row($result))

{

//print_r ($row);

?>

<tr bgcolor="#C0C0C0" class="Content_style1">

<td><?=$row[0]?></td>

<td><?=$row[1]?></td>

<td><?=$row[2]?></td>

<td><?=$row[3]?></td>

<td><?=$row[4]?></td>

<td><?=$row[5]?></td>

<td><?=$row[6]?></td>

<td><?=$row[7]?></td>

<td><?=sizeformat($row[8])?></td>

<td><?=sizeformat($row[9])?></td>

</tr>

<?

}

?>

</table>

<p align="center" class="Content_style1">本頁面每5分鐘刷新一次</p>

</div>

</body>

</html>

五、完成后显示效果如下图: 文档中的图片分辩率较低,可至博客相册中的相关抓图分类中查看大图。

4259560822562806992

转载请注明:爱开源 » openvpn流量控制

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 学习了,不知博主现在有没有这个的升级版
    红颜殆3年前 (2016-03-16)回复