Сбор статистики использования VPN
-
05-09-2019 - |
Вопрос
Мы отслеживаем статистику использования сетевого интерфейса с помощью NetworkInterface.Получите v4statistics() в .NET 2.0.Это неверная статистика для подключений, по которым туннелируется VPN-трафик.Вместо этого - в случае VPN-клиента Cisco - использование просто приписывается новому сетевому интерфейсу, который просто выглядит как подключение Ethernet.
Сама Windows (по крайней мере, Vista) корректно добавляет статистику VPN к реальному физическому интерфейсу, поэтому при просмотре диалогового окна "Статус" исходного соединения отображается правильное количество байтов.Однако результаты вызова в .NET не объединяют трафик воедино.
Есть ли способ связать VPN-соединение обратно с сетевым соединением, по которому оно туннелируется?В противном случае, знает ли кто-нибудь, какой API используется в диалоговом окне состояния для получения правильной статистики?
На данный момент нам приходится вручную обнаруживать соединения, которые выглядят как VPN, и добавлять их использование к любому другому активному соединению, и это не кажется надежным решением.
Решение 3
Как предполагает Роб, ответ кроется в 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"]);
}
}
Другие советы
Вот программа, написанная на Delphi (с полным источником и объяснением), который поможет вам собирать сетевую информацию, включая данные VPN.Это использование компоненты Indy с открытым исходным кодом, который также доступен для использования с C #.
Я бы посоветовал просмотреть исходный код, и вы найдете точные вызовы Windows API, которые он выполняет.Он в значительной степени зависит от IP Helper API (Ифлпапи).
Если вы ищете примеры только для C #, я бы посоветовал поискать в Google "C # и IpHlpApi".
С уважением
альтернативный текст http://z.about.com/d/delphi/1/0/k/2/112903_2.gif
Мне нужно будет проверить, когда я приступлю к работе, чтобы увидеть, как выглядит моя конфигурация.
Одна вещь, которую делает Cisco VPN, - это, если она настроена, отключение раздельного туннелирования.Это означает, что вам запрещен доступ к вашей локальной подсети по соединению, которое подключено к VPN.
Я могу видеть это, когда мое ethernet-соединение настроено с IP-адресом, но не имеет шлюза по умолчанию.
Предположим, что вы идентифицируете VPN-соединение, это соединение без шлюза будет вашим другим соединением.
Кроме того, заглядывали ли вы в какие-либо классы WMI?Возможно, Cisco VPN может взаимодействовать с классом WMI.