Objective-C: 如何在OSX中检查防火墙状态?

6

我的Objective-C应用需要知道OSX防火墙是否正在运行,以便告诉用户关闭它或创建新规则。

此外,我的应用程序是否可以直接创建规则,使用户永远不需要处理网络问题?

约翰


如果防火墙在路由器上怎么办?你的用户只能自己处理防火墙。 - Black Frog
2个回答

5

我正在编写一个函数,可以提供您OSX防火墙的状态 :)

-(BOOL)getFirewallStatus{


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSSystemDomainMask, YES);

    NSString *path = [paths objectAtIndex:0];

    path = [NSString stringWithFormat:@"%@/%@",path,@"Preferences/com.apple.alf.plist"];

    path = [path stringByReplacingOccurrencesOfString:@"/System"
                                           withString:@""];




    NSDictionary* _dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:path];


    // firewall status
    int status = [[_dictionary valueForKey:@"globalstate"] integerValue];

    if (status == 0)
    {
        return NO;
    }

    return  YES;
}

仍然适用于2022年的Monterey操作系统。 - spartygw

1

如果用户运行您的应用程序(即在查找器中双击),则您的应用程序尝试创建套接字侦听器将提示用户允许/拒绝该侦听器,并相应地调整防火墙设置 - 您的应用程序不需要进行任何编程干预。

如果涉及的防火墙是您的路由器(最近我处理过的一个问题),您有几个选项。 最好支持的选择是Bonjour / mDNSResponder(只要您不想支持双NAT的情况)。 Apple提供了一个Objective-C包装器应用程序,可以围绕相当深奥的dns_sd.h:

http://developer.apple.com/library/mac/#samplecode/PortMapper/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007879-Intro-DontLinkElementID_2

如果你想选择第三方路线,可以看看 TCM Port Mapper。它使用了一些已弃用的功能,如果你需要 ARC 支持的话,可能需要花费一些努力才能使其运行。

http://code.google.com/p/tcmportmapper/

两者都支持UPnP和NAT-PMP。

最后,如果您的应用程序作为守护进程运行(没有用户界面),那么您将不得不熟悉ipfw。做好准备。在Google上搜索“ipfw os x”。StackOverflow阻止我发布超过两个链接。太棒了。

希望这可以帮助到您....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接