Назад | Перейти на главную страницу

Регистрация трафика PPTP

Я запускаю pptpd на машине Centos 5, но я не настраивал ведение журнала.

В случае злоупотребления мне нужно определить, кто из моих пользователей сделал плохие вещи, то есть мне нужно регистрировать весь трафик. У меня может быть до 20 пользователей, которые будут использовать VPN-соединение не менее 3 часов в день.

Tcpdump - решение?

Пришлось реализовать нечто подобное, но только до уровня пропускной способности лога в час. Я установил статические IP-адреса в chap-secrets для каждого входящего соединения, а затем добавил некоторые правила в 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

Обратите внимание, что эти правила взяты из моей конфигурации Shorewall и могут быть неточными.

Очевидно, изменение 10.0.0.100 на IP-адрес сеанса PPTP пользователя. Затем я написал следующий скрипт, который каждую минуту запускает 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 и создал следующую таблицу:

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

У меня нет опыта работы с pptpd, но у меня есть pptp, работающий на машине CentOS, которая действует как клиент, подключающийся к маршрутизатору DrayTek.

Итак, я бы предположил, что для каждого подключенного пользователя будет соответствующий сетевой интерфейс ppp, созданный на сервере для обслуживания этого пользователя. Вы можете настроить некоторые правила iptables, которые регистрируют все пакеты с этих интерфейсов ppp. Последнее, что вам нужно сопоставить (записать) из pptpd, - это время, когда конкретным пользователям были назначены определенные IP-адреса. Это позволит вам регистрировать трафик и связывать его с соответствующим пользователем VPN (даже проще, если вы принудительно назначите пользователям VPN статический IP-адрес).

Вам необходимо убедиться, что вы применяете правила ведения журнала в каждом направлении, наиболее вероятно, в цепочке FORWARD (для записи трафика, предназначенного для других хостов в сети VPN, который маршрутизируется сервером VPN). Добавьте цепочки INPUT и OUTPUT, если вы хотите включить ведение журнала для самого сервера (+ обозначает все интерфейсы ppp):

iptables -A FORWARD -i ppp+ -j LOG
iptables -A FORWARD -o ppp+ -j LOG

И, очевидно, вы можете настроить приведенные выше правила iptables, чтобы они были более специфичными для протокола, если вы хотите отслеживать определенные типы трафика.

Использование tcpdump для захвата PCAP для каждого интерфейса оказалось бы кошмаром для реализации. Вам нужно будет изобрести радикальный способ создания и завершения процесса tcpdump для каждого интерфейса ppp, который создается и удаляется, когда пользователи входят в систему и выходят из нее. Я не могу придумать хороший способ сделать это, и в любом случае кажется излишним пытаться регистрировать содержимое пакета в каждом сеансе. Лучше иметь дополнительные меры безопасности на устройствах, к которым они могут подключаться в самой частной сети.