过去两天我一直未找到解决方案的答案:
可以使用C#Mono或受支持的第三方框架在3个主要平台(OSX,Windows,Linux)上通过虚拟接口创建和管理第2层隧道吗?
在高层次上,像Hamachi或Tunngle这样的应用程序将成为我想在基本级别实现的真实世界的例子。
这个问题背后的意图是,是否可以编写有效的跨平台代码,或者是否必须使用特定于平台的代码来实现虚拟接口。
答案 0 :(得分:2)
这取决于。由于L2TP实际上是使用UDP数据报完成的,因此没有理由不能在C#中实现它。但是,将它与操作系统(作为虚拟接口驱动程序等)集成或多或少是不可能的 - 我希望唯一真正的方法是使用一个小的本机包装器来调用执行大部分工作的托管代码
换句话说 - 你可以在.NET中编写Hamachi就好了。编写Hamachi网络适配器是一个棘手的部分。此外,如果您只想将L2TP功能添加到您的应用程序中,则没有问题(而不是TcpClient / UdpClient等,您只需使用自己的类与L2TP类进行通信)。但是,将其集成到IP基础结构确实需要您编写驱动程序,该驱动程序通常是仅限本机的。
可能有一些现成的解决方案具有可以调用DLL的虚拟网络适配器,但我不知道。一种非常不安全的方法也是在Socket调用上创建钩子,但是我不打算详细说明,因为这非常棘手并且总体上是一个坏主意:D
换句话说,您可以选择使用混合方法 - 为您想要支持的所有平台提供最小的本机驱动程序,让他们调用您的托管库来完成所有实际工作 - 托管库可以与平台无关(只要支持Mono:)。)。
现在,每个操作系统可能都有自己的VPN客户端,您可以从.NET中使用它。但是,这也意味着您的应用程序必须能够单独支持这些操作系统及其不同的VPN客户端 - 并且将变得棘手。
如果你想编写自己的网络接口驱动程序,在Windows上启动的一个好方法是驱动程序开发工具包,它有一些NIC驱动程序的示例源代码。 Windows使用NDI(http://en.wikipedia.org/wiki/Network_Driver_Interface_Specification),甚至在* nix系列操作系统上也有一些支持,因此可以相对容易地做到这一点 - 但不要忘记,你还在编写驱动程序。除非您在使用C / C ++ / ASM和OS内核以及驱动程序模型方面拥有丰富的经验,否则您可能不在此处。这是导致BSODs的东西:)
还有一些相关技术,如TDI(传输驱动程序接口)或WFP(Windows过滤平台),可用于在用户空间而不是内核/驱动程序空间中完成所有这些工作。但是,那些是Windows技术。你必须在你想要支持的其他操作系统上找到等价物,你必须做一些魔术才能使它在一个跨平台应用程序中运行。在完成所有这些工作的同时,您希望保持性能 - 这需要在.NET中进行非常仔细的编程(在.NET中编写可靠的代码很容易,但是获得最前沿的性能更加困难.C / C ++ / ASM恰恰相反 - 快速做事相对容易,但可靠性受损。)