Origen del problema
Al estudiar los procesos generados por InternetSharing
(con la ayuda de opensnoop
y depuración de shell scripts) finalmente construyo un manera de evitar esta sistemática y estúpida sobreescritura de /etc/bootpd.plist
.
InternetSharing
crea un mínimo de /etc/bootpd.plist
y luego genera 2 procesos:
/usr/libexec/bootpd
/usr/libexec/natpmpd
Solución
He sustituido el bootpd original por un simple shell script encargado de poner mi fuente de /etc/bootpd.plist
en su lugar antes de disparar el original bootpd
código. Por supuesto, la mayoría de estos comandos tienen que ser ejecutar como 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
Las 2 matrices allow
y deny
me permite definir exactamente qué direcciones MAC aceptaré dentro de mi red compartida y cuáles desterraré. desterraré.
Esta protección está lejos de ser a prueba de balas, pero es mejor que la total falta de protección proporcionada por InternetSharing en una red WEP Fi-fi :).
Compatibilidad con las actualizaciones del sistema operativo
Para evitar cualquier problema con cualquier actualización del sistema operativo que pueda arreglar /usr/libexec/bootpd
Aquí está el shell script que ejecuto antes de cualquier actualización 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
Compatibilidad con las versiones del sistema operativo
Este shell script está trabajando:
Lion
Mountain Lion
Mavericks
Yosemite
Encuesta sobre ataques
Con la opción -v
pasado a bootpd
Tengo un registro de direcciones MAC que intentaron solicitar una dirección IP pero fueron rechazadas.
Para pasar esta opción -v
a bootpd lo inserté en mi bootpd
envoltura:
#!/bin/sh
cp /etc/bootpd.plist.src /etc/bootpd.plist
exec /usr/libexec/bootpd.orig -v "$@"