【问题标题】:Detecting VPN connection in macOS (sandboxed)在 macOS 中检测 VPN 连接(沙盒)
【发布时间】:2019-07-08 22:10:46
【问题描述】:

我正在尝试从沙盒应用程序中检测 macOS 中的 VPN 连接是否处于活动状态,但很难为各种 VPN 服务找到通用解决方案。目前,我正在使用 2 种方法(见下文),但这些方法似乎对所有 VPN 服务/客户端都不可靠。

以下方法适用于 Cisco AnyConnect 客户端和我的 VPN 服务,但对于其他 VPN 客户端/服务,例如 Viscosity(可能还有其他 OpenVPN 客户端),这些方法根本不起作用。在比较 not-active-VPN-connection 和 active-VPN-connection 的值时,在 DNS 服务器或主要服务值中均未检测到任何变化。

我还应该提到,我已经看到 this post 并且认为这不是这个特定用例的好解决方案。我不想假设对于每个 VPN 服务,总是会有一个主机在 VPN 连接处于活动状态时可用。

任何指导将不胜感激。先感谢您。

1) 查看当前的 DNS 服务器(取自here

- (NSString *)getDNSAddressesCSV
{
    NSMutableArray *addresses = [NSMutableArray new];

    union res_sockaddr_union servers[NI_MAXSERV];

    int serversFound = res_9_getservers(_state, servers, NI_MAXSERV);

    char hostBuffer[NI_MAXHOST];

    for (int i = 0; i < serversFound; i ++)
    {
        union res_sockaddr_union s = servers[i];

        if (s.sin.sin_len > 0)
        {
            if (EXIT_SUCCESS == getnameinfo((struct sockaddr *)&s.sin,  // Pointer to your struct sockaddr
                                            (socklen_t)s.sin.sin_len,   // Size of this struct
                                            (char *)&hostBuffer,        // Pointer to hostname string
                                            sizeof(hostBuffer),         // Size of this string
                                            nil,                        // Pointer to service name string
                                            0,
                                            NI_NUMERICHOST))
            {          // Flags given
                [addresses addObject:[NSString stringWithUTF8String:hostBuffer]];
            }
        }
    }

    return [addresses componentsJoinedByString:@","];
}



2)从SCDynamicStore获取当前主服务(取自here

- (NSString *) getVPNService
{
    SCDynamicStoreRef dynamicStoreDomainState = SCDynamicStoreCreate(NULL,
                                                                     CFSTR("appNameGoesHere"),
                                                                     NULL,
                                                                     NULL);
    if (dynamicStoreDomainState)
    {
        NSString *netIPv4Key = [NSString stringWithFormat:@"%@/%@/%@/%@",
                                kSCDynamicStoreDomainState,
                                kSCCompNetwork,
                                kSCCompGlobal,
                                kSCEntNetIPv4];

        NSMutableDictionary *netIPv4Dictionary = (NSMutableDictionary *) CFBridgingRelease(SCDynamicStoreCopyValue(dynamicStoreDomainState, (CFStringRef)netIPv4Key));

        if (netIPv4Dictionary )
        {
            NSString *primaryService = [netIPv4Dictionary objectForKey:(NSString *)kSCDynamicStorePropNetPrimaryService];

            if (primaryService)
            {
                CFRelease(dynamicStoreDomainState);
                CFRelease((__bridge CFTypeRef)(netIPv4Key));
                return primaryService;
            }
            else
            {
                CFRelease(dynamicStoreDomainState);
                CFRelease((__bridge CFTypeRef)(netIPv4Key));
                return @"";
            }
        }

        CFRelease(dynamicStoreDomainState);
    }

    return @"";
}

【问题讨论】:

  • @GeneCode - Apple 禁止未经数据收集和存储 (developer.apple.com/app-store/review/guidelines/…) 中定义的同意收集用户和系统数据。数据收集和存储不同于观察网络配置,然后用于在应用中提供用户期望的功能。

标签: objective-c cocoa vpn


【解决方案1】:

来自 Google,请看这里:https://forums.developer.apple.com/thread/113491

Apple 工作人员表示不存在这样的公共 API。

同样来自 Google,请看这里:https://superuser.com/questions/577094/how-can-i-tell-if-os-x-is-connected-to-a-vpn-network-from-the-command-line

您可能会对最后一个 Apple Script 解决方案感兴趣

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2019-07-07
    • 2023-03-26
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多