我在Centos 5机器上运行pptpd,但是我没有设置任何日志logging。
在滥用的情况下,我需要确定哪些用户做了坏事,这意味着我需要logging所有的stream量。 我最多可以有20个用户每天至less使用3个小时的VPN连接。
是tcpdump的解决scheme?
我没有使用pptpd的经验,但是我有一个在CentOS机器上运行的pptp,它作为一个客户端连接到一个DrayTek路由器。
所以,我想可以想象,对于每个连接的用户,将在服务器上创build相应的pppnetworking接口来为该用户提供服务。 你可以设置一些iptables规则来logging来自这些ppp接口的所有数据包。 你必须从pptpd关联(logging)的最后一件事是特定用户被分配特定IP地址的时间。 这将允许您loggingstream量并将其链接到相应的VPN用户(如果您强制VPN用户被分配静态IP,则更容易)。
您需要确保在每个方向上,在FORWARD链上最有可能应用日志logging规则(logging指向由VPN服务器路由的VPNnetworking上的其他主机的stream量)。 添加input和输出链,如果你想包括服务器本身的日志logging(+表示所有的PPP接口):
iptables -A FORWARD -i ppp+ -j LOG iptables -A FORWARD -o ppp+ -j LOG
显然,如果您希望监视特定types的stream量,则可以将上述iptables规则定制为更具体的协议。
使用tcpdump以每个接口为基础捕获PCAP将被certificate是一个恶梦。 当用户login和注销时,您将需要发明一些激进的方法,让每个创build和删除的ppp接口都有一个tcpdump进程fork和die。 我想不出一个很好的方法来做到这一点,无论如何,试图logging每个会话的数据包内容似乎有点矫枉过正。 更好的是在他们可能连接到私有networking上的设备上采取进一步的安全措施。
我不得不实现类似的东西,但只能达到每小时logging带宽的水平。 我所做的就是在每个传入连接的chap-secrets中设置静态IP,然后向iptables添加一些规则来计算数据。
iptables -N vpn2fw iptables -N fw2vpn iptables -A INPUT -i ppp+ -j vpn2fw iptables -A OUTPUT -o ppp+ -j fw2vpn iptables -A vpn2fw -s 10.0.0.100/32 iptables -A fw2vpn -d 10.0.0.100/32
请注意,这些规则是从我的shorewallconfiguration中抽象出来的,可能并不完全正确。
很明显,将10.0.0.100更改为用户的PPTP会话的IP。 然后我每分钟写下一个由cronjob运行的脚本(注意,需要gawk):
#!/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin function getUsage { local PARSE="" while [ $# -ne 0 ]; do PARSE="$PARSE$(iptables -nvx -L $1 && iptables -Z $1)" shift; done echo "$PARSE" | gawk ' { if ($7 ~ /10\.0\.0\.1\d*/) user=$7 else if ($8 ~ /10\.0\.0\.1\d*/) user=$8 else next; out[user] += $2 } END { for(user in out) printf("%s %d\n", user, out[user]); }' } function getUser { cat /etc/ppp/chap-secrets | awk '{if ($4 == "'$1'") print $1}' } function logUsage { local DATE="$1" local TYPE="$2" local DATA="$3" local IFS=$'\n' if [ "$TYPE" == "RX" ]; then local QUERY="INSERT INTO vpn_usage (user, date, rx) VALUES ('%s', '%s', %d) ON DUPLICATE KEY UPDATE rx=rx+VALUES(rx)" else local QUERY="INSERT INTO vpn_usage (user, date, tx) VALUES ('%s', '%s', %d) ON DUPLICATE KEY UPDATE tx=tx+VALUES(tx)" fi for LINE in $DATA; do USER=$(getUser $(echo $LINE | cut -d' ' -f1)) test -z "$USER" && continue; printf "$QUERY\n" "$USER" "$DATE" "$(echo $LINE | cut -d' ' -f2)" | mysql -u root bandwidth done } DATE="$(date '+%Y-%m-%d %H:00:00')" TX="$(getUsage vpn2fw)" RX="$(getUsage fw2vpn)" logUsage "$DATE" "TX" "$TX" logUsage "$DATE" "RX" "$RX"
之后,我安装了MySQL并创build了下表:
CREATE TABLE `vpn_usage` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user` varchar(50) CHARACTER SET latin1 NOT NULL, `date` datetime NOT NULL, `rx` bigint(20) unsigned NOT NULL DEFAULT '0', `tx` bigint(20) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `user` (`user`,`date`) ) ENGINE=InnoDB AUTO_INCREMENT=190 DEFAULT CHARSET=utf8