Вход трафика PPTP

Я просто понял, что это - phpCodeBeautifier (http://www.waterproof.fr/products/phpCodeBeautifier/). В случае, если любой натыкается на это в будущем с этой той же проблемой, я просто загрузил его и скопировал файл в / мусорном ведре, и я должен был переименовать его от phpCB до phpcb.

1
задан 4 June 2011 в 06:05
2 ответа

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

1
ответ дан 3 December 2019 в 22:08

Мне пришлось реализовать нечто подобное, но только до уровня пропускной способности регистрации в час. Я установил статические 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
1
ответ дан 3 December 2019 в 22:08

Теги

Похожие вопросы