Discussione:
NAT "trasparente"
(troppo vecchio per rispondere)
Lucio Crusca
2005-08-26 14:50:17 UTC
Permalink
Ciao gente. Oggi devo fare un NAT "trasparente", ovvero: ho una LAN con il
suo bravo router, voglio infilare la mia linux-box fra lo switch della LAN
ed il router, senza riconfigurare l'indirizzo del gateway su tutta la LAN
(non c'è DHCP) e senza configurare alcunché del router, perché non è mio e
non posso toccarlo.
La Linux box è Sarge con kernel 2.4, ma, se serve, posso mettere il 2.6.

LAN-->SWITCH-->LINUX-->ROUTER

La lan è 192.168.1.0/24, il router è 192.168.1.254 .

La prima idea è stata quella di mettere due schede ethernet nella linuxbox,
eth0 verso la LAN ed eth1 verso il router, seguito da:

1 - Comando per "ingannare" i compupters in lan che continuano a puntare al
solito gateway, che ora però è la mia linux box:
# ifconfig eth0 192.168.1.254 netmask 255.255.255.0 up

2 - Comando per configurare la scheda ethernet verso il router, in modo che
veda più solo la linux box come facente parte della rete locale
# ifconfig eth1 192.168.1.222 netmask 255.255.255.0 up

3 - Comandi per attivare il NAT
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 192.168.1.222
# echo 1 > /proc/sys/net/ipv4/ip_forward

4 - Comando per dire al kernel dove quale sia il default gateway
# route add default gw 192.168.1.254

Ora è chiaro anche a me che il comando route è ambiguo, perché io vorrei
dire, con quel comando, che il default gateway è il router attaccato
all'altro capo di eth1, ma l'indirizzo del router coincide con l'indirizzo
di eth0. Credo che sia questo il motivo per cui, a prove fatte, il tutto
non funziona.

Esiste un modo per farlo funzionare? Magari qualche parola magica al comando
route, o qualche regola nuova nella tabella FORWARD?
--
To UNSUBSCRIBE, email to debian-italian-***@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact ***@lists.debian.org
Riccardo Tortorici
2005-08-26 15:50:13 UTC
Permalink
Post by Lucio Crusca
Ciao gente. Oggi devo fare un NAT "trasparente", ovvero: ho una LAN con il
suo bravo router, voglio infilare la mia linux-box fra lo switch della LAN
ed il router, senza riconfigurare l'indirizzo del gateway su tutta la LAN
(non c'è DHCP) e senza configurare alcunché del router, perché non è mio e
non posso toccarlo.
Non capisco bene la tua richiesta, credo tu voglia fare bridging, per
fare NAT devi per forza routare e quindi cambiare i default gateway
sui client della LAN.
Cosa ci vuoi fare con la linux box, un firewall? o MITM? :-)

Leggi qui, magari ti è utile...
http://www.sjdjweis.com/linux/bridging/

ciao

- - Riccardo Tortorici -
Linux Registered User #365170
Count yourself @ http://counter.li.org/ !
- --
HTML email can be dangerous, is not always readable, wastes bandwidth
and is simply not necessary please don't send them to me!

http://www.georgedillon.com/web/netiquette.shtml
plucked duck
2005-08-26 16:20:11 UTC
Permalink
Post by Lucio Crusca
LAN-->SWITCH-->LINUX-->ROUTER
La lan è 192.168.1.0/24, il router è 192.168.1.254 .
L'indirizzo del router fa parte della LAN. La macchina linux deve funzionare
come bridge intercettando a livello 2 i frame ethernet

Il bridge funziona come uno switch: se capisce che un frame è rivolto ad una
interfaccia che si trova dall'altra parte, allora fa l'echo, altrimenti lo
blocca

Il funzionamento da bridge dipende dal kernel che utilizzi. Nelle versioni
2.4.x e 2.6.x mi pare sia stato introdotto un apposito modulo

Prova a dare un'occhiata al pacchetto bridge-utils (sid)

Ciao
--
To UNSUBSCRIBE, email to debian-italian-***@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact ***@lists.debian.org
straluna
2005-08-26 17:20:14 UTC
Permalink
On Fri, 26 Aug 2005 16:38:04 +0200
Post by Lucio Crusca
Ciao gente. Oggi devo fare un NAT "trasparente", ovvero: ho una LAN
con il suo bravo router, voglio infilare la mia linux-box fra lo
switch della LAN ed il router, senza riconfigurare l'indirizzo del
gateway su tutta la LAN (non c'è DHCP) e senza configurare alcunché
del router, perché non è mio e non posso toccarlo.
Oltre al gia' citato bridge prendi in considerazione la possibilita' di
usare il proxy-arp che ti consente di fare esattamente quello che chiedi
senza patchare nulla (visto che usi 2.4) e filtrare a layer3.

Poiche' non hai specificato altre esigenze, STP per esempio, ti
direi `scegli quella che implica meno sbattimento` che IMHO e' il
proxy-arp.
Tieni presente che con proxy-arp sei obbligato ad assegnare un ip al fw
cosa che comunque io faccio tipicamente anche con i bridge, non fosse
altro che per poterli gestire da lan.

Per andare in coppia con l'altro link:

http://www.sjdjweis.com/linux/proxyarp/

ciao,
a.
Lucio Crusca
2005-08-30 09:30:20 UTC
Permalink
Post by Riccardo Tortorici
Cosa ci vuoi fare con la linux box, un firewall? o MITM? :-)
Un firewall a livello IP ed ARP. Il cliente ha problemi di connettività fra
computers della sua LAN: è convinto che i problemi insorti possano
dipendere in qualche modo dal suo nuovo ISP, a causa di una coincidenza
temporale fra l'insorgere dei problemi ed il cambio di ISP. Questa ipotesi,
secondo me, implica che il suo ISP mandi dei pacchetti "non richiesti" alla
LAN e che il router (di proprietà dell'ISP) li lasci passare. Inoltre, per
generare problemi di connettività a livello di LAN, i pacchetti incriminati
credo che dovrebbero essere degli ARP, in quanto non credo che sia
possibile ottenere tale risultato a livello IP, se non congestionando la
LAN, giusto?
Da ciò ho pensato di mettere un NAT, in modo da lasciar fuori qualsiasi ARP
non richiesto, ma anche qualsiasi pacchetto IP non richiesto: voglio però
evitare di riconfigurare tutta la LAN, un po' perché è un lavoraccio e un
po' per non aggiungere entropia al sistema ed essere certo, se il problema
si risolve, di non aver toccato nulla sui client.

Quello che voglio mettere è un NAT che abbia lo stesso indirizzo IP del
router, ma sulla eth0 che si presenta alla LAN, in modo che i client in LAN
non notino la differenza.

ROUTER(.254)<-->(.222)NAT(.254)<-->LAN(192.168.1.0/24)
eth1 eth0

Il problema è che non posso toccare neppure il router, quindi il NAT si
trova a "nattare" fra due reti identiche a livello IP. Dal p.d.vista
teorico direi che la cosa è tranquillamente possibile, mentre dal p.d.vista
pratico, se cerco di dire alla linux box che il default gateway è
raggiungibile via eth1, il comando

# route add default gw 192.168.1.254 dev eth1

mi risponde

SIOCADDRT: Network is unreachable

che mi lascia un po' di stucco perché non capisco per quale motivo dovrebbe
dirlo (premesso che il comando route lo conosco poco e la linea sopra l'ho
costruita a partire da "man route", ma senza la certezza di aver capito
tutto). Posso immaginare quale sia il problema, ovvero io gli sto dicendo
che il default gateway è lo stesso IP di eth0, ma è raggiungibile via eth1,
perché fisicamente non è su eth0, e la cosa non gli piace proprio. Non so
solo come fare a dirglielo in parole più chiare e non capisco perché il
comando route qui sopra non sia sufficientemente chiaro per il kernel.

Detto per inciso, sono convinto che i problemi della LAN del cliente nulla
abbiano a che vedere con l'ISP, è solo il cliente a non esserne convinto e
glielo devo dimostrare.
Post by Riccardo Tortorici
Oltre al gia' citato bridge prendi in considerazione la possibilita' di
usare il proxy-arp che ti consente di fare esattamente quello che chiedi
senza patchare nulla (visto che usi 2.4) e filtrare a layer3.
Posso anche loggare/droppare i pacchetti ARP fra le due schede (in
particolare quelli dal router verso la LAN)?
--
To UNSUBSCRIBE, email to debian-italian-***@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact ***@lists.debian.org
Alessio Curri
2005-08-30 09:40:09 UTC
Permalink
Post by Lucio Crusca
Post by Riccardo Tortorici
Cosa ci vuoi fare con la linux box, un firewall? o MITM? :-)
Un firewall a livello IP ed ARP. Il cliente ha problemi di connettività fra
computers della sua LAN: è convinto che i problemi insorti possano
dipendere in qualche modo dal suo nuovo ISP, a causa di una coincidenza
temporale fra l'insorgere dei problemi ed il cambio di ISP. Questa ipotesi,
secondo me, implica che il suo ISP mandi dei pacchetti "non richiesti" alla
LAN e che il router (di proprietà dell'ISP) li lasci passare. Inoltre, per
generare problemi di connettività a livello di LAN, i pacchetti incriminati
credo che dovrebbero essere degli ARP, in quanto non credo che sia
possibile ottenere tale risultato a livello IP, se non congestionando la
LAN, giusto?
Da ciò ho pensato di mettere un NAT, in modo da lasciar fuori qualsiasi ARP
non richiesto, ma anche qualsiasi pacchetto IP non richiesto: voglio però
evitare di riconfigurare tutta la LAN, un po' perché è un lavoraccio e un
po' per non aggiungere entropia al sistema ed essere certo, se il problema
si risolve, di non aver toccato nulla sui client.
Quello che voglio mettere è un NAT che abbia lo stesso indirizzo IP del
router, ma sulla eth0 che si presenta alla LAN, in modo che i client in LAN
non notino la differenza.
ROUTER(.254)<-->(.222)NAT(.254)<-->LAN(192.168.1.0/24)
eth1 eth0
Il problema è che non posso toccare neppure il router, quindi il NAT si
trova a "nattare" fra due reti identiche a livello IP. Dal p.d.vista
teorico direi che la cosa è tranquillamente possibile, mentre dal p.d.vista
pratico, se cerco di dire alla linux box che il default gateway è
raggiungibile via eth1, il comando
# route add default gw 192.168.1.254 dev eth1
mi risponde
SIOCADDRT: Network is unreachable
che mi lascia un po' di stucco perché non capisco per quale motivo dovrebbe
dirlo (premesso che il comando route lo conosco poco e la linea sopra l'ho
costruita a partire da "man route", ma senza la certezza di aver capito
tutto). Posso immaginare quale sia il problema, ovvero io gli sto dicendo
che il default gateway è lo stesso IP di eth0, ma è raggiungibile via eth1,
perché fisicamente non è su eth0, e la cosa non gli piace proprio. Non so
solo come fare a dirglielo in parole più chiare e non capisco perché il
comando route qui sopra non sia sufficientemente chiaro per il kernel.
Detto per inciso, sono convinto che i problemi della LAN del cliente nulla
abbiano a che vedere con l'ISP, è solo il cliente a non esserne convinto e
glielo devo dimostrare.
Post by Riccardo Tortorici
Oltre al gia' citato bridge prendi in considerazione la possibilita' di
usare il proxy-arp che ti consente di fare esattamente quello che chiedi
senza patchare nulla (visto che usi 2.4) e filtrare a layer3.
Posso anche loggare/droppare i pacchetti ARP fra le due schede (in
particolare quelli dal router verso la LAN)?
Forse quello che serve a te è un firewall trasparente.
Basta creare un bridge tra tra le due schede di rete della box linux
(man brctl), assegnare al bridge un ip (per comodità di gestione) e
utilizzare iptables per configurare le regole del firewall (oppure
ebtables se vuoi lavorare a livelli più bassi, ma 99% delle volte non
serve). Ovviamente tramite iptables puoi anche loggare tutto il traffico
e se vuoi farti dele male puoi metter sulla stessa macchina anche snort)
Forse in questo caso non è neanche necessario nattare il traffico.
Così facendo il firewall è realmente trasparente e non devi
riconfigurare nulla sui client. Inoltre dai traceroute il firewall così
configurato non viene nemmeno rilevato. (Questa è una tecnica che
usiamo in azienda, e ne sono molto contento, dato che funziona ala grande).

Alessio
--
To UNSUBSCRIBE, email to debian-italian-***@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact ***@lists.debian.org
Lucio Crusca
2005-08-30 09:50:26 UTC
Permalink
Post by Alessio Curri
Basta creare un bridge tra tra le due schede di rete della box linux
(man brctl), assegnare al bridge un ip (per comodità di gestione) e
utilizzare iptables per configurare le regole del firewall
Avevo capito che metter su il bridge significasse non poter filtrare a
livello IP (straluna propone proxy-arp anche per questo motivo). Avevo
capito male?
--
To UNSUBSCRIBE, email to debian-italian-***@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact ***@lists.debian.org
Alessio Curri
2005-08-30 10:00:29 UTC
Permalink
Post by Lucio Crusca
Post by Alessio Curri
Basta creare un bridge tra tra le due schede di rete della box linux
(man brctl), assegnare al bridge un ip (per comodità di gestione) e
utilizzare iptables per configurare le regole del firewall
Avevo capito che metter su il bridge significasse non poter filtrare a
livello IP (straluna propone proxy-arp anche per questo motivo). Avevo
capito male?
Mettendo su il bridge, quando i pacchetti di livello ip passano, vengono
filtrati da iptables (con il 2.6 sicuramente, 2.4 non so...).
C'è una "variabile di controllo" in /proc (che ora non ricordo è che son
diventato matto a trovare) che di default è 1, e che appunto passa i
pacchetti ip a iptables. Suggerivo appunto di usare anche ebtables nel
caso dovessi filtrare anche altro.
Con questa tecnica puoi letteralmente tagliare il cavo, crimpare
entrambi i lati e inserici in mezzo il firewall linux. E non devi
toccare nulla ne sui client ne sul router.

Alessio.
--
To UNSUBSCRIBE, email to debian-italian-***@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact ***@lists.debian.org
straluna
2005-08-30 10:00:37 UTC
Permalink
On Tue, 30 Aug 2005 11:42:43 +0200
Post by Lucio Crusca
Avevo capito che metter su il bridge significasse non poter filtrare a
livello IP (straluna propone proxy-arp anche per questo motivo).
No no no....anche con bridge puoi filtrare a layer3 solo che devi
patchare il kernel (per 2.4, per 2.6 no).
Vedi i link che ti hanno gia' passato...

Uso con soddisfazione entrambe le soluzioni, scelgo una pittosto che
l'altra a seconda del caso specifico. Quantitativamente sono molto
simili, qualitativamente no.
Post by Lucio Crusca
Posso anche loggare/droppare i pacchetti ARP fra le due schede (in
particolare quelli dal router verso la LAN)?
Certo. Se ti basta droppare i mac-address vedi man iptables
--mac-source. Altrimenti se ti interessa tutto l'header vedi ebtables
(sempre il bridge) e/o arptables (questo e' indipendente dalla scelta).

Scusa la fretta ma oggi ho l'acqua alla gola...
stasera mi (ri)leggo il tuo post.

ciao,
a.
--
To UNSUBSCRIBE, email to debian-italian-***@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact ***@lists.debian.org
Lucio Crusca
2005-08-30 11:10:11 UTC
Permalink
Post by straluna
No no no....anche con bridge puoi filtrare a layer3 solo che devi
patchare il kernel (per 2.4, per 2.6 no).
Vedi i link che ti hanno gia' passato...
Sì, hai ragione, ehm... avrei dovuto leggerlo prima di postare...
Post by straluna
Uso con soddisfazione entrambe le soluzioni, scelgo una pittosto che
l'altra a seconda del caso specifico. Quantitativamente sono molto
simili, qualitativamente no.
In cosa proxy-arp è migliore di bridge-utils, kernel 2.4 a parte?
--
To UNSUBSCRIBE, email to debian-italian-***@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact ***@lists.debian.org
straluna
2005-08-30 11:20:08 UTC
Permalink
On Tue, 30 Aug 2005 13:02:34 +0200
Post by Lucio Crusca
Post by straluna
Uso con soddisfazione entrambe le soluzioni, scelgo una pittosto che
l'altra a seconda del caso specifico. Quantitativamente sono molto
simili, qualitativamente no.
In cosa proxy-arp è migliore di bridge-utils, kernel 2.4 a parte?
Sono entrambe ottime soluzioni con peer-review e una "base di
installato" tale da consentire sonni tranquilli.
Quantitativamente/qualitativamente va inteso non nel senso che una delle
due sia peggio dell'altra ma se vuoi, tirandola un po' (tanto) per i
capelli, nell'accezione che hanno i due avverbi in matematica.

Bridge e proxyarp sono di una "qualita'" differente nel senso che
partono da teoria e, poi, codice differente nel kernel.
Eppero' ti permettono di ottenere un risultato, una serie di risultati,
molto simili.

spero di aver chiarito.

ciao,
a.

Loading...