[iptables] Regole sufficienti?

Postate qui per tutte le discussioni legate alla sicurezza di Linux/Slackware

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Specificare se discussione/suggerimento o richiesta d'aiuto.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
tigerwalk
Linux 3.x
Linux 3.x
Messaggi: 893
Iscritto il: lun 25 feb 2008, 22:08
Nome Cognome: Giuliano della Vecchia
Slackware: 13.37-14.2
Kernel: 3.10.17-tiger / 4.4.88-smp
Desktop: kde4/xfce4
Località: Napoli

[iptables] Regole sufficienti?

Messaggio da tigerwalk »

In giro per il forum e per la rete ho trovato vari consigli che ho riunito in uno script per lanciare iptables. Il tutto funziona ma, onestamente, non saprei se serve realmente. Ho due interfacce, eth0 e wlan0 e lo script lo posto sotto.
Se qualcuno esperto ha voglia di guardarlo e dirmi se serve per una protezione "base" per un utilizzo non particolare del computer, ne sarei grato.

Codice: Seleziona tutto

#!/bin/bash


SW_VERB="-v"

# imposta il debug a livello script - segnala eventuali errori
set -e                                                     
#                                                             
# [ Moduli del kernel ]                                       
# attiva la funzionalita' di connection tracking per  la gestione delle connessioni mediante l'uso del modulo state
#modprobe nf_conntrack                                          
#                                                              
# attiva il connection tracking per il protocollo ftp          
#modprobe nf_conntrack_ftp 
PATH="/sbin:/usr/sbin:/bin:/usr/bin:${PATH}"
export PATH

LSMOD="lsmod"
MODPROBE="modprobe"
IPTABLES="iptables"
IP6TABLES="ip6tables"
IPTABLES_RESTORE="iptables-restore"
IP6TABLES_RESTORE="/sbin/ip6tables-restore"
IP="ip"
LOGGER="logger"
#
prolog_commands() {
echo "Running prolog script"

}

epilog_commands() {
echo "Running epilog script"

}

run_epilog_and_exit() {
  epilog_commands
  exit $1
}
#
prolog_commands


MODULES_DIR="/lib/modules/`uname -r`/kernel/net/"
MODULES=`find $MODULES_DIR -name '*conntrack*'|sed  -e 's/^.*\///' -e 's/\([^\.]\)\..*/\1/'`
MODULES="$MODULES `find $MODULES_DIR -name '*nat*'|sed  -e 's/^.*\///' -e 's/\([^\.]\)\..*/\1/'`"
for module in $MODULES; do 
  if $LSMOD | grep ${module} >/dev/null; then continue; fi
  $MODPROBE ${module} ||  exit 1 
done
#


# blocco il forwarding dei pacchetti
sh /etc/rc.d/rc.ip_forward stop

# cancello tutte le regole precedenti (nel caso ci fossero)
# e tutte le catene di regole "user defined"
/usr/sbin/iptables -F $SW_VERB
/usr/sbin/iptables -t nat -F $SW_VERB
/usr/sbin/iptables -t mangle -F $SW_VERB
/usr/sbin/iptables -X $SW_VERB
/usr/sbin/iptables -t nat -X $SW_VERB
/usr/sbin/iptables -t mangle -X $SW_VERB

# stabilisco un set standard di regole abbastanza rigido:
# drop sia in input che in forward, accept in output
/usr/sbin/iptables -P INPUT DROP $SW_VERB
/usr/sbin/iptables -P OUTPUT ACCEPT $SW_VERB
/usr/sbin/iptables -P FORWARD DROP $SW_VERB

# permetto tutto il traffico su loopback
/usr/sbin/iptables -A INPUT -i lo -j ACCEPT $SW_VERB
# permetto il traffico in entrata da wlan0
/usr/sbin/iptables -A INPUT -i wlan0 -j ACCEPT $SW_VERB
# permetto il traffico necessario (già stabilito o richiesto) su eth0
/usr/sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT $SW_VERB
# Blocco i ping dall'esterno
#/usr/sbin/iptables -A INPUT -i ppp0 -p icmp --icmp-type echo-request -j DROP $SW_VERB

# regole per il forwarding
# permetto il traffico dall'esterno a patto che sia stato richiesto
/usr/sbin/iptables -A FORWARD -i eth0 -o wlan0 -m state --state ESTABLISHED,RELATED -j ACCEPT $SW_VERB
# permetto tutto il traffico in uscita dalla lan su internet
/usr/sbin/iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT $SW_VERB
# Abilito il masquerading del server
/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE $SW_VERB

# abilito la porta 8022 per ssh sulla lan - REGOLA NON NECESSARIA IN QUANTO DEFINITA PRECEDENTEMENTE
/usr/sbin/iptables -A INPUT -i wlan0 -p tcp --dport 8022 -j ACCEPT $SW_VERB     # SSH sulla lan interna
# permetto le connessioni dall'esterno alla porta 80 per apache
/usr/sbin/iptables -A INPUT -i wlan0 -p tcp --dport 80 -j ACCEPT $SW_VERB        # HTTPD

# azzero i contatori delle varie chains
/usr/sbin/iptables -Z $SW_VERB
/usr/sbin/iptables -t nat -Z $SW_VERB
/usr/sbin/iptables -t mangle -Z $SW_VERB
sh /etc/rc.d/rc.ip_forward start

#MSN Client
#echo "Client MSN"
/usr/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 1863 -m state --state NEW,ESTABLISHED -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -m tcp --sport 1863 -m state --state ESTABLISHED -j ACCEPT

#Samba Server
#set_samba(){
# SAMBA_UDP="137"
# SAMBA_UDP2="138"
# SAMBA_TCP="139"
# SAMBA_TCP2="445"
# /usr/sbin/iptables -A -$1 SMB_IN $text "SAMBA:" -p UDP --dport $SAMBA_UDP  -j ACCEPT
 #/usr/sbin/iptables -A -$1 SMB_IN $text "SAMBA:" -p UDP --dport $SAMBA_UDP2 -j ACCEPT
 #/usr/sbin/iptables -A -$1 SMB_IN $text "SAMBA:" -m state --state NEW -m tcp -p tcp --dport $SAMBA_TCP  -j ACCEPT
 #/usr/sbin/iptables -A -$1 SMB_IN $text "SAMBA:" -m state --state NEW -m tcp -p tcp --dport $SAMBA_TCP2 -j ACCEPT
#}

#Amule
/usr/sbin/iptables -A INPUT -p TCP --dport 4662 -j ACCEPT
/usr/sbin/iptables -A INPUT -p UDP --dport 4665 -j ACCEPT
/usr/sbin/iptables -A INPUT -p UDP --dport 4672 -j ACCEPT



# no IP spoofing
/usr/sbin/iptables -N In_RULE_0
test -n "$i_wlan0" && /usr/sbin/iptables -A INPUT  -i wlan0   -s $i_wlan0   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A INPUT  -i wlan0   -s 192.168.1.2   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A INPUT  -i wlan0   -s 192.168.1.0/24   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A INPUT  -i wlan0   -s 192.168.2.0/24   -m state --state NEW  -j In_RULE_0
test -n "$i_wlan0" && /usr/sbin/iptables -A FORWARD  -i wlan0   -s $i_wlan0   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A FORWARD  -i wlan0   -s 192.168.1.2   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A FORWARD  -i wlan0   -s 192.168.1.0/24   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A FORWARD  -i wlan0   -s 192.168.2.0/24   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A In_RULE_0  -j LOG  --log-level info --log-prefix "RULE 0 -- DENY"
/usr/sbin/iptables -A In_RULE_0  -j DROP


epilog_commands
# Disable Source Routed Packets
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 0 > $i

#echo 1 > /proc/sys/net/ipv4/ip_forward
done


Grazie!

Avatar utente
ildiama
Linux 3.x
Linux 3.x
Messaggi: 536
Iscritto il: mar 27 dic 2005, 16:49
Slackware: mine
Kernel: 2.6.alto..
Desktop: KDE4
Località: Senigallia
Contatta:

Re: [iptables] Regole sufficienti?

Messaggio da ildiama »

Ho provato a leggere il tuo script, ma ci sono talmente cose commentate che si fa fatica a mettere in evidenza quelle importanti.. forse il problema è che io non sono l'esperto che cerchi. Ti metto allora lo script che uso io: /etc/rc.d/rc.firewall. Gli script di Pat lo eseguono automaticamente all'avvio se è eseguibile. Anche il mio è un copia-incolla di script, pensate, stupidate (mie, per esempio la parte su samba), colpi di genio (di altri).
Almeno però funziona nella logica start|stop|status|restart degli slackware rc script.
Volevo modificarlo un giorno aggiungendo un ulteriore parametro per attivare samba, amule, ssh e così via, in modo tale che (ad esempio)

Codice: Seleziona tutto

rc.firewall samba start
Aprisse tutto il necessario per samba e così via. Ecco il codice, ciao.

Codice: Seleziona tutto

#!/bin/sh
# script di gestione firewall

# Variabili
IPT=`which iptables`
LO=lo				# scheda virtuale per il loopback
ETH=eth0			# scheda di rete wired
WLN=wlan0			# scheda di rete wireless

fire_start() {

	## TABELLA FILTER ##
	
	# Le regole di default imporranno di scartare tutti i pacchetti
	# a meno che non venga specificato diversamente. In questo modo
	# eviteremo di lasciare inavvertitamente qualcosa aperto

	## LOG TESTING ##
	# questa regola dovrebbe loggare tutto il traffico bloccato
	$IPT --append FORWARD --jump LOG --log-prefix="FORWARD: "
	
	# Definizione criterio generale
	$IPT --policy INPUT DROP    # scarta tutti i pacchetti in ingresso
	$IPT --policy FORWARD DROP  # scarta tutti i pacchetti in attraversamento
	$IPT --policy OUTPUT ACCEPT # accetta tutto il traffico che vuole uscire
	
	# Per maggiore sicurezza, diciamo a Netfilter di scartare tutto il traffico
	# non valido, come ad esempio quello che non appartiene a nessuna
	# connessione conosciuta 
	
	# Frammenti e pacchetti non validi
	$IPT --append INPUT -f --jump LOG --log-prefix="Frammented Input: "
	$IPT --append INPUT -f --jump DROP
	$IPT --append INPUT --match state --state INVALID --jump LOG --log-prefix="Invalid Input: "
	$IPT --append INPUT --match state --state INVALID --jump DROP
	$IPT --append OUTPUT -f --jump LOG --log-prefix="Frammented Output: "
	$IPT --append OUTPUT -f --jump DROP
	$IPT --append OUTPUT --match state --state INVALID --jump LOG --log-prefix="Invalid Output: "
	$IPT --append OUTPUT --match state --state INVALID --jump DROP
	
	# Netfilter disciplina tutto il traffico, anche quello che passa per
	# l'interfaccia di loopback, che non deve essere bloccato
	
	# Traffico di loopback
	$IPT --append INPUT -i $LO --jump ACCEPT
	$IPT --append OUTPUT -o $LO --jump ACCEPT
	
	# Per poter utilizzare una connessione ad Internet, comunque, è necessario
	# permettere l'ingresso dei pacchetti appartenenti o correlati ad una
	# connessione aperta dalla nostra macchina, che, altrimenti, verrebbe
	# bloccato in virtù della configurazione di default
	
	## TABELLA FILTER - INGRESSO ##
	# Accetta pacchetti di connessioni esistenti
	$IPT --append INPUT --match state --state ESTABLISHED,RELATED --jump ACCEPT
 
	## regole per SAMBA ##
	# non è che mi gira tanto, ma sembra che senza non vada..
	#$IPT --append INPUT --match state --state NEW --proto tcp --dport 139 --jump ACCEPT	
	#$IPT --append INPUT --match state --state NEW --proto tcp --dport 445 --jump ACCEPT	
	$IPT --append INPUT --match state --state NEW --proto udp --jump ACCEPT	
	
	# LOG di tutto il traffico NON estabilished OR related
	$IPT --append INPUT --match state --state NEW --jump LOG --log-prefix "NEW state: "
	
	# Accettiamo il traffico in ingresso nelle porte del client
	# # Accetta connessioni per client P2P
	# $IPT --append INPUT -i $ETH -p tcp --dport 4662 --jump ACCEPT
	# $IPT --append INPUT -i $ETH -p tcp --dport 4668 --jump ACCEPT
	# $IPT --append INPUT -i $ETH -p udp --dport 18745 --jump ACCEPT
}

fire_stop() {

	## RESET DELLE REGOLE ##
	
	$IPT --flush
	#$IPT --table mangle --flush
	#$IPT --table nat --flush
	$IPT --delete-chain
	#$IPT --table mangle --delete-chain
	#$IPT --table nat --delete-chain
	
	## TABELLA FILTER ##
	
	# Definizione criterio generale
	$IPT --policy INPUT ACCEPT
	$IPT --policy FORWARD ACCEPT
	$IPT --policy OUTPUT ACCEPT
}

# See how we were called..
case "$1" in
	start)
		echo "$IPT: Applying firewall rules.."
		fire_start
		;;
	stop) 
		echo "$IPT: Cleaning firewall rules.."
		fire_stop
		;;
	restart)
		echo "$IPT: Re-applying firewall rules.."
		fire_stop
		sleep 1
		fire_start
		;;
	status)
		$IPT --list
		;;
	*)
		echo "Usage: $0 {start|stop|status|restart}"
		;;
esac 

Avatar utente
luka64
Linux 1.x
Linux 1.x
Messaggi: 175
Iscritto il: ven 22 mag 2009, 10:47
Slackware: 12.2,9e
Kernel: 2.6.28.10
Desktop: xfce
Distribuzione: zw6.0

Re: [iptables] Regole sufficienti?

Messaggio da luka64 »

@tigerwalk: volevo chiedere una cosa da profano di amule (mai usato)
sono le porte standard quelle che hai specificato e se si, perchè non
metterne altre diciamo un po' più random?

Avatar utente
tigerwalk
Linux 3.x
Linux 3.x
Messaggi: 893
Iscritto il: lun 25 feb 2008, 22:08
Nome Cognome: Giuliano della Vecchia
Slackware: 13.37-14.2
Kernel: 3.10.17-tiger / 4.4.88-smp
Desktop: kde4/xfce4
Località: Napoli

Re: [iptables] Regole sufficienti?

Messaggio da tigerwalk »

@ildiama
grazie per il tuo script anche se non hai potuto dare giudizi sul mio.

@luka64
sono le porte "classiche" di amule, non ho sentito la necessità di cambiarle.

Avatar utente
ildiama
Linux 3.x
Linux 3.x
Messaggi: 536
Iscritto il: mar 27 dic 2005, 16:49
Slackware: mine
Kernel: 2.6.alto..
Desktop: KDE4
Località: Senigallia
Contatta:

Re: [iptables] Regole sufficienti?

Messaggio da ildiama »

tigerwalk ha scritto:@ildiama
grazie per il tuo script anche se non hai potuto dare giudizi sul mio.
Approfittando del tuo post e della domenica mattina, ho pensato di dare un occhio (copiandolo su kwrite :D ) al tuo script e di riprendere un poco i concetti su iptables e quant'altro.

Ora, vediamo il tuo script: in generale penso che ci siano un po' di cose inutili, non so se pericolose. Premetto che tutto sto ragionamento che faccio, lo faccio pensando che utilizzi il pc come personal computer, non come router o cosa.

Codice: Seleziona tutto

# permetto il traffico necessario (già stabilito o richiesto) su eth0
/usr/sbin/iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT $SW_VERB
Qui abiliti il traffico su eth0. Perché non togliere quel "-i eth0" e abilitarlo così su tutte le interfacce? Non vuoi (potenzialmente) poter navigare sia tramite eht0 che tramite wlan0?

Codice: Seleziona tutto

# regole per il forwarding
# permetto il traffico dall'esterno a patto che sia stato richiesto
/usr/sbin/iptables -A FORWARD -i eth0 -o wlan0 -m state --state ESTABLISHED,RELATED -j ACCEPT $SW_VERB
# permetto tutto il traffico in uscita dalla lan su internet
/usr/sbin/iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT $SW_VERB
# Abilito il masquerading del server
/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE $SW_VERB
Questo blocco qui secondo me è inutile. Perché dovresti abilitare questa cosa? Sei collegato ad una rete (192.168....) tramite eth0 e ad un'altra (10.1...) tramite wlan0? Se questo non è vero, allora prova a togliere tutto. La tabella FORWARD serve per il traffico di passaggio. Cioè pacchetti che arrivano da te, ma di cui tu non sei il destinatario. A casa mia (nel mio notebook) quella roba è DROP e tutto funziona allegramente.

Codice: Seleziona tutto

# abilito la porta 8022 per ssh sulla lan - REGOLA NON NECESSARIA IN QUANTO DEFINITA PRECEDENTEMENTE
/usr/sbin/iptables -A INPUT -i wlan0 -p tcp --dport 8022 -j ACCEPT $SW_VERB     # SSH sulla lan interna
# permetto le connessioni dall'esterno alla porta 80 per apache
/usr/sbin/iptables -A INPUT -i wlan0 -p tcp --dport 80 -j ACCEPT $SW_VERB        # HTTPD
Queste due regole abilitano il collegamento ai server ssh (sulla porta 8022) e http (sulla fatidica 80). Ma solo tramite wlan0. :?:

Codice: Seleziona tutto

# client amsn
/usr/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 1863 -m state --state NEW,ESTABLISHED -j ACCEPT
/usr/sbin/iptables -A INPUT -p tcp -m tcp --sport 1863 -m state --state ESTABLISHED -j ACCEPT
Questo per il traffico amsn. Inutile. La tabella OUTPUT è default su ACCEPT. La tabella INPUT accetta già il traffico ESTABLISHED. Qui però non setti le periferiche di rete. Quindi se sistemi quella sopra come suggerito, qui leva tutto. Altrimenti la seconda riga qua abilita il traffico amsn anche su wlan0.


Le righe per amule sembrano ok.

Codice: Seleziona tutto

# no IP spoofing
/usr/sbin/iptables -N In_RULE_0
test -n "$i_wlan0" && /usr/sbin/iptables -A INPUT  -i wlan0   -s $i_wlan0   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A INPUT  -i wlan0   -s 192.168.1.2   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A INPUT  -i wlan0   -s 192.168.1.0/24   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A INPUT  -i wlan0   -s 192.168.2.0/24   -m state --state NEW  -j In_RULE_0
test -n "$i_wlan0" && /usr/sbin/iptables -A FORWARD  -i wlan0   -s $i_wlan0   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A FORWARD  -i wlan0   -s 192.168.1.2   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A FORWARD  -i wlan0   -s 192.168.1.0/24   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A FORWARD  -i wlan0   -s 192.168.2.0/24   -m state --state NEW  -j In_RULE_0
/usr/sbin/iptables -A In_RULE_0  -j LOG  --log-level info --log-prefix "RULE 0 -- DENY"
/usr/sbin/iptables -A In_RULE_0  -j DROP
Questa sull'IP spoofing aspettiamo qualcuno che ce la spiega. :shock:

Spero di non aver detto troppe baggianate. Credo di no. Fai qualche prova comunque, ciao.

Avatar utente
tigerwalk
Linux 3.x
Linux 3.x
Messaggi: 893
Iscritto il: lun 25 feb 2008, 22:08
Nome Cognome: Giuliano della Vecchia
Slackware: 13.37-14.2
Kernel: 3.10.17-tiger / 4.4.88-smp
Desktop: kde4/xfce4
Località: Napoli

Re: [iptables] Regole sufficienti?

Messaggio da tigerwalk »

Ho sistemato lo script seguendo i tuoi consigli e pare che vada bene e non mi dia problemi.
Grazie!

Rispondi