Pagina 1 di 1

[RISOLTO] UDEV regola per riavviare Firewall

Inviato: gio 29 mag 2014, 16:06
da joe
Ho uno script di shell che crea delle regole con iptables chiamato rc.firewall e si trova in /etc/rc.d/rc.firewall.
Accetta degli argomenti start|stop|block|ecc ecc.

Ho scritto una regola di udev che richiama uno script all'atto della creazione di un'interfaccia di rete (bnep0).
Tale regola esegue uno script quando compare bnep0.
Il tutto funziona.

Ora, avevo bisogno di riavviare il firewall e in quello script ho inserito:

Codice: Seleziona tutto

/etc/rc.d/rc.firewall restart
Però nonostante gli altri comandi dello script vengano eseguiti normalmente, il firewall non ne vuole sapere di essere riavviato.
Allora ho provato a piazzare nella regola di udev direttamente il comando di riavvio del firewall:

Codice: Seleziona tutto

# cat /lib/udev/rules.d/97-bnep0.rules

# Bnep0 Bluetooh NAP interface
ACTION=="add", KERNEL=="bnep0", RUN+="/etc/rc.d/rc.firewall restart"
Dando un'occhiata alle regole di iptables ne concludo però che lo script rc.firewall non è stato eseguito.
Ora, come si potrebbe spiegare questo comportamento?
Ovviamente se lancio a mano da riga di comando funziona. Invece attraverso udev non viene eseguito o comunque non sortisce alcun effetto.

Come potrei vedere quali sono gli eventuali errori che ne impediscono la corretta esecuzione?

Re: UDEV regola per riavviare Firewall

Inviato: gio 29 mag 2014, 20:42
da marlavo
Hai provato a scrivere

Codice: Seleziona tutto

RUN+="/bin/sh /etc/rc.d/rc.firewall restart"
?

Re: UDEV regola per riavviare Firewall

Inviato: ven 30 mag 2014, 0:24
da joe
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... :lol:

Re: UDEV regola per riavviare Firewall

Inviato: ven 30 mag 2014, 0:40
da ilmich
il problema dovrebbe stare qui

Codice: Seleziona tutto

IPTAB=$(which iptables)
prova a mettere il percorso fisso.il comando which cerca i programmi scorrendo il contenuto della variabile d'ambiente PATH quindi potrebbe non essere affidabile dato che udev non esegue i programmi in nessuna shell attiva percio' quella variabile potrebbe essere vuota.

Re: UDEV regola per riavviare Firewall

Inviato: ven 30 mag 2014, 10:14
da joe
Confermo! Il problema era proprio quello.
Grazie mille davvero! :D