Newsgroup: it.comp.reti.locali
Titolo: dubbio sul funzionamento dns e iptables in una rete mista linux/windows

ciao, vi spiego la mia situazione... e i miei dubbi
Firewall linux debian con 2 eth (una al router e una alla rete) 192.168.0.1 
e 10.10.1.1
Server dns windows 2003 con AD 10.10.1.3
La mia curiosità è la seguente:
quando da un pc della rete ( 10.10.1.4) vado a digitare nel browser
www.debian.it
 i pacchetti che giro fanno prima
di darmi la pagina web disponibile?
Presumo ci sia prima un interrogazione dns e poi html...
Funziona cosi ??
una volta dato invio alla browser il pc (10.10.1.4 ) interroga il dns
(10.10.1.3) su chi sia 
www.debian.it
 ..
Il server dns 10.10.1.3 gli risponde e poi sempre il pc 10.10.1.4 dice
al fw 10.10.1.1 di andare a interrogare
la porta 80 del sito 
www.debian.it
 e spedisce i pacchetti assumendo l'ip
pubblico di quel momento (MASQUERADE)
quindi quando interrogo il dns il pacchetto del pc 10.10.1.4 non passa
per il fw ? ma è il pacchetto del mio server
che passa per il fw per effettuare l'interrogazione.
Fin qui è corretto?
Una volta che il sito risponde le pagine vengono inviate al mio ip
pubblico , vengono passate al fw 10.10.1.1 il quale
fa la funzione inversa del MASQUERADE e le passa al pc 10.10.1.4
Tutto questo per capire come devo impostare iptables volendo creare
delle regole restrittive che vanno a gestire ogni
singolo servizio (53 - 80 ...) e che consentano ai pc della mia rete e
ai due server di navigare in internet
se cio che ho scritto è corretto allora devo:
1) Permettere al server 10.10.1.3 di passare per il fw per interrogare
il dns --> regola di forward.
2) Deve uscire facendo il masquerade? quindi ci vorra anche una regola 
POSTROUTING
3) Permettere al pc della rete 10.10.1.4 di passare per il fw avendo come 
porta di destinazione la 80 --> Forward
4) Deve uscire facendo il masquerade? quindi ci vorra anche una regola 
POSTROUTING
La strada di ritorno invece i pacchetti la conoscono già o devo fare
qualcosa?
Attendo notizie..
grazie

 qualcosa?
Per il NAT ci pensa il firewall senza che tui gli dica niente: insomma,
non devi applicare alcuna NAT "inversa" (anche perchè vorrei vedere come
la si fai, per l'inverso del "MASQUERADE"... :-D).
Per il filtraggio volendo anche, basta che il ruleset sia scritto
facendo riferimento agli stati e non "solamente alle porte".
Su 
http://www.skullkrusher.net/
 ci sono un ruleset di esempio con tanti
commenti, e un paio di spiegazioni in italico idioma sui principi di
base di iptables e della state machine (forse un po' "tirati" dato che
mi ripromettevo di riprenderli e completarli, ma non lo ho mai fatto...).
Li ho scritti un bel po' di anni fa, ma iptables, su quei meccanismi,
non è cambiato...
- --
Skull & Bones (ER6n Silver)
Neo:  I know Sendmail!
Morpheus:  Show me.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)
iD8DBQFGJMJF8THo01J+SBERAtLdAJ9Sn4CDcz5IVw2lqyR/ZqKmeWlfxgCfWYWt
hG3XJmCc9YNJXVhDB/TFlGs=
=yGzh
-----END PGP SIGNATURE-----

 qualcosa?
Il snat/masquerade di netfilter/iptables lo sa gia'... :-)
E operando il filtraggio sulla chian forward per realizzare il firewall,
le opportune regole (come concettualmente/sommariamente ho cercato di
descrivere sopra) sanno gia' anche loro cosa far passare e cosa no. ;-)
bye G.L.
-- 
Renaissance, aka Gian Luca Sole
Per rispondere, togli nospam letto al contrario, e cambia nazione.
"E' assolutamente evidente che l'arte del cinema si ispira
alla vita, mentre la vita si ispira alla TV" - Woody Allen

 ha scritto nel messaggio 
news:f02krb$i62$1...@tdi.cu.mi.it...

Alla fine ho fatto cosi:
configurazione paranoica di iptables direi.. ma penso sia
utile x capire come vengono trasmessi i pacchetti.
Innanzitutto spiego la mia situazione.
Server linux debian con 2 eth (eth0 192.168.0.2 eth1 10.10.1.1) collego ad 
un
router 192.168.0.2
Questo server mi fa da firewall e server mail.
Server dns windows con ip 10.10.1.3
Parto dal fatto che ho messo a DROP tutte le regole di default
INPUT - FORWARD - OUTPUT - PREROUTING E POSTROUTING.
Per ora mi sono limitato a creare delle regole che mi consentono di 
risolvere
il dns esterno e di navigare da un pc.
Ecco ciò che ho scritto:
###### GESTIONE DNS
####################################################################################
###### IP DNS 10.10.1.3 (SERVER WINDOWS)
## FASE 1: UN PC INTERROGA IL DNS 10.10.1.3 PER RISOLVERE L'INDIRIZZO DI UN
SITO WEB - LINUX NON FA NULLA
## FASE 2: IL DNS 10.10.1.3 INTERROGA INTERNET PER RISOLVERE L'INDIRIZZO
## IL SERVER LINUX DEVE FAR PASSARE IL PACCHETTO UDP PER IL DNS DEL PROVIDER
## PERCORSO DI ANDATA DEL PACCHETTO UDP
iptables -t nat -A POSTROUTING -p udp --dport 53 -s 10.10.1.3 -j MASQUERADE
iptables -t filter -A FORWARD -p udp -s 10.10.1.3 -d 0/0 -j ACCEPT
iptables -t filter -A INPUT -p udp -i eth1 --sport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
## IL DNS DEL PROVIDER RISPONDE E IL PACCHETTO RITORNA INDIETRO
iptables -t filter -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp -o eth1 --dport 53 -j ACCEPT
iptables -t filter -A FORWARD -p udp -s 10.10.1.3 -d 0/0 -j ACCEPT
iptables -t nat -A PREROUTING -p udp --dport 53 -d 10.10.1.3 -j DNAT --to 
10.10.1.3:53
##### GESTIONE NAVIGAZIONE WEB
###########################################################################
####  DA PC CON IP 10.10.1.3
####  PACCHETTO IN ANDATA
iptables -t filter -A FORWARD -p tcp -s 10.10.1.3 -d 0/0 --dport 80 -j 
ACCEPT
iptables -t nat -A POSTROUTING -p tcp --dport 80 -s 10.10.1.3 -j MASQUERADE
#### PACCHETTO IN RITORNO
iptables -t filter -A FORWARD -p tcp -d 10.10.1.3 -s 0/0 --sport 80 -j 
ACCEPT
iptables -t nat -A PREROUTING -p tcp -s 0/0 -d 10.10.1.3 --dport 80 -j 
DNAT --to 
10.10.1.3:80
Avendo impostato a drop le policy di default devo specificare
passo dopo passo ciò che il pacchetto fa..
Diciamo che il discorso funziona ma volevo sapere da voi se è corretto come
funzionamento delle regole anche se sicuramente è troppo paranoica..
ciao 

 funzionamento delle regole anche se sicuramente č troppo paranoica..
Piu' che paranoica, e' un po' IMHO pasticciata e non tanto sicura come
credi. ;-) Mo' ti faccio un esempio. E, non ti offendere, ma prima di
capire come funziona iptables bisogna innanzitutto avere le idee chiare
su come funziona il tcp/ip, e solo dopo questo... si puo' andare di
filato su 
netfilter.org
. E solo dopo aver spulciato bene netfilter,
cercare degli script di esempio per semplificarsi la vita, script da
affinare via via con l'esperienza;-)
1) dns usa anche tcp.
2) Inutile mettere tante regole di masquerading quanti sono i
    protocolli che vuoi consentire, per quello basta la chain
    forward.
3) Il prerouting serve per i destination nat: si spera che tu non
    voglia fare del tuo server un server dns pubblico... :-D
4) Meglio usare la capacita' "stateful" di netfilter, che semplifica
    notevolmente le cose per i pacchetti "di ritorno"
Il tutto diventerebbe, molto semplicemente:
#!/bin/bash
# Variabili utili allo script
IPT="/sbin/iptables"
LAN="
10.10.1.0/24
"
SERVER="10.10.1.3"
IP_FW="10.10.1.1"
EXT_IF="eth1"
LAN_IF="eth0"
# Initializzazione catene e policy
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -X
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT
# Source Nat
# n.b.: va bene anche MASQUERADE, ma piu' che altro e' utilizzato
quando non si conosce a priori l'ip dell'interfaccia esterna.
$IPT -t nat -A POSTROUTING -s $LAN -o $EXT_IF -j SNAT --to $IP_FW
# FORWARD RULES
# Innanzitutto facciamo passare qualunque pacchetto apparentente
# o in relazione a connessioni gia' stabilite (n.b.: sia in uscita
# che in ingresso)
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Faccio passare il dns (consente nuove connessioni iniziate
# dal Server)
$IPT -A FORWARD -i $INT_IF -o $EXT_IF -m state --state NEW \\
-p tcp -s $SERVER --dport domain -j ACCEPT
$IPT -A FORWARD -i $INT_IF -o $EXT_IF -m state --state NEW \\
-p UDP -s $SERVER --dport domain -j ACCEPT
# Consento la navigazione web alla lan
$IPT -A FORWARD -i $INT_IF -o $EXT_IF -m state --state NEW \\
-p tcp -s $LAN --dport www -j ACCEPT
$IPT -A FORWARD -i $INT_IF -o $EXT_IF -m state --state NEW \\
-p tcp -s $LAN --dport https -j ACCEPT
$IPT -A FORWARD -i $INT_IF -o $EXT_IF -m state --state NEW \\
-p tcp -s $LAN --dport ftp -j ACCEPT


 iptables -t filter -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
quindi, vediamo un po'...
Non fai alcuna restrizione sull'IP sorgente, ma anche se la facessi
sarebbe secondario (dato che UDP è connectionless, è banale forgiarne la
sorgente).
Ergo, chiunque io sia, posso creare un pacchetto che provenga dalla mia
porta 53 UDP e per questo tramite contattare qualsiasi servizio/porta
UDP della tua macchina...
Poco paranoico, francamente... ;-)
Un consiglio: prima di cimentarti effettivamente nella scrittura di un
ruleset, parti dalle basi e dalla teoria, soprattutto su cosa sono e a
cosa servono gli stati.
Stai usando iptables come fosse ipchains, adottando concetti e approcci
che son superati da una decina d'anni....
Praticamente, un bisturi usato per segare tronchi...
- --
Skull & Bones (ER6n Silver)
Neo:  I know Sendmail!
Morpheus:  Show me.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Darwin)
iD8DBQFGJyzD8THo01J+SBERAjZdAJ4pBr6cnlE58lbPtYsou7tS8kf2XwCggq+5
rQAIRmVGFYxhvg4jDehbGmE=
=xWxr
-----END PGP SIGNATURE-----

ecco alla fine cosa ho realizzato..
##################################################################################################
##### DEFAULT CHAIN
##################################################
# Imposto le policy per i pacchetti in ingresso bloccando il traffico
iptables -P INPUT DROP
# Imposto le policy per i pacchetti in transito tra le due interfacce
bloccando il traffico
iptables -P FORWARD DROP
# Imposto la policy per i pacchetti in uscita bloccando il traffico
iptables -P OUTPUT ACCEPT
# Imposto la policy per postrouting e prerouting bloccanto il traffico
#iptables -t nat -P POSTROUTING DROP
#iptables -t nat -P PREROUTING DROP
##### END DEFAULT CHAIN
##################################################################################################
######## REGOLE PERSONALIZZATE
##################################################
# ABILITO IL MASQUERADE PER I PC DELLA RETE
iptables -t nat -A POSTROUTING -s 
10.10.1.0/24
 -o eth0 -j MASQUERADE
# ABILITO IL FORWARD DEI PACCHETTI CHE HANNO QUALCHE RELAZIONE CON LE 
CONNESSIONI ESITENTI
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ABILITO IL DNS DA PARTE DEL SERVER DNS
iptables -t filter -A FORWARD -p tcp -i eth1 -o eth0 -s 10.10.1.3 --dport 
53 -m state --state NEW -j ACCEPT
iptables -t filter -A FORWARD -p udp -i eth1 -o eth0 -s 10.10.1.3 --dport 
53 -m state --state NEW -j ACCEPT
# ABILITO LA NAVIGAZIONE DEI PC DELLA RETE
iptables -t filter -A FORWARD -p tcp -i eth1 -o eth0 -s 
10.10.1.0/24
 --dport 
80 -m state --state NEW -j ACCEPT
iptables -t filter -A FORWARD -p tcp -i eth1 -o eth0 -s 
10.10.1.0/24
 --dport 
443 -m state --state NEW -j ACCEPT
# ABILITO LOCALHOST PER LEGGERE LE MAIL DAL SERVER E ALTRO
iptables -t filter -A INPUT -p tcp -i lo -j ACCEPT
# MAIL - DO LA POSSIBILITA DI SCARICARE (IMAP) E INVIARE MAIL AGLI UTENTI 
DELLA RETE
iptables -t filter -A INPUT -p tcp -i eth1 -s 
10.10.1.0/24
 --dport 143 -j 
ACCEPT
iptables -t filter -A INPUT -p tcp -i eth1 -s 
10.10.1.0/24
 --dport 25 -j 
ACCEPT
# TELNET - DO LA POSSIBILITA DI COLLEGARMI IN TELNET ALLA MACCHINA SOLO 
DALLA RETE LAN
iptables -t filter -A INPUT -p tcp -i eth1 -s 
10.10.1.0/24
 --dport 23 -j 
ACCEPT
# PING - ABILITO IL PING DALLA RETE VERSO L'ESTERNO E VERSO IL FW
iptables -t filter -A FORWARD -p icmp -i eth1 -o eth0 -s 
10.10.1.0/24
 -j 
ACCEPT
iptables -t filter -A INPUT -p icmp -i eth1 -s 
10.10.1.0/24
 -j ACCEPT
# FTP - ABILITO FTP
iptables -t filter -A FORWARD -p tcp -i eth1 -o eth0 -s 
10.10.1.0/24
 --dport 
20 -j ACCEPT
iptables -t filter -A FORWARD -p tcp -i eth1 -o eth0 -s 
10.10.1.0/24
 --dport 
21 -j ACCEPT
#************************************* FINE
Tutto funziona, ho xň alcune domande in merito.
- # ABILITO IL MASQUERADE PER I PC DELLA RETE
iptables -t nat -A POSTROUTING -s 
10.10.1.0/24
 -o eth0 -j MASQUERADE
Perchč se modifico la regola sopra in
iptables -t nat -A POSTROUTING -i eth1 -o eth0 -s 
10.10.1.0/24
 -j MASQUERADE
non funziona piů nulla??
- Altra cosa. E' bene lasciare ad "ACCEPT" la regola di OUTPUT?
- Infine..
# ABILITO LOCALHOST PER LEGGERE LE MAIL DAL SERVER E ALTRO
iptables -t filter -A INPUT -p tcp -i lo -j ACCEPT
Subito avevo scritto:
iptables -t filter -A INPUT -p tcp -i lo --dport 143 -j ACCEPT
iptables -t filter -A INPUT -p tcp -i lo --dport 25 -j ACCEPT
ma quando riavviavo il pc ci metteva una vita a partire (10 minuti..)
attendava secondo me il time out di qualcosa scaduto il quale faceva partire 
gli altri servizio.
Ho tolto le porta e reso la regola piů "aperta" e tutto ora va bene.
Perche secondo voi? Bloccavo qualche servizio?
ciao