Newsgroup: it.comp.sicurezza.varie
Titolo: Problema con Iptables e redirezione server

Il problema è questo ... funziona tutto tranne che non riesco a
redirigere il traffico interno di una LAN verso il server WEB che si
trova nella stessa LAN ... la configurazione della rete è la seguente
(lo so non c'è una DMZ):
          ------------        ------------        ----------
          |          |        |          |        |        |
 1.1.1.1 -|  ROUTER  |--------| FIREWALL |--------|  LAN   | 
          |          |        |          |        |        |
          ------------        ------------        ----------
L'IP esterno (del router) è fisso ... supponiamo 1.1.1.1 ... il router
ha un indirizzo verso il firewall 192.168.1.1, l'interfaccia del
firewall verso il router è 192.168.1.2 (eth1), mentre l'interfaccia
del firewall verso la LAN è 10.0.0.1 (eth0) ... la LAN ha un range di
indirizzi 
10.0.0.0/24
 ... mentre l'indirizzo IP del server web interno
è 10.0.0.101.
Effettuando il comando iptables -L -vn -t nat ottengo:
Chain PREROUTING (policy ACCEPT 1685K packets, 173M bytes)
 pkts bytes target     prot opt in     out     source              
destination
    0     0 DNAT       tcp  --  eth0   *       
10.0.0.0/24
 
1.1.1.1            tcp dpt:80 to:
10.0.0.101:80
   14   672 DNAT       tcp  --  eth1   *       
0.0.0.0/0
 
192.168.1.2        tcp dpt:80 to:
10.0.0.101:80
    0     0 DNAT       tcp  --  eth1   *       
0.0.0.0/0
 
192.168.1.2        tcp dpt:22 to:
10.0.0.101:22
    0     0 DNAT       tcp  --  eth1   *       
0.0.0.0/0
 
192.168.1.2        tcp dpt:1099 to:
10.0.0.101:1099
Chain POSTROUTING (policy ACCEPT 207K packets, 9956K bytes)
 pkts bytes target     prot opt in     out     source              
destination
    7   378 SNAT       all  --  *      eth1    
10.0.0.0/24
 
0.0.0.0/0
          to:192.168.1.2
Chain OUTPUT (policy ACCEPT 1642 packets, 98999 bytes)
 pkts bytes target     prot opt in     out     source              
destination
il problema è che dall'esterno riesco ad arrivare al server web
interno con 
http://1.1.1.1
 mentre dall'interno se provo a navigare
verso l'indirizzo 
http://1.1.1.1
 non riesco a raggiungere il server
web ... l'unico modo per raggiungerlo è 
http://10.0.0.101
 ... adesso
ho la necessità di arrivare al server web dall'interno tramite
http://1.1.1.1
 ... come devo fare ?!?!
Premetto che ho impostato la seguente regola di NAT per cercare di
reindirizzare il traffico dall'interno verso il server WEB ... ma
niente da fare !!!
$IPTABLES -t nat -A PREROUTING -p tcp -i $IFACE_LAN -s $INTERNAL_IP -d
$FIREWALL_EXT --dport $PORT_HTTP -j DNAT --to-destination
$WEBSERVER_LAN:$PORT_HTTP
Se provo a fare un traceroute dall'interno verso l'indirizzo 1.1.1.1
... il route arriva al 10.0.0.1 (indirizzo IP del firewall interno) ma
poi si blocca.
Grazie per l'aiuto.

 192.168.1.2        tcp dpt:1099 to:
10.0.0.101:1099
iptables -L FORWARD -nv che ritorna?
-- 
cat: .signature: No such file or directory

 iptables -L FORWARD -nv che ritorna?
huh, pardon.. mi sembravi avessi fatto una cosa ma non l'hai fatta, pare...
letto questo? 
http://www.skullkrusher.net/linux/iptables.html
ultimo caso...


 iptables -L FORWARD -nv che ritorna?
ritorna questo ... mi sembra tutto ok ... è quello che è strano ... 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source              
destination
59770   57M ACCEPT     all  --  eth0   *       
0.0.0.0/0
 
0.0.0.0/0
45558   13M ACCEPT     all  --  *      *       
0.0.0.0/0
 
0.0.0.0/0
          state RELATED,ESTABLISHED
  802 38500 ACCEPT     tcp  --  eth1   eth0    
0.0.0.0/0
 
0.0.0.0/0
          tcp dpt:80
le policy di sicurezza impostate con iptables 'dovrebbero' essere
corrette in quanto il firewall fa il suo dovere ... l'unico prob è che
dalla rete interna non si riesce ad accedere al server con l'indirizzo
IP internet ma solo quello interno ... ho fatto un traceroute
all'indirizzo IP pubblico e noto che si ferma allo 10.0.0.1
(praticamente l'interfaccia di rete interna del firewall) poi si perde
!!!

 
http://www.skullkrusher.net/linux/iptables.html
ciao, segnala il link su it*linux.iniziare , non per lusingarti ma il doc e' ben
fatto e risponde alla maggior parte delle domande che vengono fatte su
quel NG
-- 
| Ciao Cacciavite          Linux Registered User #297089
| Powered by *Debian GNU/Linux 3.0* on  PentiumII 400Mhz
| E-mail:            caccia...@TOGLIQUESTOtiscali.it

 !!!
Devi stare attento solo a un paio di cose:
1) una comunicazione da interno a interno passa per la regola 
iptables -A FORWARD -i $int_dev -o $int_dev
se questa non è accettata (implicitamente o esplicitamente) non vai da
nessuna parte (questo mi pare ok, perchè mi pare che la prima rule sia
del tipo "iptables -A FORWARD -i $int_dev -j ACCEPT" o similare, quindi
prende dentro anche quella sopra)
2) la sessione di ritorno. Se non viene gestita correttamente,
non va una mazza. leggi il link postato...
Hola...


 quel NG
gią lo feci a suo tempo, ma c'č di meglio che passare il tempo
rispondendo a link ;-)
Se poi qualcuno volesse linkare dalle faq, io non so nulla al riguardo...
Tanto, poi, non le legge nessuno.... :-P


sto pensando di utilizzare dnsmasq ... non so ... me rode il kulo che
non riesco a far andare il tutto con netfilter ... :(

 non riesco a far andare il tutto con netfilter ... :(
e perchè non ci riesci?


 e perchè non ci riesci?
perché non riesco (come ho detto) riuscire a far puntare all'indirizzo IP
pubblico da un pc interno ... visto che ho provato un centinaio di
combinazioni di regole di iptables senza successo ... sto pensando che il
problema possa dipendere da dns ... altrimenti ... che cosa potrebbe
essere ?!?!
come già ti ho detto ... facendo un traceroute da una macchina interna
ottengo il risultato che arriva al 10.0.0.1 (l'interfaccia interna del
firewall) eppoi si perde ... 
traceroute 
www.server.it
traceroute to 
www.server.it
 (1.1.1.1), 30 hops max, 38 byte packets
 1  10.0.0.1 (10.0.0.1)  0.417 ms  0.194 ms  0.197 ms
 2  * * *
e cosi via ...
ho provato con regole di prerouting e postrouting ma nisba ... il
pacchetto parte dalla macchina interna ed arriva all'interfaccia del
firewall verso la lan ... li poi si perde ... ho subito pensato ad un
problema di routing del pacchetto ... ho detto ... basta inserire le
regole giuste ed il pacchetto 'ritorna' indietro al server interno alla
lan ... ma niente da fare ... praticamente non ne vuol sentire parlare di
ritornare indietro ... ti invio anche il file etc/hosts:
127.0.0.1       localhost
10.0.0.101      
www.server.it
eppoi le regole impostate in iptables sono corrette ... ma c'è solo sto
problemuccio che devo risolvere ...
che cosa mi consigli !?!?
graciaz
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

per farla completa ... ti mando un estratto dello script di iptables ...
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -F -t nat
$IPTABLES -F -t mangle
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -A FORWARD -i $IFACE_LAN -j ACCEPT
$IPTABLES -A INPUT -i $IFACE_LAN -j ACCEPT
$IPTABLES -A OUTPUT -o $IFACE_LAN -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -s $INTERNAL_IP -o $IFACE_WEB -j SNAT
--to-source $EXTERNAL_IP
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -i $IFACE_WEB -m state --state ESTABLISHED,RELATED -j
ACCEPT
$IPTABLES -A FORWARD -i $IFACE_WEB -o $IFACE_LAN -p tcp --dport $PORT_HTTP
-j ACCEPT
$IPTABLES -t nat -A PREROUTING -i $IFACE_WEB -p tcp -d $WEBSERVER_WEB
--dport $PORT_HTTP -j DNAT --to-destination $WEBSERVER_LAN:$PORT_HTTP
$IPTABLES -A FORWARD -i $IFACE_WEB -o $IFACE_LAN -p tcp --dport $PORT_SSH
-j ACCEPT
$IPTABLES -t nat -A PREROUTING -i $IFACE_WEB -p tcp -d $WEBSERVER_WEB
--dport $PORT_SSH -j DNAT --to-destination $WEBSERVER_LAN:$PORT_SSH
$IPTABLES -A INPUT -p udp -s $DNS_SERVER1 --sport $PORT_DNS -j ACCEPT
$IPTABLES -A INPUT -p udp -s $DNS_SERVER2 --sport $PORT_DNS -j ACCEPT
$IPTABLES -I INPUT -p icmp --icmp-type redirect -j DROP
$IPTABLES -I INPUT -p icmp --icmp-type router-advertisement -j DROP
$IPTABLES -I INPUT -p icmp --icmp-type router-solicitation -j DROP
$IPTABLES -I INPUT -p icmp --icmp-type address-mask-request -j DROP
$IPTABLES -I INPUT -p icmp --icmp-type address-mask-reply -j DROP
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A INPUT -i $IFACE_WEB -p tcp --dport 0:65535 -j DROP
$IPTABLES -A INPUT -i $IFACE_WEB -p udp --dport 0:65535 -j DROP


 che cosa mi consigli !?!?
tagilio tutto...
vediamo di partire dalla base seguendo i singoli passi, perchè è una
configurazione tuttaltro che complicata e basta fare un passetto alla
volta.
lasciando stare i dns (che con il caso in questione non c'entrano una
sega), il problema tuo è riassumibile così:
Hai 3 macchine, con 4 ip coinvolti.
Chiameremo le macchine A, B e C
A è un client sulla rete interna, ha ip privato a e basta.
B è un router che smanaccia di iptables. Ha due ip, ma a noi interessa
solo l'ip interno, che chiamiamo b.
C è una macchina interna. Ha un ip privato, pertanto, che chiamiamo c1,
ma è visibile anche con l'ip c2, poichè il router smanavvia i pacchetti
per fargliali arrivare.
Tu devi far parlare A(a) con C(c2).
Abbiamo due sessioni da gestire, quella di andata (il SYN) e quella di
ritorno (in SYN/ACK).
Normalmente accade che:
A emette un SYN, che ha come ip sorgente a e diretto a c2. Poichè c2 non
appartiene alla rete locale, lo manda a B, poichè è il gateway.
B piglia 'sto SYN, riscrive la destinazione, mettendoci c1:
iptables -A PREROUTING -t nat -d $c2 -j DNAT --to-destination $c1
Poi lo passa oltre, ovvero in FORWARD; affinchè qui venga lasciato
passare deve essere valido che
iptables -A FORWARD -i $INT_DEV -o $INT_DEV -j ACCEPT
C riceve il pacchetto e tenta di ripondere. A chi? Al mittente, ovvero a.
A riceve un SYN/ACK diretto ad a e proveniente da c1. Non ne sa nulla, lei
ha contattato c2 che non gli somiglia pe' gnente... Fa una pernacchia a
chi ha configurato iptables e tira dritto.
-----------------------------------------
Rifacciamo usando la testa:
A emette un SYN, che ha come ip sorgente a e diretto a c2. Poichè c2 non
appartiene alla rete locale, lo manda a B, poichè è il gateway.
B piglia 'sto SYN, riscrive la destinazione, mettendoci c1:
iptables -A PREROUTING -t nat -d $c2 -j DNAT --to-destination $c1
Poi lo passa oltre, ovvero in FORWARD; affinchè qui venga lasciato
passare deve essere valido che
iptables -A FORWARD -i $INT_DEV -o $INT_DEV -j ACCEPT
A questo punto passa la palla alla prossima chain, ovvero POSTROUTING, ove
smanacciamo così:
iptables -A POSTROUTING -t nat -s $a -j DNAT --to-source $b
Sicchè alla fin fine il SYN che andava da a a c2 adesso va da b a c1...
C riceve il pacchetto e tenta di ripondere. A chi? Al mittente, ovvero b
(o almeno così pare a lui...). Mette in rete pertanto un SYN/ACK
proveniente da c1 e diretto a b.
Il pacchetto in questione arriva quindi a B, il quale ha memoria che 'sta
cosa va riscritta perchè i dati non son veri (glielo dice la tabella di
nat...).
Quindi per prima cosa trasforma il SYN/ACK che stava andando da c1 a b e
lo fa diventare un pacchetto che va da c1 ad a.
A questo punto lo fa passare per la chain di FORWARD (dove vien lasciato
passare per la stessa regola di sopra) e quindi si appresta a rimtterlo
sulla rete. La tabella si nat contiene però ancora una informazione su
questa connessione qui, e quindi il pacchetto viene di nuovo rimaneggiato:
anzichè andare da c1 ad a, verrà fatto diventare un pacchetto che va da
c2 ad a.
A riceve un SYN/ACK diretto ad a e proveniente da c2. Ringrazia l'impegno
dell'amministratore che ha configurato iptables e prosegue la sua
chiacchierata felice e contenta...
Per il debug (quando non funziona e non sai perchè) esistono le direttive
di log. Usale.
Un ausilio valido è l'uso congiunto di uno sniffer.
Hola... (maledizione all'aperitivo con la guinness...)


 --to-source $EXTERNAL_IP
che sarebbe questo? Internal e external di chi?


 che sarebbe questo? Internal e external di chi?
$INTERNAL_IP sarebbe 
10.0.0.0/24
 ... il range di indirizzi della LAN ...
mentre $EXTERNAL_IP sarebbe 192.168.1.2 (l'IP dell'interfaccia esterna del
firewall)


sono riuscito a risolvere il problema ... praticamente (è una cosa strana
lo so!!!) ho tolto da /etc/hosts l'entry del 
www.server.it
 ed ho aggiunto
le due regole di prerouting e postrouting tra l'ip esterno e quello
interno e l'interfaccia interna del firewall e tutto ha funzionato !!!
Grazie per il supporto tecnico-logistico ... ma praticamente oggi sto
rinkojonito !!!!
Mi sa tanto che ho bisogno di ferie !!
Bella
