Fuente del problema
Al estudiar los procesos generados por InternetSharing
(con la ayuda de opensnoop
y la depuración de los scripts de shell) finalmente construyo un
manera de evitar esta sobrescritura sistemática y estúpida de /etc/bootpd.plist
.
InternetSharing
crea un /etc/bootpd.plist
mínimo y luego
genera 2 procesos:
/usr/libexec/bootpd
/usr/libexec/natpmpd
Solución
Reemplacé el bootpd original por un simple script de shell a cargo de
Poner mi fuente de /etc/bootpd.plist
en su lugar antes de disparar el
Código original de bootpd
. Por supuesto, la mayoría de estos comandos tienen que ser
corrió 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 permiten definir exactamente qué MAC
Direcciones que aceptaré dentro de mi red compartida y cuál
desterrará.
Esta protección está lejos de ser una prueba de balas, pero es mejor que la
Falta total de protección provista por InternetSharing en una red WEP Fi
red :).
Compatibilidad con las actualizaciones del sistema operativo
Para evitar problemas con cualquier actualización del sistema operativo que pueda corregir /usr/libexec/bootpd
, aquí está el script de shell 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 versiones de SO
Este script de shell está trabajando en:
-
Lion
-
Mountain Lion
-
Mavericks
-
Yosemite
Encuesta de ataque
Con la opción -v
pasada a bootpd
, tengo un registro de direcciones MAC
que intentaron solicitar una dirección IP pero fueron rechazados.
Para pasar esta opción -v
a bootpd, la inserté en mi envoltorio bootpd
:
#!/bin/sh
cp /etc/bootpd.plist.src /etc/bootpd.plist
exec /usr/libexec/bootpd.orig -v "$@"