NAT ovvero Network Address Tranlation permette di manipolare un pacchetto IP modificando l'indirizzo IP sorgente o di destinazione.
Ovviamente il dispositivo che esegue il NAT quando riceve il pacchetto di ritorno esegue l'operazione inversa, sulla base di una tabella di natting che si tiene in memoria.
Il Nat viene utilizzato in varie occasioni, dove si ha la necessità ad esempio di redirezionare il traffico su un unico IP, oppure forwardare il traffico con una certa porta di destinazione ad un'altro host oppure su un'altra porta.
Su Linux si usa definire il natting con due modalità specifiche:
SNAT: Source NAT, cioè l'alterazione dell'IP sorgente del primo pacchetto che apre la connessione. Avviene sempre dopo che il pacchetto ha subito il routing (post-routing).
Un esempio di SNAT è il masquerading, con cui tutti gli IP sorgenti di una rete locale vengono convertiti in un unico IP sorgente (del dispositivo che fa masquerading) con cui i pacchetti vengono mandati in rete.
DNAT: Destination NAT, cioè l'alterazione dell'IP di destinazione del primo pacchetto.
A differenza del SNAT il DNAT avviene sempre prima che il pacchetto subisca il routing (pre-routing).
Una forma di DNAT è il port-forwarding e trasparent proxy.
Per quanto riguarda iptables, le catene (chain) da considerare per i vari tipi di NAT sono:
PREROUTING (DNAT, per i pacchetti in arrivo).
Esiste inoltre un "caso speciale" chiamato redirection. E' un DNAT effettuato esclusivamente sull'interfaccia di ingresso del pacchetto. Ovvero si può eseguire un redirect di tuti i pacchetti provenienti su eth0 con destination port 80 e redirezionarli sempre su eth0 ma sulla porta 12345.
OUTPUT (DNAT, per i pacchetti generati della macchina locale)
POSTROUTING (SNAT, per i pacchetti in uscita)
Esempi di NAT:
Port forwarding
iptables -A PREROUTING -t nat -p tcp -d 10.0.0.150 --dport 8080 -j DNAT --to 172.16.1.128:80
Ovvero tutti i pacchetti che hanno destinazione 10.0.0.150 sulla porta 8080vengono riderizionati al'ip 172.16.1.128 alla porta 80.
Source Natting
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.0.0.1
Tutti i pacchetti che escono dall'interfaccia eth0, subiscono una variazione dell'ip sorgente in 10.0.0.1
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.0.0.1-10.0.0.254
Come sopra, con la differenza che l'ip sorgente può essere alterato sia in 10.0.0.1 o 10.0.0.154
Masquerading
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Tutto ciò che passa in uscita dal proprio modem viene mascherato con l'ip pubblico assegnato dal proprio ISP.
Destination Natting
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 10.0.0.1:8080
Tutti i pacchetti TCP, arrivati dall'interfaccia eth1 con destinazione porta 80 vengono "dirottati" all'ip 10.0.0.1 alla porta 8080.
Utilizzo di iptables per natting, masquerading e mangling di pacchetti.
ipmasq,$IP_PUBBLICO
Spero si essere venuto nel posto giusto per ricevere risposte,son sicuro che sapreste dare una soluzione al mio problema .Nella mia abitazione ho messo insieme una lan recuperando pc vecchi datimi da amici che volentieri se ne liberavano causa spesone computer nuovo ecc.basta ciance,down to businnes stavo dicendo la mia lan,si!Router netgear dg834 (inet 192.168.0.1) , gateway/firewall debian sarge 3.1 k2.6(192.168.0.2)&(192.168.1.1) ,
P3 inet 192.168.1.2 , P2 350mhz debian sarge 3.1 k2.6 inet 192.168.1.3 che ospita un server www a questo url:http://hardcode.ath.cx.Ho installato IPMASQ una chicca per chi fa' MASQUERADING e NAT che mi ha subito configutato la subnet in base all' indirizzo della NIC e via raggiungo la rete passando per la linux box che fa da' firewall 192.168.0.2 ma il mio server web su 192.168.1.3 non è raggiungibile dall'esterno.Devo forwardare quella maledetta porta 80 dal firewall al web server.queste le mie rules:
#!/bin/bash
echo "0" > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -F INPUT
/sbin/iptables -F OUTPUT
/sbin/iptables -F FORWARD
/sbin/iptables -t mangle -F PREROUTING
/sbin/iptables -t mangle -F OUTPUT
/sbin/iptables -t nat -F PREROUTING
/sbin/iptables -t nat -F POSTROUTING
/sbin/iptables -t nat -F OUTPUT
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -t mangle -P PREROUTING ACCEPT
/sbin/iptables -t mangle -P OUTPUT ACCEPT
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT
/sbin/iptables -A INPUT -j ACCEPT -i lo
/sbin/iptables -A INPUT -j LOG -i ! lo -s 127.0.0.1/255.0.0.0
/sbin/iptables -A INPUT -j DROP -i ! lo -s 127.0.0.1/255.0.0.0
/sbin/iptables -A INPUT -j ACCEPT -i eth1 -d 255.255.255.255/32
/sbin/iptables -A INPUT -j ACCEPT -i eth1 -s 192.168.1.1/255.255.255.0
/sbin/iptables -A INPUT -j ACCEPT -i eth1 -d 224.0.0.0/4 -p ! 6
/sbin/iptables -A INPUT -j LOG -i eth0 -s 192.168.1.1/255.255.255.0
/sbin/iptables -A INPUT -j DROP -i eth0 -s 192.168.1.1/255.255.255.0
/sbin/iptables -A INPUT -j ACCEPT -i eth0 -d 255.255.255.255/32
/sbin/iptables -A INPUT -j ACCEPT -i eth0 -d 192.168.0.2/32
/sbin/iptables -A INPUT -j ACCEPT -i eth0 -d 192.168.0.255/32
#Inserita da me!
/sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.0.1 --dport 80 -j DNAT --to-destination 192.168.1.3:80
# questa NO!
/sbin/iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.1/255.255.255.0 -j MASQUERADE
#le prossime 2 si!
#/sbin/iptables -A FORWARD -i eth1 -p tcp --dport 80 -j ACCEPT
/sbin/iptables -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT
#qeste dopo no!
/sbin/iptables -A FORWARD -i eth1 -o eth0 -s 192.168.1.1/255.255.255.0 -j ACCEPT
/sbin/iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A OUTPUT -j ACCEPT -o lo
/sbin/iptables -A OUTPUT -j ACCEPT -o eth1 -d 255.255.255.255/32
/sbin/iptables -A OUTPUT -j ACCEPT -o eth1 -d 192.168.1.1/255.255.255.0
/sbin/iptables -A OUTPUT -j ACCEPT -o eth1 -d 224.0.0.0/4 -p ! 6
/sbin/iptables -A FORWARD -j LOG -o eth0 -d 192.168.1.1/255.255.255.0
/sbin/iptables -A FORWARD -j DROP -o eth0 -d 192.168.1.1/255.255.255.0
/sbin/iptables -A OUTPUT -j LOG -o eth0 -d 192.168.1.1/255.255.255.0
/sbin/iptables -A OUTPUT -j DROP -o eth0 -d 192.168.1.1/255.255.255.0
/sbin/iptables -A OUTPUT -j ACCEPT -o eth0 -d 255.255.255.255/32
/sbin/iptables -A OUTPUT -j ACCEPT -o eth0 -s 192.168.0.2/32
/sbin/iptables -A OUTPUT -j ACCEPT -o eth0 -s 192.168.0.255/32
echo "1" > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -A INPUT -j LOG -s 0.0.0.0/0 -d 0.0.0.0/0
/sbin/iptables -A INPUT -j DROP -s 0.0.0.0/0 -d 0.0.0.0/0
/sbin/iptables -A OUTPUT -j LOG -s 0.0.0.0/0 -d 0.0.0.0/0
/sbin/iptables -A OUTPUT -j DROP -s 0.0.0.0/0 -d 0.0.0.0/0
/sbin/iptables -A FORWARD -j LOG -s 0.0.0.0/0 -d 0.0.0.0/0
/sbin/iptables -A FORWARD -j DROP -s 0.0.0.0/0 -d 0.0.0.0/0
Sono rules di IPMASQ std/out quindi funzionano.IPMASQ ha una directory dove ci sono varie rules che invocano il comando iptables e riguardano il nat,il masquerading,politica polisa di drop per tutte le chains ecc. tranne quella quella per il forward della porta 80,credo che siano testi eseguibili in c e su quello riguardante il forwarding della porta 80 le variabili si riferiscono a i vecchi ipchains e ipfw o qualcosa del genere.Questo e l'altro papiello:
# This file will open HTTP service port 80
# accept incoming packets from external networks on external interfaces
if [ -n "$EXTERNAL" ]; then
for i in $EXTERNAL; do
ipnm_cache $i
case $MASQMETHOD in
ipfwadm)
$IPFWADM -I -a accept -P tcp -W $i -D $IPOFIF/32 80
;;
ipchains)
$IPTABLES -A input -j ACCEPT -p tcp -i $i -d 192.168.1.3:80
;;
esac
done
fi
Dove vedete la variabile $IPTABLES c'era $IPCHAINS,ho adattato per quanto mi era possibile cambiando l'ip corrispondente al mio server web,qualcuno ci capisce niente?Scusate!
Alla fine quando riuscirete a connettervi a questo url: http://hardcode.ath.cx vuol dire che avro' risolto aiutatemi una iptable rule e mi farete felice.Ah!Dimenticavo! uno script per riuscire a rilevare l' ip pubblico che si trova sul router nel primo punto della catena per poi raggiungere invece il terzo pc della catena il web server io avevo pensato ad uno script , racciudere lo std/out di un comando in una variabile che sarebbe stata utilizzata in iptables a significare -d xxx.xxx.xxx.xxx l'indirizzo wan per chi si connette a porta 80 dalla rete nel PREROUTING,questo è il modo che ho trovato per beccare i mio ip wan:
IP_PUBBLICO='elinks http://www.whatismyip.com/ | grep 151.*.*.*' (la prima cifra non cambia)che come risultato mi da esttamente il mio ip dinamico aggiornato, ma quando faccio echo $IP_PUBBLICO per la verifica mi da una riga vuota con niente dentro.Sapreste aiuarmi anche questo mi tornera' molto utile.
grazie per la pazienza.
gabriele
Non funziona :(
Forse avrei dovuto direlo.
Ma anche una regola del genere non funziona, ci ho provato... è da un pezzo che ci provo ma niente... un semplice port forward mi sta vfacendo venire i capelli bianchi! e anche i miei amici non ci capiscono niente...
La regola da te proposta mi blocca il NAT... non va più ho provato a vedere cosa succede con uno snifere ma niente...
per quanto riguarda loggare i pachetti dropati... io non ne droppo... prima di inziare a chiudere volevo che funzionasse tutto, cosa che non funziona...
natting
Prova a togliere l'interfaccia dalla regola di prerouting:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.0.6:80
assicurati inoltre di permettere il forwarding e abilita il logging dei pacchetti droppati per capire cosa viene bloccato
Aiutatemi :)
Ho due 2 PC il primo è Foxtrot su cui gira, senza problemi, un server web { apache } un server FTP, MySQL etc, il secondo PC { Delta } fa da Firewall/NAT verso internet. Il mio problema è far vedere all'esterno della rete interna il server presente su Foxtrot e questo l'ho risolto con la regola
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.6:80
Voglio che tutti {quindi compresi i pc della lan} vedano il server che fisicamente gira su foxtrot come se girasse su delta { delta compreso } quindi se da qualunque macchina faccio nmap Delta la 80 deve essere aperta. Sia che faccio nmap all'interno della rete { nmap delta } , sia che lo faccio dal esterno { nmap razziatore.no-ip.com }, che da delta stesso { nmap localhost }. Non ditemi che è più semplice spostare il modem su Foxtrot o che non è saggio fare quello che devo fare, perchè appunto lo devo fare quindi vi pregerei di aiutarmi a risolvere il mio problema sono mesi che ci provo inutilmente :'( io non voglio che tutte le richieste alla porta 80 vengono rideirette su foxtrot { esempio http://www.google.com } io voglio solo quelle dirette a delta in un modo o nel altro.
per il momento nmap razziatore.no-ip.com funziona solo se dato dal esterno { io invece vorrei che funzionasse sempre }.
razziatore.no-ip.com punta SEMPRE al IP publico di delta anche se questo varia nel tempo { è un DNS dinamico ;) }
allego un po' di dati e lo script che uso su delta :D ah lo schema della rete puo' essere reperibile su http://razziatore.no-ip.com/Schema.jpg
root@delta:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:40:33:AA:CA:5A
inet addr:192.168.0.4 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:194646 errors:0 dropped:0 overruns:0 frame:0
TX packets:208146 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:63986879 (61.0 Mb) TX bytes:120619335 (115.0 Mb)
Interrupt:11 Base address:0x1000
eth1 Link encap:Ethernet HWaddr 52:54:05:E4:4B:03
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:238862 errors:0 dropped:0 overruns:0 frame:0
TX packets:220017 errors:0 dropped:0 overruns:0 carrier:0
collisions:10 txqueuelen:1000
RX bytes:124189367 (118.4 Mb) TX bytes:66480612 (63.4 Mb)
Interrupt:11 Base address:0x1080
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3053 (2.9 Kb) TX bytes:3053 (2.9 Kb)
ppp0 Link encap:Point-to-Point Protocol
inet addr:80.116.252.202 P-t-P:192.168.100.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:3645 errors:0 dropped:0 overruns:0 frame:0
TX packets:3358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:2143555 (2.0 Mb) TX bytes:492068 (480.5 Kb)
root@delta:~#
root@delta:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.1 * 255.255.255.255 UH 0 0 0 ppp0
localnet * 255.255.255.0 U 0 0 0 eth0
localnet * 255.255.255.0 U 0 0 0 eth1
loopback * 255.0.0.0 U 0 0 0 lo
default 192.168.100.1 0.0.0.0 UG 0 0 0 ppp0
root@delta:~#
root@delta:~# lsmod
Module Size Used by Not tainted
ip_nat_ftp 2736 0 (unused)
ip_conntrack_ftp 3888 1
ipt_MASQUERADE 1304 1
ip_nat_irc 2128 0 (unused)
ip_conntrack_irc 3024 1
ppp_synctty 5856 0 (unused)
ppp_async 7392 1
ppp_generic 19492 3 [ppp_synctty ppp_async]
slhc 4976 0 [ppp_generic]
iptable_filter 1644 0 (autoclean) (unused)
iptable_nat 15438 3 (autoclean) [ip_nat_ftp ipt_MASQUERADE ip_nat_irc]
ip_conntrack 19236 7 (autoclean) [ip_nat_ftp ip_conntrack_ftp ipt_MASQUERADE ip_nat_irc ip_conntrack_irc iptable_nat]
ip_tables 12416 5 [ipt_MASQUERADE iptable_filter iptable_nat]
ide-scsi 9328 0
ne2k-pci 4576 1
8390 6000 0 [ne2k-pci]
via-rhine 12464 1
mii 2272 0 [via-rhine]
crc32 2880 0 [8390 via-rhine]
agpgart 43940 0 (unused)
root@delta:~#
root@delta:~# cat ./myscript
#! /bin/bash
# faccio partire adsl
adsl-start
# dove sta iptables?
iptables="/sbin/iptables"
# abilito il forwading del ip
echo "1" >/proc/sys/net/ipv4/ip_forward
# modulo generale iptables :D
modprobe ip_tables
# non so ca a ce serva boh :D
modprobe ip_conntrack
# moduli per in nat IRC
modprobe ip_conntrack_irc ports=5555,6666,6667,6668,6669,7000
modprobe ip_nat_irc
# modili per il nat FTP
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
# moduli per iptables
modprobe iptable_nat
modprobe ipt_MASQUERADE
# aabilito il mascermanto degli ip interni
iptables -t nat -I POSTROUTING -s 192.168.0.0/255.255.255.0 -o ppp0 -j MASQUERADE
# forwading porta per apache
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.6:80
root@delta:~#
Grazie per l'attenzione, aspetto una vostra risposta :D