【问题标题】:macOS Sierra: reload firewall whenever network changes [closed]macOS Sierra:每当网络发生变化时重新加载防火墙[关闭]
【发布时间】:2023-03-09 05:10:02
【问题描述】:

每当网络发生变化时,我一直在尝试重新加载 pf 规则。 这是我的 plist 文件。 /Library/LaunchAgents/com.wwk.networkchange.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.wwk.networkchange</string>
    <key>ProgramArguments</key>
    <array>
        <string>sudo /sbin/pfctl -f /Users/wwk/pf.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/private/var/run/resolv.conf</string>
    </array>
</dict>
</plist>

我可以看到 /private/var/run/resolv.conf 在更改网络接口但根本没有重新加载 pf 规则时发生了更改。 仅供参考,/Users/wwk/pf.conf 在那里,我已经通过 /etc/sudoers 文件启用了 /sbin/pfctl 无需密码提示。 提前致谢!

【问题讨论】:

    标签: networking firewall sudo macos-sierra launchctl


    【解决方案1】:

    我发现至少有两个问题。

    首先,您的ProgramArguments 需要是一个字符串数组,而不是带有空格的单个字符串。

    其次,您真的不应该为此使用sudo——只需将其设为 LaunchDaemon(以 root 身份运行)而不是 LaunchAgent(以登录用户身份运行)。因此,您的 ProgramArguments 应如下所示:

    <key>ProgramArguments</key>
    <array>
        <string>/sbin/pfctl</string>
        <string>-f</string>
        <string>/Users/wwk/pf.conf</string>
    </array>
    

    【讨论】:

    • 关于 ProgramArguments,您是对的。我已经按照您的指示安排了它们,但仍然没有运气。关于 sudo 问题,我发现即使它已注册为 sudoers,我仍然必须使用 sudo 作为前缀。
    • @Pei 您是否将其移至 /Library/LaunchDaemons(然后重新启动或使用 sudo launchctl load /Library/LaunchDaemons/com.wwk.networkchange.plist 加载它)?那应该使sudo 无关紧要。
    • 是的,我这样做了,并且做了几次 sudo launchctl load/unload 但仍然没有运气。
    【解决方案2】:

    实际上是因为我的新守护程序与 Apple 的默认 pfctl 守护程序冲突。 所以我不得不更新默认的 pfctl 守护进程 plist 来观察网络变化时改变的路径。 将以下内容添加到/System/Library/LaunchDaemons/com.apple.pfctl.plist

    <WatchPaths>
    <array>
        <string>/private/var/run/resolv.conf</string>
        <string>/etc/pf.conf</string>
        <string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string>
        <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
    </array>
    

    顺便说一句,我们必须在 macOS 恢复模式下通过$ csrutil disable 启用对系统文件的更改才能对上述 plist 文件进行更改。 (在系统文件进行必要的更改后应该$ csrutil enable

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多