macOS Sierra: ネットワークが変更されたときにファイアウォールを再読み込みする

macOS Sierra: ネットワークが変更されたときにファイアウォールを再読み込みする

ネットワークが変更されるたびに、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 を実行できるようにしました。よろしくお願いします。

答え1

実際、これは私の新しいデーモンが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>

$ csrutil disableちなみに、上記の plist ファイルに変更を加えるには、macOS リカバリ モードでシステム ファイルの変更を有効にする必要があります。($ csrutil enableシステム ファイルに必要な変更を加えた後に行う必要があります)

関連情報