Newsgroup: it.comp.os.linux.sys
Titolo: Redirezione Porta con iptables

Ho installato iptables su una macchina Debian con due schede di rete:
eth0 con ip privato 192.168.1.7
eth1 con ip pubblico 100.100.100.100
Non riesco a redirigere il traffico web destinato all'indirizzo pubblico su
una macchina interna che ha indirizzo 192.168.1.2. Vi posto il mio script,
mi sapete dire dove sbaglio?
Grazie.
#Abilita ip forwarding e disabilita ICMP
/bin/echo 1 > /proc/sys/net/ipv4/ip_forward
/bin/echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#Definizione policy pre le 3 catene di default
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#Abilita il traffico sull'interfaccia di loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#Abilita NAT su interfaccia esterna
iptables -t nat -A POSTROUTING -o eth1 -s 
192.168.1.0/24
 -j SNAT --to
100.100.100.100
#Redirezione porta www
iptables -t nat -A PREROUTING -d 100.100.100.100 -p tcp --dport 80 -j
DNAT --to-destination 
192.168.1.2:80
iptables -A FORWARD -i eth1 -d 100.100.100.100 -p tcp --dport 80 -j ACCEPT
#Consenti pacchetti relativi a connessioni gią stabilite
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#Abilita traffico in uscita
iptables -A FORWARD -i eth0 -o eth1 -s 
192.168.1.0/24
 -p all -j ACCEPT

 iptables -A FORWARD -i eth1 -d 100.100.100.100 -p tcp --dport 80 -j ACCEPT
Devi mettere l'ip privato 192.168.1.2, e non quello pubblico 
100.100.100.100
:
l'indirizzo di destinazione dei pacchetti riguardanti questo DNAT e' gia'
traslato quando questi attraversano la catena FORWARD (PREROUTING precede
FORWARD).
bye G.L.
--
La logica non attiene alla verosimiglianza delle ipotesi,
ma alla coerenza delle tesi con le ipotesi.


Grazie, ma neanche cosi' sembra funzionare. Possono esserci altri errori
nello script?
Grazie.

 Grazie.
Le regole per established e related: leggi il thread precedentente "problemi
con iptables".


 con iptables".
Mi sembra che queste regole ci siano.
#Consenti pacchetti relativi a connessioni già stabilite


 Mi sembra che queste regole ci siano.
Vero... il caldo.   :-)
Se provi con l'ip pubblico dall'interno della tua lan, e' l'host
"dnattato" fa parte della stessa lan, e' probabile che non funzioni:
devi provare dall'esterno.


 devi provare dall'esterno.
Infatti provo dall'esterno collegandomi via modem ad un qualsiasi provider
:-))
Dai pc della mia lan se scrivo sul browser l'IP privato del web server
funziona, da fuori non c'è verso...

 funziona, da fuori non c'è verso...
non saprei cosa dirti: prova a usare il target LOG di iptables, e/o usare
tcpdump.


 script, mi sapete dire dove sbaglio?
SPOT:
www.skullkrusher.net/linux/iptables.html
Ciao! ;-)
-- 
Emanuele Balla  aka Skull -  Public Key #661E5CBF on 
www.keyserver.com
+----------------------------------------------------------------------+
"And 1.1.81 is officially BugFree(tm), so if you receive any bug-reports
on it, you know they are just evil lies." (By Linus Torvalds)


Grazie. Avevo giŕ guardato il tuo sito, ma nonostante ciň non capisco dove
sia l'errore nello script.

 dove sia l'errore nello script.
Difficile fare ipotesi partendo solamente dall'aspetto del tuo script:
non ho tempo di provarlo e bisognerebbe vedere il comportamento a livello
di rete per capire cosa non va.
Comunque:
#Abilita ip forwarding e disabilita ICMP
/bin/echo 1 > /proc/sys/net/ipv4/ip_forward
/bin/echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# e fin qui ok.
#Definizione policy pre le 3 catene di default
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Ok dando per scontato che tu faccia in ogni caso un flush da qualche
# altra parte prima di iniziare a creare le regole...
#Abilita il traffico sull'interfaccia di loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#Redirezione porta www
iptables -t nat -A PREROUTING -i eth1 -d 100.100.100.100 -p tcp --dport 80 -j
DNAT --to-destination 192.168.1.2
# Qui ho aggiunto il match sull'interfaccia di provenienza (vedi problema
# redirect da interno su sito...). Ho eliminato la specificazione della
# porta destinazione del nat, tanto č invariata...
iptables -A FORWARD -i eth1 -d 192.168.1.2 -p tcp --dport 80 -m state
--state NEW -j ACCEPT
# Qui ho aggiunto il match sullo state e cambiato l'ip destinazione
# poichč quando passa di qui il pacchetto č giŕ nattato...
#Abilita NAT su interfaccia esterna
iptables -t nat -A POSTROUTING -o eth1 -s 
192.168.1.0/24
 -j SNAT
--to-source 100.100.100.100
# Questa l'ho spostata sotto per questioni di "eleganza" e di facilitŕ di
# organizzazione: meglio specificare *prima* le regole specifiche e *poi*
# quelle generiche; altrimenti la regola generica puň matchare il
# pacchetto *prima* della specifica, col risultato che la specifica non
# viene attraversata. Qui in teoria le regole si occipano di catene
# diverse, ma se queste non sono le uniche regole del tuo script tienine
# conto...
#Abilita traffico in uscita
iptables -A FORWARD -i eth0 -o eth1 -s 
192.168.1.0/24
 -p all -j ACCEPT
# Questa la metto qui per le stesse ragioni di organizzazione, ma non
# cambia nulla
#Consenti pacchetti relativi a connessioni giŕ stabilite
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Questi potrebbe essere una idea metterli in cima: eviti che traffico
# established attraversi tutte le rules prima di venire accettato.
# E' comunque questione di ottimizzazione e basta.
# Altra cosa da specificare (ma abbastanza ovvia) č che la macchina sulla
# quale redirigi il traffico (la 192.168.1.2) abbia il FW su cui gira
# iptables come default gateway. Per il resto lo script dovrebbe essere ok
# cosě...
# Se anche cosě non funziona, usa uno sniffer per capire cosa sta
# esattamente passando sulla tratta.
# Byez...
# Uno Skull commentato...


Kalinikos wrote:

Gia'... probabilmente il problema lo ha centrato skull: mancano in testa le
flush per lo svuotamento delle catene e l'eliminazione delle catene
personalizzate. Puoi verificare se e' vero con "iptables -L" o
"iptables-save".
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -X


 # esattamente passando sulla tratta.
Grazie mille per i consigli. Ora faccio ancora un po' di prove...
Ciao.

 iptables -A FORWARD -i eth1 -d 100.100.100.100 -p tcp --dport 80 -j ACCEPT
Secondo me, e' sbagliata la destinazione di questa regola... credo che
tu debba mettere 
iptables -A FORWARD -i eth1 -d 192.168.1.2 -p tcp --dport 80 -j ACCEPT
perche' il tuo pacchetto e' gia' stato DNATtato, quindi il suo IP di
destinazione non e' piu' 100.100.100.100
D'altro canto la catena forward e' destinata a IP diversi da
100.100.100.100, mentre tu hai messo proprio una regola con destinazione
100.100.100.100, che dovrebbe appartenere alla catena INPUT
Speriamo di non averne detta una grossa... :) e soprattutto di essere
stato d'aiuto
ciao 
gluca

 100.100.100.100, che dovrebbe appartenere alla catena INPUT
INPUT, OUTPUT, FORWARD, il discorso e' completamente scollegato dalla messa in
ballo di indirizzi pubblici e/o privati.
bye G.L.

 bye G.L.
ciao gluca

 destinazione del router nella catena FORWARD.
Si, ma la regola in questione era preceduta da un NAT in PREROUTING, per
cui in realtà quella regola non matcherà mai nulla: è corretto metterla
in FORWARD, ma bisogna metterla che matchi il nuovo ip di destinazione.
Byez.
