EDIT: ho risolto il problema.
Le policy di default andavano o messe con la attuale sintassi ALLA FINE del firewall, OPPURE messe all'inizio con la sintassi da policy
Codice:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
Qiuesto perché la sintassi che usavo finora bloccava i pacchetti senza mandarli alle successive regole del fw
Allora: ecco il mio firewall con alcuni commenti che indicano quello che nella mia idea dovrebbe fare.
Poiché tuttavia non funziona (ovvero tutte le connessioni tranne il DNS mi da "host not found", ci deve essere qualche errore... Mi aiutereste a trovarlo?
Si noti che in teoria tutte le regole che riguardano la scheda ethernet dovrebbero essere ininfluenti, visto che al momento non la sto usando (come confermato da ehtereal)
Codice:
#!/bin/bash
# script di configurazione iptables
# dati interfaccia interna
LO_INT="lo"
LO_ADDR=127.0.0.1/8
# dati interfaccia esterna
EXT_INT="ppp0"
IPADDR=`/sbin/ifconfig | grep -A 4 ppp0 | awk '/inet/ { print $2 } ' | sed -e s/addr://`
# dati scheda di rete
NET_INT="eth0"
NET_ADDR=192.168.1.0/24
Fin qui sono solo settaggi. Si noti che al momento non ho niente di connesso alla eht0.
Nella mia idea, dunque, nella rete esistono:
- loopback (che dovra' essere in grado di far tutto, altrimenti i vari servizi di sistema non potran funzionare a dovere)
- eth0 (scheda ethernet. Attualmente non ho nulla di attaccato ad essa, ma l'ho comunque configurata. Ethereal dice correttamente che non ci sono pacchetti che passano per essa.)
- ppp0 (modem adsl)
Codice:
#---------------------------------------------------------------
# Disable IP routing. Remember to enable if your firewall is protecting a
# network, NAT included
#---------------------------------------------------------------
echo '0' > /proc/sys/net/ipv4/ip_forward
# blocco ping verso la macchina (DOS attack)
echo '1' > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo '1' > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo '1' > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# disabilitato nel kernel
# echo '1' > /proc/sys/net/ipv4/tcp_syncookies
#---------------------------------------------------------------
# Disable routing triangulation. Respond to queries out
# the same interface, not another. Helps to maintain state
# Also protects against IP spoofing
#---------------------------------------------------------------
echo '1' > /proc/sys/net/ipv4/conf/all/rp_filter
# loggo i pacchetti malformati
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
echo '0' > /proc/sys/net/ipv4/conf/all/send_redirects
Questi sopra li ho trovati come altamente consigliati in molti tutorials. Comuqnue ho provato a commentare le linee, e non cambia nulla.
Codice:
modprobe ip_conntrack
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
modprobe iptable_nat
# salva le attuali impostazioni
iptables-save > iptables_precedente.txt
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables --delete-chain
iptables -t nat --delete-chain
iptables -t mangle --delete-chain
Inizializzato tutto.
Bene: qui sotto iniziano le regole sui pacchetti
Codice:
# default: blocca tutto in entrata e in passaggio,
# accetta tutto in uscita
iptables -A INPUT -p all -j DROP
iptables -A OUTPUT -p all -j ACCEPT
iptables -A FORWARD -p all -j DROP
Nessuna connessione puo' entrare o passare attraverso, mentre il traffico generato da me puo' uscire tranquillamente
Codice:
# l'interfaccia di loopback puo' tutto
iptables -A INPUT -i $LO_INT -p all -j ACCEPT
iptables -A OUTPUT -o $LO_INT -p all -j ACCEPT
Per l'appunto, altrimenti i processi interni sballano.
Codice:
# accetta i pacchetti in arrivo
# se sono collegati a connessioni preesistenti
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# permetti di accedere dall'esterno al server ssh
iptables -t filter -A INPUT -p tcp --dport 22 -i $EXT_INT -j ACCEPT
I pacchetti in arrivo sono abilitati solo in due casi:
- connessioni collegate a connessioni gia' esistenti (ossia aperte da me)
- connessioni al server ssh
Codice:
# abilitiamo il transito di pacchetti
# attraveso la rete interna
iptables -A FORWARD -i $NET_INT -j ACCEPT
iptables -A FORWARD -o $NET_INT -j ACCEPT
# abilitiamo i pacchetti icmp per la scheda di rete
iptables -A INPUT -i $NET_INT -p icmp -j ACCEPT
I pacchetti che vanno e vengono attraverso la scheda ethernet devono poter passare, per poter essere instradati da e verso un eventuale pc collegato alla porta ethernet.
Codice:
# abilitiamo il masquerading dei pacchetti
# in uscita dalla rete interna verso la rete esterna
iptables -t nat -A POSTROUTING -s $NET_ADDR -o $EXT_INT -j MASQUERADE
I pacchetti che passano attraverso la scheda di rete devono essere mascherati in modo da uscire dal modem con l'indirizzo IP del modem, non quello (riservato) della scheda di rete.
Codice:
# e infine abilitiamo l'attraversamento dei pacchetti
# tra un'interfaccia e l'altra
echo '1' > /proc/sys/net/ipv4/ip_forward