Ich habe eine eingerichtet /etc/bootpd.plist
, um mein drahtloses Netzwerk zu schützen und statisch zugewiesene IP-Adressen zu verwalten.
Leider wird InternetSharing
diese Datei beim Start von einer Plist überschrieben, deren Quelle ich nicht gefunden habe.
Wie kann ich verhindern, dass InternetSharing
diese Datei überschrieben wird?
Wo ist die Quelle dieser überschreibenden Datei /etc/bootpd.plist
?
Indem ich die von erzeugten Prozesse InternetSharing
(mit Hilfe von opensnoop
und Debugging von Shell-Skripten) studiere, habe ich endlich einen Weg gefunden, dieses systematische und dumme Überschreiben von zu umgehen /etc/bootpd.plist
.
InternetSharing
erstellt ein Minimum /etc/bootpd.plist
und erzeugt dann 2 Prozesse:
/usr/libexec/bootpd
/usr/libexec/natpmpd
Ich habe den ursprünglichen bootpd durch ein einfaches Shell-Skript ersetzt, das dafür zuständig ist, meine Quelle von /etc/bootpd.plist
an Ort und Stelle zu setzen, bevor der ursprüngliche bootpd
Code 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 allow
und deny
lassen 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 :).
Um Probleme mit einem Betriebssystem-Upgrade zu vermeiden, das möglicherweise behoben /usr/libexec/bootpd
wird, 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
Dieses Shell-Skript arbeitet an:
Lion
Mountain Lion
Mavericks
Yosemite
Mit der an übergebenen Option -v
habe bootpd
ich eine Protokollierung von MAC-Adressen, die versucht haben, eine IP-Adresse anzufordern, aber abgelehnt wurden.
Um diese Option -v
an bootpd zu übergeben, habe ich sie in meinen bootpd
Wrapper eingefügt:
#!/bin/sh
cp /etc/bootpd.plist.src /etc/bootpd.plist
exec /usr/libexec/bootpd.orig -v "$@"
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!
Kunst-Divin
Kunst-Divin
Kunst-Divin