Sì ho provato ma anche così non funziona...
D'altra parte nello script all'inizio c'è il cosiddetto "shebang" (#!/bin/sh) che dovrebbe assicurare il richiamo dell'interprete di shell.
Alla fine ho fatto uno script simile che lavora sempre con iptables, l'ho chiamato "rc.bnep" e l'ho messo sempre in "/etc/rc.d/", tanto per riprodurre una situazione simile.
Questo funziona:
Codice: Seleziona tutto
root@darkstar:~# cat /etc/rc.d/rc.bnep
#!/bin/sh
case $1 in
up)
echo 1 > /proc/sys/net/ipv4/ip_forward
/usr/sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
/usr/sbin/iptables -A FORWARD -i ppp0 -o bnep0 -j ACCEPT
/usr/sbin/iptables -A FORWARD -i bnep0 -o ppp0 -j ACCEPT
/usr/sbin/iptables -A INPUT -i bnep0 -j ACCEPT
#/sbin/ifconfig bnep0 10.0.0.1 netmask 255.255.255.0 up
/etc/rc.d/rc.inet1 bnep0_start
;;
down)
/usr/sbin/iptables -t nat -F
/usr/sbin/iptables -D FORWARD -i ppp0 -o bnep0 -j ACCEPT
/usr/sbin/iptables -D FORWARD -i bnep0 -o ppp0 -j ACCEPT
/usr/sbin/iptables -D INPUT -i bnep0 -j ACCEPT
esac
E quest'altro invece no...
Codice: Seleziona tutto
root@darkstar:~# cat /etc/rc.d/rc.firewall
#!/bin/sh
IPTAB=$(which iptables)
text="-m comment --comment"
flush_chain(){
### FLUSHING CHAINS ###
$IPTAB -F
$IPTAB -t nat -F
$IPTAB -X
$IPTAB -Z
}
set_policy(){
### CATENA DI DEFAULT ###
$IPTAB -P INPUT $1
$IPTAB -P FORWARD $1
$IPTAB -P OUTPUT $1
}
set_loop(){
$IPTAB -$1 INPUT $text 'Accetta connessione di LOOPBACK' -i lo -j ACCEPT
$IPTAB -$1 OUTPUT $text 'Accetta connessione di LOOPBACK' -o lo -j ACCEPT
}
set_global(){
$IPTAB -$1 INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTAB -$1 OUTPUT -j ACCEPT
}
set_ed2k(){
$IPTAB -$1 INPUT -p tcp --dport xxx -j ACCEPT
$IPTAB -$1 INPUT -p udp --dport xxx -j ACCEPT
}
set_bittorrent(){
$IPTAB -$1 INPUT -p tcp --dport xxx -j ACCEPT
$IPTAB -$1 INPUT -p udp --dport xxx -j ACCEPT
$IPTAB -$1 INPUT -p udp --dport xxx -j ACCEPT
}
set_tracker(){
$IPTAB -$1 INPUT -p tcp --dport xxx -j ACCEPT
}
set_firewall(){
flush_chain
set_policy DROP
set_loop A
set_global A
}
unset_firewall(){
flush_chain
set_policy ACCEPT
}
# MAIN
case "$1" in
start)
# echo "Attiva Firewall..."
set_firewall
;;
stop)
# echo "Disattiva Firewall..."
unset_firewall
;;
restart)
## echo "Riattiva Firewall..."
unset_firewall
set_firewall
;;
status)
$IPTAB -L -v
;;
block)
# echo "Blocca tutte le Connessioni..."
flush_chain
set_policy DROP
set_loop A
;;
tracker)
# echo "tracker Activated..."
set_firewall
set_bittorrent A
set_tracker A
;;
p2p)
# echo "P2P Activated..."
set_firewall
set_bittorrent A
set_ed2k A
;;
*)
# echo "Utilizzo: $0 {start|stop|restart|status|block|p2p}"
exit
;;
esac
exit 0
Come vedete ho commentato tutti gli "echo" perchè avevo letto in rete che poteva dare problemi con udev.
E infine ecco la regola (insensata, è solo per testare) di udev:
Codice: Seleziona tutto
root@darkstar:~# cat /lib/udev/rules.d/97-bnep0.rules
# Bnep0 Bluetooh NAP interface
ACTION=="add", KERNEL=="bnep0", RUN+="/bin/sh /etc/rc.d/rc.firewall restart"
ACTION=="remove", KERNEL=="bnep0", RUN+="/bin/sh /etc/rc.d/rc.firewall block"
#ACTION=="add", KERNEL=="bnep0", RUN+="/etc/rc.d/rc.bnep up"
#ACTION=="remove", KERNEL=="bnep0", RUN+="/etc/rc.d/rc.bnep down"
Il test eseguito è il seguente:
- 1- spengo il firewall (rc.firewall stop) e verifico (iptables -L -v && iptables -t nat -L -v): giustamente appare tutto vuoto.
2- come dicevo in pratica quando si crea il device "bnep" dovrebbe riavviarsi il firewall, invece ricontrollando le tabelle di iptables sono ancora vuote. Significa che il comando nella regola di udev non viene eseguito come mi aspetterei.
3- rimuovendo bnep... idem ancora tutto vuoto e tutto in ACCEPT, nonostante avessi impostato di bloccare tutto il traffico (argomento "block").
Mi sa che mi sto perdendo in un bicchier d'acqua ma tant'è non riesco a capire cosa non funziona...
Evidentemente lo script rc.firewall contiene qualcosa che udev non digerisce. Ma cosa?
In quello script sono impostate varie "functions", che siano quelle a creare problemi? Non penso perchè alla fine è la shell che interpreta.
Non sono riuscito neanche a trovare un modo per debuggare la faccenda, perchè udev quando fa girare il programma non mostra niente da nessuna parte o forse sì ma non so dove cercare o come farglielo fare...
Mi viene in mente che potrei mettre "set -x" in cima a "rc.firewall" e poi nella regola di udev richiamarlo spedendo l'output su un file.. forse così funziona almeno il debug.... provo.
Se nel frattempo aveste una risposta benvenga. Sarà sicuramente utile per capire meglio questo marchingegno misterioso quale appare udev ai miei occhi...