针对 OSX 调整 Cisco AnyConnect vpnagentd 修复

Jam*_*ler 5 networking vpn macos cisco-anyconnect

我正在尝试找到一种解决方案,以允许与 OSX 的 Cisco AnyConnect 客户端进行拆分隧道。我已经找到了它是如何修改防火墙的,并且可以修复。然而,问题是vpnagentd守护进程不断劫持路由表。

Sasha Pachev 为 Linux ( https://superuser.com/a/546668/568559 )提出了一个优雅的解决方案,但是我在使其适应 OSX 方面遇到了挑战。

为 Linux 编写的hack.c引用了linux/netlink.h,它在 OSX 上不存在。我认为这就是AF_NETLINK 的来源。

#include <sys/socket.h>
#include <linux/netlink.h>

int __ZN25CInterfaceRouteMonitorMac20routeCallbackHandlerEv()
{
  int fd=50;          // max fd to try
  char buf[8192];
  struct sockaddr_nl sa;
  socklen_t len = sizeof(sa);

  while (fd) {
     if (!getsockname(fd, (struct sockaddr *)&sa, &len)) {
        if (sa.nl_family == AF_NETLINK) {
           ssize_t n = recv(fd, buf, sizeof(buf), MSG_DONTWAIT);
        }
     }
     fd--;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不熟悉这种语言,所以我不知道去哪里找。我可以看到其他人在原始问题中引用了将其调整为 OSX 的参考,但我没有看到任何地方发布的结果。

有没有人有幸将这种方法应用于 OSX?非常感谢任何帮助。

一旦我让这方面工作,我很乐意分享完整的解决方案。

小智 2

(在 Sasha Pachev 出色的侦探工作找到要拦截的函数之后,我编写了该函数的扩展版本,用于排出 NETLINK 数据。我很高兴看到人们发现该代码很有用。)

从另一个线程中,我看到有人使用“nm”来发现 OSX 有一个类似的回调处理程序,并且您正在尝试创建一个合适的函数来替换它。据我了解,OSX 根本不提供 NETLINK 接口,因此 OSX 版本的 AnyConnect 不太可能像 Linux 客户端那样保持对路由表的控制。我不知道 OSX 提供什么机制来向 AnyConnect 发出路由更改已发生的信号,但由于它不是基于 NETLINK,因此此处用于耗尽 netlink 消息的代码不适用。

具有讽刺意味的是,Sasha 提供的原始存根函数样式很可能足以阻止它用自己的路由替换您的路由。该函数看起来像:

int __ZN25CInterfaceRouteMonitorMac20routeCallbackHandlerEv()
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 Linux 上,该原始函数导致 CPU 使用率较高,因为触发回调处理程序调用的 NETLINK 事件永远不会被此无所事事的代码清除。对于 OSX 客户端也可能会发生相同的效果,其中触发调用此函数的任何事件也不会被清除。但是,如果这个函数是要拦截的正确处理函数,并且您能够创建自己的库来覆盖该函数,并加载该库而不是真正的库,那么至少您将阻止它每次重置路由表是时候你尝试自己改变它了。如果您做到了这一点,牺牲一些 CPU 可能是值得的。

祝你好运!