Newsgroup: it.comp.os.linux.sys
Titolo: DNAT con IPTABLES

Ciao a tutti. Ovviamente ho un problema che non riesco a capire.
Ho la necessita' di reinstradare il traffico in arrivo da internet su una
certa porta di un firewall verso una ip di una rete locale. Io uso Red Hat
Linux 7.3.
Per impratichirmi ho usato un pc in locale sempre con Red Hat 7.3 e ho
provato a usare iptables per reinstradare il traffico diretto alla porta 80
verso un server http sempre della rete locale.
E' giorni che leggo gli HOWTO ma evidentemente o sono completamente
rincretinito oppure mi manca qualche cosa nella configurazione, in quanto
non sono riuscito a far funzionare nulla.
Nel pc di prova ho lasciato tutte le politiche di iptables di default su
ACCEPT e ho aggiunto la seguente riga:
iptables -t nat -A PREROUTING -p tcp -d 192.168.100.1 (l'ip del mio pc di
prova) --dport 80 -j NAT --to 192.168.100.100 (l'ip del nostro server http).
Ovviamente non ha funzionato: monitorando la rete ho visto che non viene
reinditizzato nulla verso l'ip 100.
Ho provato ad abilitare l'ip forward, ho provato a loggare il traffico che
arriva al pc di prova e sembra tutto normale, ma i pacchetti non vengono
reindirizzati verso il server http. Ho anche provato a reindirizzare il
traffico su due schede di rete diverse (metti che iptables non riesca a
reinstradare i pacchetti nella stessa rete...  non vedo perchè no ma non si
sa mai.... hihi)...
Se riuscite a darmi una mano....
Spero di essere stato abbastanza chiaro
Grazie
Guido


Verifica ceh iptables sia effettivamente caricato ed anche i suoi moduli.
Io uso:
iptables -t nat -A PREROUTING -d 192.168.100.1 -p tcp --dport 80 \
-j DNAT --to-destination 
192.168.100.100:80
Alessandro.

Grazie per il suggerimento, ma ho controllato con lsmod: tutti i moduli
vengono caricati correttamente. Ho anche provato a caricarli a mano, ma non
cambia nulla. Ho anche provato a mettere :80 in fondo come hai tu, ma non
cambia nulla...  Sono proprio sfortunato (per non dire altro.... hihi).
Grazie Alessandro e buon lavoro (almeno a per te che ti funziona... hihi)
Guido

 prova) --dport 80 -j NAT --to 192.168.100.100 (l'ip del nostro server http).
Ci sono svariati potenziali problemi.
Ovviamente "DNAT", era immagino un refuso.
In prima istanza, prova a specificare anche la porta di destinazione: --to
192.168.100.100:80
E' poi IMHO possibile che non funga perche' magari stai facendo un port
forwarding che passa su un'unica interfaccia (e mi e' parso, nella mia piccola
esperienza, che linux assuma in tal caso che non vi sia routing... e magari non
funge). Se invece hai due interfacce, c'e' un errore concettuale di fondo... in
quanto non e' corretto assegnare alle due indirizzi appartenenti alla stessa
rete (a meno che, se non erro, non faccia bridging...).
Ti conviene mettere un'altra scheda di rete (se non ti e' possibile, puoi anche
non separare fisicamente le due reti, assegnando alla dmz un'altra classe di
indirizzi).
Inoltre, se specifichi come destinazione prima del NAT (192.168.100.1) un'altro
indirizzo differente da quello primariamente assegnato all'interfaccia
interessata su linux, devi tirare su anche quell'indirizzo come aggiuntivo su
quella interfaccia (ip aliasing, eth0:0, eth0:1, e cosi via). Altrimenti, in
alternativa a questo, la tua linux-box dovrebbe essere conosciuta come router
dagli host e dai router interessati, e non ci sarebbe bisogno di tirare su
l'alias...
bye G.L.
--
La logica non attiene alla verosimiglianza delle ipotesi,
ma alla coerenza delle tesi con le ipotesi.

Ciao Gianluca, grazie per la risposta...
Mi č venuto in mente anche a me che forse linux non riesce a fare un
reinstradamento con un'unica scheda di rete (anche se non ne vedo il motivo)
e ho provato a fare la stessa cosa con due schede di rete e ovviamente ho
ridiretto il traffico da 192.168.100.1 a 192.168.200.100. Ho anche provato
specificando la porta dopo l'ip (
192.168.100.100:80
).
Comincio a pensare che il mio linux sia spiritato... hihi
Forse ho il primo pinguino fantasma.... hihi
Ciao e buon lavoro
Guido

 Forse ho il primo pinguino fantasma.... hihi
La cosa migliore che puoi fare e' postare l'output di:
ifconfig -a
route -n
iptables-save


 sa mai.... hihi)...
questo "metti che iptables non riesca a reinstradare i pacchetti nella 
stessa rete... " mi fa balenare il dubbio che tu stia cercando di 
redirigere pacchetti provenienti dall'interno della tua rete a una 
macchina all'interno della tua rete... se è questo il caso, non potrà 
mai funzionare. Ma forse ho capito male io.
Byez.
-- 
Emanuele "SKULL" Balla
-----------------------------------------------------------------------
Besides, I think [Slackware] sounds better than 'Microsoft', don't you?
(By Patrick Volkerding)

Ciao Emanuele, ho fatto varie prove con una e con due schede di rete...
Il problema comunque rimane, ma puo' essere per motivi diversi ... hihi
Ti posto il mio file di configurazione di iptables che viene lanciato
all'avvio del pc che fa da gateway tra una rete e l'altra. Tieni presente
che il tutto è funzionante solo in un "laboratorio di prova" cioè non sto
lavorando sulle macchine effettive, almeno fino a che non capisco il
problema.
Questo gateway di prova ha due schede di rete eth0 (ip 
192.168.0.201/24
) e
eth1 (
192.168.100.1/24
). Ho impostato che eth0 sia sulla rete "fidata"
interna e eth1 su quella esterna (tipo internet): è comunque solo in prova,
non sono in realtà collegato in internet...
Ho un server web all'indirizzo 192.168.0.100, quindi su eth0. Vorrei che da
un pc collegato alla rete di eth1 si possa accedere al server web dell'altra
rete in modo trasparente.
Ecco il mio file di configurazione di iptables:
-------------- Inizio del file ------------------
#!/bin/sh
#
# Variabili dello script
extip="192.168.100.1"
extint="eth1"
intint="eth0"
intnet="
192.168.0.0/24
"
# Inizializzazione di IPTABLES
iptables -t nat -F PREROUTING
iptables -t nat -F OUTPUT
iptables -t nat -F POSTROUTING
iptables -t mangle -F PREROUTING
iptables -t mangle -F OUTPUT
echo 1 > /proc/sys/net/ipv4/ip_forward
######################
# Politiche in Input #
######################
iptables -F INPUT
iptables -P INPUT DROP
# Loopback valido
iptables -A INPUT -i lo -s 0/0 -d 0/0 -j ACCEPT
# TRAFFICO INTERNO
# Il traffico interno viene accettato
iptables -A INPUT -i $intint -s $intnet -j ACCEPT
# TRAFFICO ESTERNO
# Blocco un tentativo di spoofing
iptables -A INPUT -i $extint -s $intnet -j LOG --log-prefix "Spoofing"
iptables -A INPUT -i $extint -s $intnet -j REJECT
# Abilito le porte che servono
iptables -A INPUT -i $extint -p tcp -s 0/0 --dport 80 -j ACCEPT
iptables -A INPUT -i $extint -p udp -s 0/0 --dport 80 -j ACCEPT
# Chiudo tutte le porte sotto la 1024
iptables -A INPUT -i $extint -p tcp -s 0/0 --dport :1024 -j DROP
iptables -A INPUT -i $extint -p udp -s 0/0 --dport :2050 -j DROP
# Tutte le connessioni all'IP pubblico vengono accettate
iptables -A INPUT -i $extint -s 0/0 -d $extip/32 -j ACCEPT
# Rifiutiamo il resto
iptables -A INPUT -s 0/0 -d 0/0 -j REJECT
###########################
# Politiche di forwarding #
###########################
iptables -t nat -F
iptables -F FORWARD
iptables -P FORWARD ACCEPT
# Attivo il MASQUERADE sui pacchetti diretti al di fuori della rete
iptables -t nat -A POSTROUTING -s $intnet -d ! $intnet -j MASQUERADE
# Loopback valido
iptables -A FORWARD -i lo -s 0/0 -d 0/0 -j ACCEPT
#######################
# Politiche di output #
#######################
iptables -F OUTPUT
iptables -P OUTPUT ACCEPT
# Ogni pacchetto della rete interna viene accettato
#iptables -A OUTPUT -o $intint -s 0/0 -d $intnet -j ACCEPT
iptables -A OUTPUT -s 0/0 -d $intnet -j ACCEPT
# Tutto cio' che esce  valido
iptables -A OUTPUT -o $extint -s $extip/32 -d 0/0 -j ACCEPT
# Loopback valido
iptables -A OUTPUT -o lo -s 0/0 -d 0/0 -j ACCEPT
################################
# Politiche di reinstradamento #
################################
iptables -t nat -A PREROUTING -i $extint -p tcp -d $extip --dport 80 -j
DNAT --to 
192.168.0.100:80
------------------  Fine del file -----------------------
Che cosa c'è che non va ???
Grazie dell'aiuto
Guido



 Che cosa c'è che non va ???
Non ti offendere, dovresti approfondire di piu': altrimenti anche un ng ti puo'
essere di scarso aiuto (netfilter.samba,org). Ripeto anche che e' meglio sapere
cosa c'e' in ifconfig e route.


Guido wrote:
[ snippo tutto perchč non ci capisco , mi pare che metŕ delle regole ]
[ non abbiano significato, ma forse non ho capito
[ come č fatta la tua rete...]
parti da una configurazione che non faccia filtering ma solo il dnat che 
ti serve, e il resto lo aggiungi dopo, regola per regola, quello che serve.
mettiamo che la tua situazione (se ho capito bene) sia
www-------------------[network A]
             |
             FW
             |
client-----------------[network B]
FW:
iptables -A PREROUTING -p tcp -d $ip-fw-interno --dport 80 -j DNAT 
--to-destination $ip-www
echo 1 > /proc/sys/net/ipv4/ip_forward
WWW:
route add -net ${network B} netmask ${quello_che_č} gw ${ip-fw-esterno}
e deve funzionare.
Il filtering fallo dopo.


Grazie a tutti dei preziosi consigli...  Come potete vedere sono un po'
novellino.
Ora faccio una cosa fatta benino: provo a riformattare la mia macchina
(tanto è di prova) e provo a ripsrtire da zero come consigliato e pian
pianino aggiungo le varie regolette cercando di seguire i consigli. Spero
che poi vada tutto.
Ciao a tutti e buon lavoro col...  pinguino !!
Guido

 che poi vada tutto.
Si, e' indubbiamente meglio andare per gradi, cosi' ho fatto io imparando
pian piano fra how-to e prove: poi, puoi mettere una macchina
sufficientemente sicura in produzione, affinandola successivamente.
