PDA

View Full Version : Firewall con iptables... chi ci coregge il compitino ?


_Jc_
04-04-2003, 11:24
Io e miei amici abbiamo cercato di creare uno script per farci un piccolo firewall casalingo con una macchina dedicata ad esso, e prendendo spunto da varie guide abbiamo realizzato questo piccolo script che pubblichiamo qui per farlo correggere e sperando che possa servire anche ad altri. :)
ilsensine che dici mi correggi il compitino :D ?

#!/bin/sh
#
## ========== IMPOSTAZIONE VARIABILI ========== ##
#
ipt="/sbin/iptables"
echo="/bin/echo"
lan=192.168.0.0/24
red=eth1
green=eth0
#
## ========== PULIZIA DELLE CATENE ========== ##
#
# RESET DELLE REGOLE INPUT, OUTPUT, FORWARD
$ipt -F
#
# DELETE DELLE CATENE CREATE DALL'UTENTE
$ipt -X
#
# RESET DEI CONTATORI
$ipt -Z
#
# RESET DELLE TABELLE DI MANGLE E DI NAT
$ipt -t mangle -F
$ipt -t nat -F
#
## ========== SETTAGGI DELLE REGOLE DI DEFAULT ========== ##
#
$ipt -P INPUT DROP
$ipt -P OUTPUT DROP
$ipt -P FORWARD DROP
#
## ========== SETTAGGI DI IPFORWARDING ========== ##
#
# DISABILITA L'IP FORWARDING
$echo "0" > /proc/sys/net/ipv4/ip_forward
#
# DISABILITA TUTTI GLI ECHO ICMP
$echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
#
# DISABILITA GLI ECHO BROADCAST ICMP
$echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#
# IMPOSTA LA PROTEZIONE CONTRO ATTACCHI SPOOFING
$echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
$echo "1" > /proc/sys/net/ipv4/tcp_syncookies
$echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
#
# ABILITA IL LOG IN /var/log/messages DEI PACCHETTI MALFORMATI E LI SCARTA AUTOMATICAMENTE
$echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
$echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
$echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
#
## ========== SETTAGGI NAT ========== ##
#
# ABILITA IL MASCHERAMENTO DEGLI INDIRIZZI LAN
$ipt -t nat -A POSTROUTING -s $lan -j MASQUERADE
#
## ========== SETTAGGI PERSONALIZZAZIONE FIREWALL ========== ##
#
# SCARTO DEI PACCHETTI MALFORMATI
$ipt -A INPUT -m unclean -j DROP
#
# ABILITA LA CONNESSIONE SSH LATO LAN
$ipt -A INPUT -s $lan -i $green -p tcp --dport 22 -j ACCEPT
$ipt -A OUTPUT -d $lan -o $green -p tcp --sport 22 -j ACCEPT
#
# SCARTA I PACCHETTI DESTINATI AL FIREWALL PROVENIENTI DALLA WAN
$ipt -A INPUT -i $red -j DROP
#
# BLOCCA I PACCHETTI IN USCITA DAL FIREWALL LATO WAN
$ipt -A OUTPUT -o $red -j DROP
#
# ABILITA DNS (53)
$ipt -A FORWARD -s $lan -p tcp --dport 53 -j ACCEPT
$ipt -A FORWARD -s $lan -p udp --dport 53 -j ACCEPT
$ipt -A FORWARD -d $lan -p tcp --sport 53 -j ACCEPT
$ipt -A FORWARD -d $lan -p udp --sport 53 -j ACCEPT
#
# ABILITA HTTP (80), HTTPS (443), PROXY (8080)
$ipt -A FORWARD -s $lan -p tcp --dport 80 -j ACCEPT
$ipt -A FORWARD -d $lan -p tcp --sport 80 -j ACCEPT
$ipt -A FORWARD -s $lan -p tcp --dport 8080 -j ACCEPT
$ipt -A FORWARD -d $lan -p tcp --sport 8080 -j ACCEPT
$ipt -A FORWARD -s $lan -p tcp --sport 443 -j ACCEPT
$ipt -A FORWARD -d $lan -p tcp --sport 443 -j ACCEPT
#
# ABILITA SMTP (25)
$ipt -A FORWARD -s $lan -p tcp --dport 25 -j ACCEPT
$ipt -A FORWARD -d $lan -p tcp --sport 25 -j ACCEPT
#
# ABILITA POP3 (110)
$ipt -A FORWARD -s $lan -p tcp --dport 110 -j ACCEPT
$ipt -A FORWARD -d $lan -p tcp --sport 110 -j ACCEPT
#
# BLOCCA TUTTI I PACCHETTI IN TRANSITO CHE NON SODDISFANO LE REGOLE
$ipt -A FORWARD -j DROP
#
# ABILITO L'IP FORWARD
$echo "1" > /proc/sys/net/ipv4/ip_forward
#
#
#
## ========== REGOLE DA VERIFICARE ========== ##
#
# $ipt -A FORWARD -d $lan -p icmp ! --icmp-type echo-request -j ACCEPT
# $ipt -A FORWARD -d $lan -p icmp ! --icmp-type time-exceeded -j ACCEPT
#iptables -N syn-flood
#iptables -A INPUT -i $red -p tcp syn -j syn-flood
#iptables -A syn-flood -m limit limit 1/s limit-burst 4 -j RETURN
#iptables -A syn-flood -j DROP
#iptables -A FORWARD -d $lan -p icmp -j ACCEPT

ilsensine
04-04-2003, 11:36
Giusto un esempio, vale anche per gli altri casi:

$ipt -A FORWARD -d $lan -p tcp --sport 443 -j ACCEPT

Ottimo, quindi chiunque da fuori può mandare pacchetti a suo piacimento dentro la tua lan, purché i pacchetti abbiano come porta sorgente la 443 :D
Aspè, qual'è l'indirizzo pubblico della tua lan che la hackko? :sofico:

Usa questa regola, vale per _tutte_ le situazioni nelle quali ricevi pacchetti di risposta (la puoi usare sia nella catenda di forward che di input, con le dovute modifiche):
$ipt -A FORWARD -d $lan -m state --state ESTABLISHED,RELATED -j ACCEPT

_Jc_
04-04-2003, 13:52
Inanzitutto grazie per la risposta :D

Se vuoi bombarci il nostro ip è 207.46.249.27 (www.microsoft.com :D:D:D)

Ottimo, quindi chiunque da fuori può mandare pacchetti a suo piacimento dentro la tua lan, purché i pacchetti abbiano come porta sorgente la 443 :cry: :cry: :cry:

Quindi la stessa cosa vale anche per la porta 80, 110 ect... allora dovrei scrivere le regole così ?

$ipt -A FORWARD -s $lan -p tcp --dport 80 -j ACCEPT
$ipt -A FORWARD -d $lan -m state --state ESTABLISHED,RELATED -j ACCEPT

in modo da poter far stabilire la connessione dalla mia lan verso la porta scelta e poi la seconda regola serve per poter ottenere le risposte su quella determinata porta ?

Non è che mi spiegheresti gentilmente l'utilità delle ultime regole dato che non sapevamo se utilizzarle o meno

Grazie per le risposte, e speriamo che questo script non serva solo a noi ma anche ad altri utenti sul forum :) [/code]

ilsensine
04-04-2003, 14:20
Basta che abiliti in ingresso una sola volta i pacchetti con stato established o related, e vale per tutte le situazioni.


# $ipt -A FORWARD -d $lan -p icmp ! --icmp-type echo-request -j ACCEPT
# $ipt -A FORWARD -d $lan -p icmp ! --icmp-type time-exceeded -j ACCEPT

Accetta tutti i pacchetti icmp tranne echo e timeout.
nb la documentazione dice che "!" va dopo --icmp-type...boh...


#iptables -N syn-flood
#iptables -A INPUT -i $red -p tcp syn -j syn-flood
#iptables -A syn-flood -m limit limit 1/s limit-burst 4 -j RETURN
#iptables -A syn-flood -j DROP

Una piccola protezione per i DoS. Blocca i pacchetti tcp di tipo syn troppo frequenti.
Nella seconda riga occorrerebbe scrivere "--syn", non "syn"
Guarda man iptables per altre informazioni sui pacchetti syn; probabilmente nel tuo caso devi bloccare i pacchetti syn del tutto.


#iptables -A FORWARD -d $lan -p icmp -j ACCEPT

Accetta tutti i pacchetti icmp destinati alla lan. Se è questo che vuoi, le righe su echo-request e time-exceeded non hanno senso.

_Jc_
04-04-2003, 14:45
[color=red][color]
Dovremmo offrirti una cena per l'aiuto che ci stai dando :)

Secondo te ha senso specificare le due regole :
$ipt -A FORWARD -d $lan -p icmp ! --icmp-type echo-request -j ACCEPT
$ipt -A FORWARD -d $lan -p icmp ! --icmp-type time-exceeded -j ACCEPT

anche se all'inizio abbiamo inserito :
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

E quella "piccola" protezione contro i DoS secondo te è utile , necessaria o perfezionabile ?
Scusa la valanga di domande ma ne ho ancora una "Le sai tutte ?" :D:D:D:D[/code]

ilsensine
04-04-2003, 14:49
Originally posted by "_Jc_"


Secondo te ha senso specificare le due regole :
$ipt -A FORWARD -d $lan -p icmp ! --icmp-type echo-request -j ACCEPT
$ipt -A FORWARD -d $lan -p icmp ! --icmp-type time-exceeded -j ACCEPT

anche se all'inizio abbiamo inserito :
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

Bè credo proprio di no


E quella "piccola" protezione contro i DoS secondo te è utile , necessaria o perfezionabile ?
Scusa la valanga di domande ma ne ho ancora una "Le sai tutte ?" :D:D:D:D
Inutile, se non hai servizi accessibili dall'esterno, tipo un server web o simili.

DaRkBoDoM
04-04-2003, 17:59
$ipt -t mangle -F


Io non resetterei la catena di mangle, in quanto nello script non ne fai utilizzo e, così facendo, potresti invece cancellare impostazioni messe da altri script (X es io su mangle ho il filtro dei pacchetti QOS su ppp0 che e' gestito da uno script a parte)


# ABILITA IL LOG IN /var/log/messages DEI PACCHETTI MALFORMATI E LI SCARTA AUTOMATICAMENTE


Si dice LOGGING :P


# BLOCCA TUTTI I PACCHETTI IN TRANSITO CHE NON SODDISFANO LE REGOLE
$ipt -A FORWARD -j DROP


Visto che la policy di default e' DROP, questo e' abbastqanza inutile :D


# $ipt -A FORWARD -d $lan -p icmp ! --icmp-type echo-request -j ACCEPT
# $ipt -A FORWARD -d $lan -p icmp ! --icmp-type time-exceeded -j ACCEPT


Così i timeout riescono a passare in quanto matchano la prima regola... io farei qualcosa tipo:
$ipt -A FORWARD -d $lan -p icmp --icmp.type echo-request -J DROP
$ipt -A FORWARD -d $lan -p icmp --icmp.type time-exceeded -J DROP
$ipt -A FORWARD -d $lan -p icmp -J ACCEPT

Inoltre non includerei la LAN nelle limitazioni del Syn Flood almeno che tu non abbia motivi particolari per considerarla insicura.

Ciao

Daniele
04-04-2003, 20:04
io non ne capisco quasi niente, ma se lo ripubblichi con tutte le correzioni mi fai un piacere...
:D :D