【问题标题】:Capturing VPN usage statistics捕获 VPN 使用统计信息
【发布时间】:2010-10-08 14:54:11
【问题描述】:

我们正在使用 .NET 2.0 中的 NetworkInterface.GetIPv4Statistics() 监控网络接口的使用统计信息。这没有报告正在通过隧道传输 VPN 流量的连接的正确统计信息。相反 - 在 Cisco VPN 客户端的情况下 - 使用只是归因于一个看起来像以太网连接的新网络接口。

Windows 本身(至少是 Vista)正确地将 VPN 统计信息添加到实际物理接口,因此查看原始连接的“状态”对话框会显示正确的字节数。但是,.NET 中的调用结果不会将流量合并在一起。

有没有办法将 VPN 连接关联回它通过隧道传输的网络连接?如果做不到这一点,有谁知道状态对话框正在使用哪个 API 来检索正确的统计信息?

目前,我们不得不手动检测看起来像是 VPN 的连接,并将它们的使用添加到任何其他处于活动状态的连接中,这似乎不是一个可靠的解决方案。

【问题讨论】:

  • 您的方法似乎是正确的。我正在使用带有 2 个通过以太网运行的 Windows VPN 连接的 Vista。我遍历 NetworkInterface.GetAllNetworkInterfaces 到 GetIPv4Statistics 。以太网总量包括每个 VPN 连接的使用量。请发布 ipcongif /all 的详细信息?
  • 我们正在测试的设置的唯一区别似乎是 VPN 是基于 PPP 连接而不是以太网构建的。也许也相关的是 HTTP 流量(这是我们真正测试的全部)正在通过 VPN 后面的代理。我会看看能不能尽快收集一些更详细的信息。

标签: .net windows networking vpn cisco


【解决方案1】:

Here's a program written in Delphi(带有完整的来源和解释)将帮助您收集网络信息,包括 VPN 数据。这是使用 open-source Indy components,它也可用于 C#。

我建议您浏览源代码,您会发现它所做的确切 Windows API 调用。它严重依赖 IP Helper API (IPHlpApi)。

如果您正在寻找仅 C# 的示例,我建议您对“C# 和 IpHlpApi”进行一些谷歌搜索。

问候

alt text http://z.about.com/d/delphi/1/0/k/2/112903_2.gif

【讨论】:

  • System.Net.NetworkInformation 中的大部分内容无论如何都会包装 iphlpapi.dll,所以我不确定这是否会有所帮助。无论如何,我都会查看您链接到的 MSDN 文档,看看是否还有其他攻击途径。
  • 很公平。在我看来,我认为您将需要相当多的 P/Invoke 来实现此解决方案,并且您可能最好使用 C++/Delphi 之类的本机语言来解决此问题。但是,我会把它留给你。问候。
【解决方案2】:

我得去上班看看我的配置是什么样子的。

Cisco VPN 所做的一件事是(如果已配置)禁用拆分隧道。这意味着您无法通过连接到 VPN 的连接访问本地子网。

我可以看到的方式是,当我的以太网连接配置了 IP 地址,但没有默认网关时。

假设您确定了 VPN 连接,那么该无网关连接将是您的另一个连接。

另外,您是否查看过任何 WMI 类。 Cisco VPN 可能会与 WMI 类交互。

【讨论】:

  • 很遗憾,我仍然可以看到原始 (PPP) 连接的网关地址。我将通过 WMI 进行拖网搜索,看看那里是否有更多信息。不过,Win32_NetworkAdapter 和 Win32_NetworkAdapterConfiguration 并没有添加任何有用的东西。
【解决方案3】:

正如 Rob 所说,答案在 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"]);
    }
}

【讨论】:

  • 事实证明这并没有得到广泛的支持。我们最终使用了第三方 RAS 库。
猜你喜欢
  • 2012-11-25
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多