log de tráfego PPTP

1

Estou executando o pptpd em uma máquina Centos 5, mas não configurei nenhum registro.

Em caso de abuso, preciso determinar quais dos meus usuários fizeram as coisas ruins, o que significa que preciso registrar todo o tráfego. Eu posso ter até 20 usuários que usarão a conexão VPN pelo menos 3 horas por dia.

O tcpdump é uma solução?

    
por jon 04.06.2011 / 05:05

2 respostas

1

Eu não tenho experiência com pptpd, mas tenho pptp rodando em uma máquina CentOS que atua como um cliente conectando-se a um roteador DrayTek.

Então, eu imagino que, para cada usuário conectado, haverá uma interface de rede ppp correspondente criada no servidor para atender esse usuário. Você pode configurar algumas regras do iptables que registram todos os pacotes dessas interfaces ppp. A última coisa que você precisa correlacionar (log) do pptpd é quando os usuários específicos receberam endereços IP específicos. Isso permitiria que você registrasse o tráfego e o vinculasse ao usuário da VPN correspondente (ainda mais fácil se você forçar a atribuição de um IP estático aos usuários da VPN).

Você precisaria ter certeza de aplicar as regras de registro em cada direção, na cadeia FORWARD mais provável (para registrar o tráfego destinado a outros hosts na rede VPN, que é roteado pelo servidor VPN). Adicione cadeias INPUT e OUTPUT se você quiser incluir o log do próprio servidor (o + denota todas as interfaces ppp):

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

E, obviamente, você pode adaptar as regras acima do iptables para serem mais específicas do protocolo, se você quiser monitorar tipos específicos de tráfego.

Usar o tcpdump para capturar PCAPs por interface seria um pesadelo para implementar. Você precisaria inventar alguma maneira radical de ter uma bifurcação do processo tcpdump e morrer para cada interface ppp criada e excluída, à medida que os usuários efetuam login e logoff. Eu não consigo pensar em uma maneira legal de fazer isso, e parece um pouco exagerado estar tentando registrar o conteúdo do pacote em cada sessão. É melhor ter mais medidas de segurança nos dispositivos aos quais eles possivelmente podem se conectar na própria rede privada.

    
por 13.03.2012 / 21:45
1

Eu tive que implementar algo semelhante, mas apenas para o nível de log da largura de banda por hora. O que eu fiz foi configurar IPs estáticos em chap-secrets para cada conexão de entrada, então adicionei algumas regras ao iptables para contar os dados.

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

Observe que essas regras são abstraídas da configuração do meu portal e podem não estar exatamente corretas.

Obviamente, alterar 10.0.0.100 para o IP da sessão PPTP do usuário. Então eu escrevi o seguinte script que é executado por um cronjob a cada minuto (nota, precisa de 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"

Depois disso eu instalei o MySQL e criei a seguinte tabela:

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
    
por 28.03.2012 / 01:53