Сбор статистики использования VPN - PullRequest
3 голосов
/ 19 февраля 2009

Мы отслеживаем статистику использования сетевого интерфейса с помощью NetworkInterface.GetIPv4Statistics () в .NET 2.0. Это не сообщает правильную статистику для соединений, по которым VPN-трафик туннелируется. Вместо этого - в случае клиента Cisco VPN - использование просто приписывается новому сетевому интерфейсу, который просто выглядит как соединение Ethernet.

Сама Windows (по крайней мере, Vista) правильно добавляет статистику VPN в фактический физический интерфейс, поэтому при просмотре диалогового окна «Состояние» для исходного подключения отображается правильное количество байтов. Однако результаты вызова в .NET не объединяют трафик.

Есть ли способ связать VPN-соединение с сетевым соединением, по которому оно туннелируется? В противном случае, кто-нибудь знает, какой API используется диалогом статуса для получения правильной статистики?

В настоящее время нам приходится вручную обнаруживать подключения, которые выглядят как виртуальные частные сети, и добавлять их использование в любое другое активное соединение, и это не похоже на надежное решение.

Ответы [ 3 ]

2 голосов
/ 01 марта 2009

Вот программа, написанная на Delphi (с полным источником и пояснениями), которая поможет вам собирать информацию о сети, включая данные VPN. Это использует компоненты Indy с открытым исходным кодом , которые также доступны для использования с C #.

Я бы посоветовал просмотреть исходный код, и вы найдете точные вызовы Windows API, которые он выполняет. Он использует HEAVILY API Helper IP ( IPHlpApi ).

Если вы ищете примеры только для C #, я бы предложил немного поработать с Google для "C # and IpHlpApi".

Привет

альтернативный текст http://z.about.com/d/delphi/1/0/k/2/112903_2.gif

1 голос
/ 24 февраля 2009

Мне придется проверить, когда я доберусь до работы, чтобы увидеть, как выглядит мой конфиг.

Одна вещь, которую Cisco VPN делает, если настроено, отключает разделенное туннелирование. Это означает, что вам запрещен доступ к локальной подсети при подключении к VPN.

Я могу это видеть, когда мое сетевое соединение настроено с IP-адресом, но не имеет шлюза по умолчанию.

Предполагая, что вы идентифицируете VPN-соединение, это соединение без шлюза будет вашим другим соединением.

Кроме того, вы изучили какие-либо классы WMI. Cisco VPN может взаимодействовать с классом WMI, возможно.

0 голосов
/ 20 марта 2009

Как предполагает Роб, ответ лежит в WMI. Win32_PerfFormattedData_RemoteAccess_RasPort похоже, что именно то, что использует сама Windows - числа одинаковы, байт за байтом, независимо от того, работает VPN или нет.

Я проверял с:

static class Program
{
    static void Main()
    {
        var query = new WqlEventQuery("__InstanceModificationEvent", TimeSpan.FromSeconds(1),
                                      "TargetInstance ISA 'Win32_PerfFormattedData_RemoteAccess_RasPort' AND TargetInstance.BytesReceived > 0");

        var watcher = new ManagementEventWatcher(query);
        watcher.EventArrived += EventArrived;
        watcher.Start();

        Console.ReadLine();
    }

    static void EventArrived(object sender, EventArrivedEventArgs e)
    {
        var mo = e.NewEvent["TargetInstance"] as ManagementBaseObject;
        Console.WriteLine("{0:#,0}: {1:#,0} bytes sent, {2:#,0} bytes received", mo["Name"], mo["BytesTransmitted"], mo["BytesReceived"]);
    }
}
...