使用NKE更改数据包接口

时间:2016-07-01 06:23:16

标签: macos sockets kernel kernel-extension

我正在开发一个VPN应用程序,我正在寻找从默认的en0接口路由应用程序特定的数据包。我想知道我能用NKE实现这个吗?

假设来自Safari的所有数据都通过ppp0界面,Chrome中的所有数据都通过en0。

1 个答案:

答案 0 :(得分:2)

我不能给你一个100%明确的答案,因为我以前从未解决过这个特定的问题,而且似乎没有记录在任何地方。我可以指出一些事情,如果我的任务是实现这样的功能,那么我将把重点放在我的研究上。

  • 自WWDC 2017起,网络内核扩展已弃用。 Apple希望您创建用户空间“Network Extensions”。您可以实现特殊的VPN类。从理论上讲,这些允许每个应用程序规则(see "Per-App VPN"),但实际上它们似乎与MDM绑定,这似乎是一个奇怪的决定。如果与您尝试的内容发生冲突,您可能希望与Apple取得联系以了解更改内容。他们正在积极征求网络扩展API的意见。
  • 网络内核扩展(NKE)是更成熟的API。路由发生在“IP过滤器”和“接口过滤器”阶段之间。我不确定你是否可以通过这些过滤阶段直接影响他们。也许通过使用默认接口上的接口过滤器删除数据包,并将它们注入到VPN接口中?我不确定这是否明智,并且您可能无法将数据包与在网络堆栈的该阶段发送它们的进程匹配。
  • 您可以尝试从套接字过滤器NKE将套接字绑定到特定的接口设备(使用IP_BOUND_IF)。
  • 伯克利数据包过滤器(BPF)也是一种可能的解决方案。