So verhindern Sie, dass InternetSharing /etc/bootpd.plist überschreibt

Ich habe eine eingerichtet /etc/bootpd.plist, um mein drahtloses Netzwerk zu schützen und statisch zugewiesene IP-Adressen zu verwalten.

Leider wird InternetSharingdiese Datei beim Start von einer Plist überschrieben, deren Quelle ich nicht gefunden habe.


Wie kann ich verhindern, dass InternetSharingdiese Datei überschrieben wird?

Wo ist die Quelle dieser überschreibenden Datei /etc/bootpd.plist?

Antworten (2)

Quelle des Problems

Indem ich die von erzeugten Prozesse InternetSharing(mit Hilfe von opensnoopund Debugging von Shell-Skripten) studiere, habe ich endlich einen Weg gefunden, dieses systematische und dumme Überschreiben von zu umgehen /etc/bootpd.plist.

InternetSharingerstellt ein Minimum /etc/bootpd.plistund erzeugt dann 2 Prozesse:

/usr/libexec/bootpd
/usr/libexec/natpmpd

Lösung

Ich habe den ursprünglichen bootpd durch ein einfaches Shell-Skript ersetzt, das dafür zuständig ist, meine Quelle von /etc/bootpd.plistan Ort und Stelle zu setzen, bevor der ursprüngliche bootpdCode ausgelöst wird. Natürlich müssen die meisten dieser Befehle als root.

/usr/bin/sudo -s    
cd /usr/libexec

# make a backup copy of the original binary bootpd
mv bootpd bootpd.orig

# create the shell script which will first install the wanted
# bootpd.plist and then fire the original bootpd with the
# correctly quoted original list of arguments "$@"
cat >bootpd <<eof
#!/bin/sh
cp /etc/bootpd.plist.src /etc/bootpd.plist
exec /usr/libexec/bootpd.orig "$@"
eof

# make this shell script executable
chmod 755 bootpd

cd /etc

# create the "source" bootpd.plist.src which will be copied every
# time by the above shell script and will cancel the copy made by
# "InternetSharing"
cat >bootpd.plist.src <<eof
<?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>allow</key>
    <array>
            <string>00:00:00:00:00:00</string>
            <string>...
    </array>
    <key>deny</key>
    <array>
            <string>...
    </array>
    <key>Subnets</key>
    <array>
            <dict>
                    <key>_creator</key>
                    <string>dan</string>
                    <key>allocate</key>
                    <true/>
                    <key>dhcp_router</key>
                    <string>10.0.2.1</string>
                    <key>lease_max</key>
                    <integer>86400</integer>
                    <key>lease_min</key>
                    <integer>86400</integer>
                    <key>name</key>
                    <string>10.0.2/24</string>
                    <key>net_address</key>
                    <string>10.0.2.0</string>
                    <key>net_mask</key>
                    <string>255.255.255.0</string>
                    <key>net_range</key>
                    <array>
                            <string>10.0.2.2</string>
                            <string>10.0.2.31</string>
                    </array>
            </dict>
    </array>
    <key>bootp_enabled</key>
    <false/>
    <key>detect_other_dhcp_server</key>
    <true/>
    <key>dhcp_enabled</key>
    <array>
            <string>en1</string>
    </array>
    <key>use_server_config_for_dhcp_options</key>
    <false/>
</dict>
</plist>
eof

Die 2 Arrays allowund denylassen Sie mich genau definieren, welche MAC-Adressen ich in meinem gemeinsamen Netzwerk akzeptiere und welche ich verbanne.

Dieser Schutz ist alles andere als kugelsicher, aber besser als der völlige Mangel an Schutz, den InternetSharing in einem WEP-Fi-Fi-Netzwerk bietet :).


Kompatibilität mit Betriebssystem-Upgrades

Um Probleme mit einem Betriebssystem-Upgrade zu vermeiden, das möglicherweise behoben /usr/libexec/bootpdwird, ist hier das Shell-Skript, das ich vor jedem Betriebssystem-Upgrade ausführe:

/usr/bin/sudo -s    
cd /usr/libexec

# reset into place the backup copy of the original binary bootpd
mv bootpd.orig bootpd

# go back to a safe working uid
exit

Kompatibilität mit Betriebssystemversionen

Dieses Shell-Skript arbeitet an:

  • Lion
  • Mountain Lion
  • Mavericks
  • Yosemite

Umfrage zum Angriff

Mit der an übergebenen Option -vhabe bootpdich eine Protokollierung von MAC-Adressen, die versucht haben, eine IP-Adresse anzufordern, aber abgelehnt wurden.

Um diese Option -van bootpd zu übergeben, habe ich sie in meinen bootpdWrapper eingefügt:

#!/bin/sh
cp /etc/bootpd.plist.src /etc/bootpd.plist
exec /usr/libexec/bootpd.orig -v "$@"
Was man tun muss, ist: 1. Erstellen Sie eine Datei mit den Inhalten aus dem Beitrag (Skriptteil). 2. Als root ausführen (su, kann über das Verzeichnisdienstprogramm in macOS aktiviert werden). 3. Führen Sie das Skript aus.
Ich musste auch den Systemintegritätsschutz stackoverflow.com/a/49584263/611055 deaktivieren
Bitte fügen Sie einen fettgedruckten Hinweis hinzu, dass das Skript nicht zweimal ausgeführt werden kann. Kann jemandem Zeit sparen

Ich habe den obigen Skriptersetzungstrick ausprobiert und fand ihn sehr nützlich! Danke vielmals!

Bei meiner Konfiguration bestand die einzige zusätzliche Anforderung darin, die bootpd.plist zu ändern von:

<key>use_server_config_for_dhcp_options</key>
<false/>

zu:

<key>use_server_config_for_dhcp_options</key>
<true/>

was sofort die DNS-Unterstützung für meine DHCP-Clients öffnet.

Ich denke, man sollte anmerken, dass jede spätere Änderung der Internet-Sharing-Konfiguration eine zusätzliche Änderung der "/etc/bootpd.plist.src" erfordert, indem von der aktuellen "/etc/bootpd.plist" kopiert wird.

Auf jeden Fall soll der schon länger bestehende Konflikt zwischen Internet Sharing und Server.app bezüglich des DHCP-Dienstes bei späteren Mountain Lion Server-Versionen dringend gelöst werden!