NAT
NAT står for network address translation. Der er altså talte om at man "oversætter" en IP til en anden. Typisk bruges NAT til at dele en internetforbindelse. Da portene også kan blive oversat, er det korrekte navn for dette: NAT/PAT.
NAT kan dog bruges til mangle andre ting, som for eksempel at give adgang til en server med en local IP igennem en global IP. Ved at trafik til den globale IP bliver oversat til en lokal IP.
Eksempel på simple NAT/PAT
I dette eksempel er eth0 tilkoblet internettet, og alt trafik der routes ud at interfacet bliver NAT'tet.
#Alt trafik der routes ud af eth0, bliver NAT'tet1: /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE #Beskyt lokalnettet imod internettet2: /sbin/iptables -A FORWARD -i eth0 -m state --state INVALID,NEW,UNTRACKED -j DROP #Slå ip-routing til: echo 1 > /proc/sys/net/ipv4/ip_forward
1 Bemærk at trafik fra routeren selv, også vil bliver NAT'tet. Det betyder dog ikke noget i praksis.
2 Unden denne regl, vil det for nogle typer internetforbindelser, være muligt for andre kunder ved samme ISP at tilgår dit LAN. Ved at bruge din router som gateway.
Husk at læs: Permanent setup og tweaks af iptables, ellers så virker det ikke efter en reboot.
Eksempel på avanceret NAT/PAT
Kravspecifikation
- Trafik skal ikke NAT'tes imellem 172.16.0.0/12, 192.168.0.0/16, 198.19.48.0/20, 198.18.192.0/21.
- Disse er firmaets globale og lokale IP-adresser
- Trafik skal altid NAT'tes fra 10.0.0.0/8.
- De samme adresser kan fremkomme flere steder i firmaets afdelinger.
- NAT-pool: 198.19.51.16/28 (16 ip'er), bliver fordel efter en bitmaske. En host har altid samme globale IP.
- Det er vigtigt at det er hele poolen der kan benyttes, inklusiv den første og sidste adressen.
- Ulovligt P2P fildeling bør begrænses.
Flowcart af reglerne
Iptables regler
Opret chains til senere brug:
/sbin/iptables -N FORWARD-SRCMATCH /sbin/iptables -N FORWARD-SNAT /sbin/iptables -N FORWARD-TRACKER-CHECK /sbin/iptables -N FORWARD-TRACKER-LOG /sbin/iptables -t nat -N POSTROUTING-SNAT
Traffik fra 172.16.0.0/12 og 192.168.0.0/16 til firmaets globale og lokale IP'er skal routes uden NAT. Til alt andet skal trafikken igemmen NAT:
/sbin/iptables -A FORWARD -s 172.16.0.0/12 -j FORWARD-SRCMATCH /sbin/iptables -A FORWARD -s 192.168.0.0/16 -j FORWARD-SRCMATCH /sbin/iptables -A FORWARD-SRCMATCH -d 10.0.0.0/8 -j ACCEPT /sbin/iptables -A FORWARD-SRCMATCH -d 172.16.0.0/12 -j ACCEPT /sbin/iptables -A FORWARD-SRCMATCH -d 192.168.0.0/16 -j ACCEPT /sbin/iptables -A FORWARD-SRCMATCH -d 198.19.48/20 -j ACCEPT /sbin/iptables -A FORWARD-SRCMATCH -d 198.18.192/21 -j ACCEPT /sbin/iptables -A FORWARD-SRCMATCH -j FORWARD-SNAT
Traffik fra 10.0.0.0/8, skal altid igemmen NAT:
/sbin/iptables -A FORWARD -s 10.0.0.0/8 -j FORWARD-SNAT
Destinations port 25 blokeres altid, og pakken BT tjekkes.
/sbin/iptables -A FORWARD-SNAT -p tcp -m tcp --dport 25 -j REJECT --reject-with icmp-admin-prohibited /sbin/iptables -A FORWARD-SNAT -j FORWARD-TRACKER-CHECK
Hvis pakken går til en tracker, se om det er en BT pakke. Denne chain skal løbede opdateres af et script.
/sbin/iptables -A FORWARD-TRACKER-CHECK -d 31.172.124.2/32 -j FORWARD-TRACKER-LOG /sbin/iptables -A FORWARD-TRACKER-CHECK -d 91.202.73.55/32 -j FORWARD-TRACKER-LOG /sbin/iptables -A FORWARD-TRACKER-CHECK -d 109.163.231.236/32 -j FORWARD-TRACKER-LOG /sbin/iptables -A FORWARD-TRACKER-CHECK -d 109.201.133.19/32 -j FORWARD-TRACKER-LOG /sbin/iptables -A FORWARD-TRACKER-CHECK -d 121.189.57.82/32 -j FORWARD-TRACKER-LOG /sbin/iptables -A FORWARD-TRACKER-CHECK -d 178.239.54.160/32 -j FORWARD-TRACKER-LOG /sbin/iptables -A FORWARD-TRACKER-CHECK -d 192.162.100.180/32 -j FORWARD-TRACKER-LOG /sbin/iptables -A FORWARD-TRACKER-CHECK -d 208.83.20.164/32 -j FORWARD-TRACKER-LOG
Tjek om det er en BT pakke. Hvis det er, så log source IP'en fra pakken, og smid den væk.
/sbin/iptables -A FORWARD-TRACKER-LOG -p tcp -m string --string "?info_hash=" --algo bm --to 256 -m recent --name badclient --set -j DROP /sbin/iptables -A FORWARD-TRACKER-LOG -p udp -m string --hex-string "|0000041727101980|" --algo bm --to 64 -m recent --name badclient --set -j DROP
Alt trafik der går igennem NAT tjekkes om det kommer fra en IP der kontaktede en tracker de sidste 10 minutter.
/sbin/iptables -A FORWARD-SNAT -m recent --name badclient --rcheck --seconds 600 -j REJECT --reject-with icmp-admin-prohibited
Makér at pakken skal igennem NAT
/sbin/iptables -A FORWARD-SNAT -j CONNMARK --set-mark 1
Pakken skal igennem NAT hvis den er makeret til det:
/sbin/iptables -t nat -A POSTROUTING --connmark 1 -j POSTROUTING-SNAT
Ud fra de 4 sidste bits i source IP'en bliver traffikken NAT'tet på 16 forskellige IP addresser:
/sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.0/0.0.0.15 -j SNAT --to-source 198.19.51.16 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.1/0.0.0.15 -j SNAT --to-source 198.19.51.17 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.2/0.0.0.15 -j SNAT --to-source 198.19.51.18 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.3/0.0.0.15 -j SNAT --to-source 198.19.51.19 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.4/0.0.0.15 -j SNAT --to-source 198.19.51.20 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.5/0.0.0.15 -j SNAT --to-source 198.19.51.21 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.6/0.0.0.15 -j SNAT --to-source 198.19.51.22 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.7/0.0.0.15 -j SNAT --to-source 198.19.51.23 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.8/0.0.0.15 -j SNAT --to-source 198.19.51.24 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.9/0.0.0.15 -j SNAT --to-source 198.19.51.25 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.10/0.0.0.15 -j SNAT --to-source 198.19.51.26 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.11/0.0.0.15 -j SNAT --to-source 198.19.51.27 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.12/0.0.0.15 -j SNAT --to-source 198.19.51.28 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.13/0.0.0.15 -j SNAT --to-source 198.19.51.29 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.14/0.0.0.15 -j SNAT --to-source 198.19.51.30 /sbin/iptables -t nat -A POSTROUTING-SNAT -s 0.0.0.15/0.0.0.15 -j SNAT --to-source 198.19.51.31
Fejlsøgning
Det er muligt at se alle forbindelser der kører igennem NAT:
conntrack -L conntrack #Skal køres for at næste kommando virker. conntrack -E conntrack -e ALL
Logning
Demonen conntrackd kan logge alle states iptables har. Dermed kan der laves en fuld log over hvad der har gået igennem routeren.
#Installer conntrackd (på debian) apt-get install conntrackd #Se hvilke filer der blev installeret dpkg -L conntrackd #Læs Debians bemærkninger less /usr/share/doc/conntrackd/README.Debian #Se logfilen cat /var/log/conntrackd-stats.log