使用NKE更改数据包接口

Daw*_*jib 7 sockets macos kernel kernel-extension

我正在开发一个VPN应用程序,我正在寻找从默认en0界面路由应用程序特定数据包.我想知道我可以通过使用NKE实现这一目标吗?

假设来自Safari的所有数据都通过ppp0接口,Chrome中的所有数据都通过en0.

pmd*_*mdj 2

我无法给你 100% 明确的答案,因为我以前从未解决过该特定问题,而且似乎没有任何记录。我可以向您指出一些事情,如果我负责实现此类功能,那么我将重点研究这些事情。

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