Source du problème
En étudiant les processus engendrés par InternetSharing
(avec l'aide de opensnoop
et déboguer les scripts) J'ai finalement construit un moyen de contourner cette écrasement systématique et stupide de /etc/bootpd.plist
.
InternetSharing
crée une /etc/bootpd.plist
et ensuite génère 2 processus :
/usr/libexec/bootpd
/usr/libexec/natpmpd
Solution
J'ai remplacé le bootpd original par un simple shell script chargé de mettre ma source de /etc/bootpd.plist
en place avant de tirer le original bootpd
code. Bien sûr, la plupart de ces commandes doivent être exécutées en tant que 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
Les 2 tableaux allow
y deny
Laissez-moi définir exactement quel MAC je vais accepter dans mon réseau partagé et celles que je vais bannir. bannir.
Cette protection est loin d'être à l'épreuve des balles, mais elle est meilleure que la l'absence totale de protection fournie par InternetSharing sur un réseau Fi-fi WEP :). WEP :).
Compatibilité avec les mises à jour du système d'exploitation
Pour éviter tout problème avec une mise à jour de l'OS qui pourrait corriger /usr/libexec/bootpd
Voici le shell script que j'exécute avant toute mise à jour du système d'exploitation :
/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é avec les versions du système d'exploitation
Ce shell script travaille sur :
Lion
Mountain Lion
Mavericks
Yosemite
Enquête sur les attaques
Avec l'option -v
transmis à bootpd
J'ai une liste d'adresses MAC qui ont tenté de demander une adresse IP mais ont été rejetées.
Pour passer cette option -v
à bootpd, je l'ai inséré dans mon bootpd
l'emballage :
#!/bin/sh
cp /etc/bootpd.plist.src /etc/bootpd.plist
exec /usr/libexec/bootpd.orig -v "$@"