Origine del problema
Studiando i processi generati da InternetSharing
(con l'aiuto di opensnoop
e eseguendo il debug degli script di shell) ho finalmente costruito un
modo per aggirare questa sovrascrittura sistematica e stupida di /etc/bootpd.plist
.
InternetSharing
crea un /etc/bootpd.plist
minimo e poi
genera 2 processi:
/usr/libexec/bootpd
/usr/libexec/natpmpd
Soluzione
Ho sostituito il bootpd originale con un semplice script di shell
mettere la mia fonte di /etc/bootpd.plist
sul posto prima di sparare al
codice originale bootpd
. Naturalmente la maggior parte di questi comandi deve essere
eseguito come 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
Le 2 matrici allow
e deny
consentono di definire esattamente quale MAC
indirizzi accetterò all'interno della mia rete condivisa e quale io
banish.
Questa protezione è tutt'altro che a prova di proiettile, ma è migliore della
totale mancanza di protezione fornita da InternetSharing su un WEP Fi-fi
rete:).
Compatibilità con gli aggiornamenti del sistema operativo
Per evitare problemi con qualsiasi aggiornamento del sistema operativo che potrebbe correggere /usr/libexec/bootpd
, ecco lo script della shell che eseguo prima di qualsiasi aggiornamento del sistema operativo:
/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
Compatibilità con le versioni del sistema operativo
Questo script di shell sta funzionando su:
-
Lion
-
Mountain Lion
-
Mavericks
-
Yosemite
Sondaggio di attacco
Con l'opzione -v
passata a bootpd
, ho una registrazione degli indirizzi MAC
che ha tentato di richiedere un indirizzo IP ma sono stati respinti.
Per passare questa opzione -v
a bootpd l'ho inserita nel mio wrapper bootpd
:
#!/bin/sh
cp /etc/bootpd.plist.src /etc/bootpd.plist
exec /usr/libexec/bootpd.orig -v "$@"