Repository 32bit  Forum
Repository 64bit  Wiki

IPTABLES - Personal Firewall

Da Slacky.eu.

WORK IN PROGRESS


Indice

Introduzione

Questa guida ha come scopo la creazione di un firewall per pc desktop, sarà la base di partenza per scrivere una guida piu vasta all'utilizzo di IPTables. Lo script si propone di definire:

  • regole standard - utili per qualsiasi firewall
  • regole separate per ogni scheda di rete che il pc ha installata
    • rete esterna
    • rete VPN
    • rete LAN
  • regole per la comunicazione con eventuali Host sicuri
  • regole per restringere l'accesso a determinati Host pericolosi
  • regole per i vari servizi che offre la macchina
  • regole specifiche per i singoli utenti.

affinando sempre di più la tecnica per avere una configurazione da paranoici :P

Intestazione

#! /bin/sh
#
# FIREWALL
#
if [ $UID != 0 ]; then
  echo -e "\aWARNING: only root can set iptables!"
  exit
fi 
### SOFTWARE ###
IPTAB=/usr/iptables
### VARIABILI STANDARD ###
# Interfaccia pubblica #
EXTIF="eth0"
# Interfaccia privata #
INTIF="eth1"
VPN="ham0"
# Host Custom #
PC="XXX.XXX.XXX.XXX"
PC_TRUSTED="XXX.XXX.XXX.XXX"
PC_BLACKLISTED="XXX.XXX.XXX.XXX"
# CLASSI IP PRIVATI #
LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
### MATCH ###
text="-m comment --comment"

Catene

Inizializza la policy di default delle catene

set_policy(){
### CATENA DI DEFAULT ###
$IPTAB -P INPUT DROP
$IPTAB -P FORWARD DROP
$IPTAB -P OUTPUT DROP
}

Crea le catene custom, nelle catene custom non può essere assegnata nessuna policy.

set_chain(){ 
### CATENE RETI ###
$IPTAB -N ETH_IN
$IPTAB -N VPN_IN
$IPTAB -N ETH_OUT
$IPTAB -N VPN_OUT 
### CATENE HOST ###
$IPTAB -N trusted_in
$IPTAB -N trusted_out
### CATENE SERVIZI ###
$IPTAB -N SMB_IN
$IPTAB -N AMULE_IN 
### CATENE SICUREZZA ###
$IPTAB -N TCP_CHECKS
$IPTAB -N ANTISPOOF 
}

Regole

Inseriremo tutte le regole in piccoli blocchi raggruppati in funzioni. per attivare, nel firewall, un gruppo di regole inserire nello script

set_gruppo A

per disattivare la regola

set_gruppo D

alcune regole hanno anche parametri aggiuntivi che verranno spiegati di volta in volta.

Regole Globali

set_loop(){
 $IPTAB -$1 INPUT  -m comment --comment "Accetta connessione di LOOPBACK" -i lo -j ACCEPT 
 $IPTAB -$1 OUTPUT -m comment --comment "Accetta connessione di LOOPBACK" -o lo -j ACCEPT  
}

Smista il traffico a seconda della provenienza o della destinazione delle interfacce di rete.

set_global(){
 $IPTAB -$1 INPUT  $text "Traffico Internet in entrata" -i $EXTIF -j ETH_IN 
 $IPTAB -$1 OUTPUT $text "Traffico Internet in uscita"  -o $EXTIF -j ETH_OUT
 $IPTAB -$1 INPUT  $text "Traffico VPN in entrata"      -i $VPN   -j VPN_IN 
 $IPTAB -$1 OUTPUT $text "Traffico VPN in uscita"       -o $VPN   -j VPN_OUT
}

Con questo gruppo abiliteremo tutte le regole che fanno parte di catene custom, se in una catena custom c'è una regola nn sicura non compremetteremo il firewall in quanto per reindirizzare il flusso dei pacchetti nelle catene custom c'è bisogno di comandi espliciti(vedi set_global)

set_custom_rules(){
 set_internet A
 set_antispoof A
 set_portscan  A
 set_services  A
}

Regole Reti

con questa regola filtriamo tutto il traffico che arriva dalla scheda di rete collegata a internet: Abbiamo applicato i controlli di sicurezza e successivamente abbiamo abilitato il traffico verso le porte che usa AMule, come si può notare non abbiamo reso accessibile il traffico verso il server SAMBA, decideremo di abilitare il traffico a questo servizio per altre interfacce di rete quali VPN o per IP specifici, ovviamente potrete decidere di inserire tale servizio per tutto il web se lo riterrete necessario.

set_internet(){
 $IPTAB -$1 ETH_IN  $text "ANTISPOOF: "     -j ANTISPOOF 
 $IPTAB -$1 ETH_IN  $text "PORTSCAN: "      -j TCP_CHECKS 
 $IPTAB -$1 ETH_IN  $text "Servizio: Amule" -j AMULE_IN 
}

Regole Host

Regole Servizi

Inizio con i servizi che utilizzo, per poi cercare di creare un elenco completo dei servizi piu usati, le regole che verranno scritte in questa sezione per il momento si riferiscono alla ricezione dei pacchetti dall'esterno (catena INPUT).

set_services(){
 set_samba A
 set_amule A
}

Samba Server

set_samba(){ 
 SAMBA_UDP="137"
 SAMBA_UDP2="138"
 SAMBA_TCP="139"
 SAMBA_TCP2="445"
 $IPTAB -$1 SMB_IN $text "SAMBA:" -p UDP --dport $SAMBA_UDP  -j ACCEPT
 $IPTAB -$1 SMB_IN $text "SAMBA:" -p UDP --dport $SAMBA_UDP2 -j ACCEPT 
 $IPTAB -$1 SMB_IN $text "SAMBA:" -m state --state NEW -m tcp -p tcp --dport $SAMBA_TCP  -j ACCEPT
 $IPTAB -$1 SMB_IN $text "SAMBA:" -m state --state NEW -m tcp -p tcp --dport $SAMBA_TCP2 -j ACCEPT 
}

Amule

Queste sono regole per attivare le porte dei programmi di file sharing della rete eDonkey e Kadmilia Testato con Amule, Amuled e emule su wine.

Configurazione per i pacchetti in ingresso

set_amule(){ 
 AMULE_TCP="4662"
 AMULE_UDP="4665"
 AMULE_UDP2="4672"
 $IPTAB -$1 AMULE_IN $text "AMULE: TCP"  -p TCP --dport $AMULE_TCP -j ACCEPT 
 $IPTAB -$1 AMULE_IN $text "AMULE: UDP"  -p UDP --dport $AMULE_UDP -j ACCEPT 
 $IPTAB -$1 AMULE_IN $text "AMULE: UDP2" -p UDP --dport $AMULE_UDP2 -j ACCEPT 
}

voci correlate

Regole Utenti

Inseriamo le regole per permettere a un user locale di poter utilizzare liberamente internet come desktop user: Script generico che permette qualsiasi tipo di connessione esterna per gli utenti abilitati

set_user(){
$IPTAB -$1 INPUT $text "risposta: $2" -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTAB -$1 OUTPUT $text "Connessioni: $2" -m state --state NEW,ESTABLISHED,RELATED -m owner $2 -j ACCEPT
}

Regole Sicurezza

PortScan

set_portscan(){
$IPTAB -$1 TCP_CHECKS -p tcp --tcp-flags ALL NONE        -j DROP   
$IPTAB -$1 TCP_CHECKS -p tcp --tcp-flags FIN,ACK FIN     -j DROP  
$IPTAB -$1 TCP_CHECKS -p tcp --tcp-flags ACK,PSH PSH     -j DROP   
$IPTAB -$1 TCP_CHECKS -p tcp --tcp-flags ACK,URG URG     -j DROP   
$IPTAB -$1 TCP_CHECKS -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP   
$IPTAB -$1 TCP_CHECKS -p tcp --tcp-flags SYN,RST SYN,RST -j DROP   
$IPTAB -$1 TCP_CHECKS -p tcp --tcp-flags FIN,RST FIN,RST -j DROP   
$IPTAB -$1 TCP_CHECKS -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP 
}

AntiSpoof

set_antispoof(){
$IPTAB -$1 ANTISPOOF --in-interface ! lo   --source      $LOOPBACK        -j DROP
$IPTAB -$1 ANTISPOOF --in-interface ! lo   --destination $LOOPBACK        -j DROP
$IPTAB -$1 ANTISPOOF --in-interface $EXTIF --source $CLASS_A              -j DROP
$IPTAB -$1 ANTISPOOF --in-interface $EXTIF --source $CLASS_B              -j DROP
$IPTAB -$1 ANTISPOOF --in-interface $EXTIF --source $CLASS_C              -j DROP
$IPTAB -$1 ANTISPOOF --in-interface $EXTIF --source $CLASS_D_MULTICAT     -j DROP
$IPTAB -$1 ANTISPOOF --in-interface $EXTIF --source $CLASS_E_RESERVED_NET -j DROP
$IPTAB -$1 ANTISPOOF --in-interface $EXTIF --source $PC                   -j DROP
}

Set Finali

Attiva Firewall (set_firewall)

set_firewall(){
  set_loop A
  set_trusted A
  set_blacklist A
  set_eth A
  set_VPN A
  set_LAN A
}

Disattiva Firewall (unset_firewall)

Svuota tutte le catene e reimposta le policy a ACCEPT

unset_firewall() {
  $IPTAB -F
  $IPTAB -P INPUT ACCEPT
  $IPTAB -P OUTPUT ACCEPT
  $IPTAB -P FORWARD DROP
  $IPTAB -t nat -F
  $IPTAB -t mangle -F
  $IPTAB -X
}

Main

# MAIN
case "$1" in
   start)
      echo "Starting iptables filtering..."
      set_firewall
      ;;
   stop)
      echo "Stopping iptables filtering..."
      unset_firewall
      ;;
   restart)
      echo "Restarting iptables filtering..."
      set_firewall
      ;;
   status)
      $IPTAB -L -v
      ;;
   *)
      echo "Usage: $0 {start|stop|restart|status}"
      exit 
      ;;
esac
exit 0
Strumenti personali
Namespace

Varianti