iptables firewall
situatie schets:
![iptables](http://new.linux800.eu/services/content/7-iptables/12-iptables-oefening/iptables.png)
client = machine 10-clt
# The primary network interface
auto eth0
iface eth0 inet static
address 10.104.201.241
netmask 16
gateway 10.104.255.254
dns-nameservers 10.28.100.10 10.28.100.20
firewall = machine 10fw192
auto eth0
iface eth0 inet static
address 10.104.201.254
netmask 16
gateway 10.104.255.254
dns-nameservers 10.28.100.10
auto eth1
iface eth1 inet static
address 192.168.201.1
netmask 24
server 1 = machine web12
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.201.12
netmask 24
gateway 192.168.201.1
dns-nameservers 10.28.100.10
server 2=machine web34
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.201.34
netmask 24
gateway 192.168.201.1
dns-nameservers 10.28.100.10
Zodra alle machines de bovenstaande correcte netwerkconfiguratie hebben kan ik SSH-hoppen,
d.w.z. dat ik vanaf de client ssh kan uitvoeren naar de firewall en vanaf de firewall naar de servers 1 & 2.
Dat werkt stukken makkelijker dan de GUI-mode van virtualbox of kvm.
Ik kan vanaf de servers echter (nog) niet op het 10.104 netwerk, of verder. Daartoe moet ik van de firewall een NAT-router maken.
Ik kan vanaf de client ook niet direct SSH uitvoeren naar de servers. Daartoe moet ik reverse masquerading of port-mapping toepassen.
- iptables begin
Maak een directory/etc/iptables
waar je iptables scripts kan bewaren.
bert@10fw192:~$ sudo mkdir /etc/iptables
Zet in deze directory een clear-iptables script:#! /bin/bash # # turn iptables back into original state (no firewall, no forwarding) # # bvdb ( 29/5/2008 ) # ################################################################ # v = verbose, X = flush tables, F = delete non standard chains # general iptables -vX iptables -vF # nat and masquerading -t refers to table iptables -vt nat -F iptables -vt nat -X # mangling TCP header iptables -vt mangle -F iptables -vt mangle -X # reset policies -P refers to policies iptables -vP INPUT ACCEPT iptables -vP OUTPUT ACCEPT iptables -vP FORWARD ACCEPT # turn off routing echo 0 > /proc/sys/net/ipv4/ip_forward
Dit wordt een sjabloon voor je volgende scripts ...
Hij zet de standaard iptables terug op inactief.
Maak het script uitvoerbaar, en voer het uit.
bert@10fw192:~$ sudo chmod +x clear-iptables
bert@10fw192:~$ sudo ./clear-iptables
Flushing chain `INPUT' Flushing chain `FORWARD' Flushing chain `OUTPUT' Flushing chain `PREROUTING' Flushing chain `INPUT' Flushing chain `OUTPUT' Flushing chain `POSTROUTING' Flushing chain `PREROUTING' Flushing chain `INPUT' Flushing chain `FORWARD' Flushing chain `OUTPUT' Flushing chain `POSTROUTING'
- nat-routing
Ons tweede script maakt van onze machine een echte NAT-router. Merk op dat ons eerste script volledig vervat is in het begin van dit nieuwe script.
Tevens wordt de routerfunctie aangezet door de waarde "1" in/proc/sys/net/ipv4/ip_forward
te plaatsen.
Om router te worden hebben we natuurlijk 2 netwerkkaarten nodig.
We hebben dan een onveilige verbinding naar buiten toe (in ons voorbeeld eth0 -10.104.0.0/16
) en een veilig LAN (in ons voorbeeld eth1 -192.168.201.0/24
)
Het is essentieel dat je netwerk perfect geconfigureerd is vooraleer je kan beginnen aan het router of firewall gedeelte.
Het volgende commando zet de vlag "routing" aan. De linux-pc gaat dan toelaten pakketten tussen verschillende fysieke netwerkkaarten of logische netwerken te routen.
echo 1 > /proc/sys/net/ipv4/ip_forward
We hebben dan nog een commando nodig om Network Address Translation te doen:
iptables -vt nat -A POSTROUTING -o eth0 -j SNAT --to 10.104.201.254
in de tabel NAT (-t nat
) gaan we een regel toevoegen (-A
) aan dePOSTROUTING
op output kaart eth0 (-o eth0
) en na-j
volgt wat we dan doen:SNAT
= Source-network-adress-translation naar adres10.104.201.254
Het volledig NAT-script ziet er dan als volgt uit:
sudo vim nat-iptables
#! /bin/bash # # iptables-script to do NAT-routing # # bvdb ( 29/5/2008 ) # ################################################################ # v = verbose, X = flush tables, F = delete non standard chains # general iptables -vX iptables -vF # nat and masquerading -t refers to table iptables -vt nat -F iptables -vt nat -X # mangling TCP header iptables -vt mangle -F iptables -vt mangle -X # reset policies -P refers to policies iptables -vP INPUT ACCEPT iptables -vP OUTPUT ACCEPT iptables -vP FORWARD ACCEPT # turn on routing echo 1 > /proc/sys/net/ipv4/ip_forward ###### Dit is heel belangrijk in je script -- ###### dan zie je wat je aan het doen bent: ### my network interfaces: eth0 = 10.104.201.254/16 >> buiten ### my network interfaces: eth1 = 192.168.201.1/24 >> binnen ### implement NAT routing ### ## the real thing: NAT routing - eth0 is on your outside and unprotected # network, in our case the ip address is 10.104.201.254 (outside address) # iptables -vt nat -A POSTROUTING -o eth0 -j SNAT --to 10.104.201.254.
Na het uitvoeren van dit script werkt het commando
ping google.com
op de machines web12 en web34.
We kunnen nu software installeren, o.a. een apache server.
- reverse masquerading
Reverse masquerading betekent het doorgeven van services vanop een computer in het interne netwerk, naar het buitennetwerk toe. Dit is dus een soort van reverse NAT. Men noemt dit ook Destination NAT.
In het vorige experiment hebben we gebruik gemaakt van een client PC om IPtables te testen. Nu gaan we op die PC ook een webserver plaatsen, en die webserver bruikbaar maken vanaf het externe netwerk.
Daar zijn in principe maar twee extra regels voor nodig. Hier is de eerste (alles op één regel):
iptables -vt nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.201.12:80
De pakketten die binnenkomen vanaf het buitennetwerk (eth0) op TCP poort 80, worden doorverwezen naar ip-socket 192.168.201.12 poort 80.
We moeten die pakketten ook toelaten met een ACCEPT statement:
iptables -vA INPUT -i eth0 -p TCP --dport 80 -j ACCEPT
Als we ook de webserver web34 willen bereiken, dan kan dit niet meer op poort 80. Je moet altijd het adres van de firewall gebruiken om met het interne netwerk te communiceren. En poort 80 is al gebruikt voor web12. We kunnen natuurlijk een andere poort gebruiken, vb. 81
Ons script met SNAT en DNAT wordt dan: (we hebbeb de hoofding die altijd hetzelfde is eraf geknipt)### --- snipped --- ## flush tables skipped # turn on routing echo 1 > /proc/sys/net/ipv4/ip_forward ###### Dit is heel belangrijk in je script -- ###### dan zie je wat je aan het doen bent: ### my network interfaces: eth0 = 10.104.201.254/16 >> buiten ### my network interfaces: eth1 = 192.168.201.1/24 >> binnen ### implement NAT routing ### ## the real thing: NAT routing - eth0 is on your outside and unprotected # network, in our case the ip address is 10.104.201.254 (outside address) # iptables -vt nat -A POSTROUTING -o eth0 -j SNAT --to 10.104.201.254 ### reverse masquerading to LAN # # to web12 on port 80 iptables -vt nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.201.12:80 iptables -vA INPUT -i eth0 -p TCP --dport 80 -j ACCEPT # to web34 port 81 iptables -vt nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to 192.168.201.34:80 iptables -vA INPUT -i eth0 -p TCP --dport 81 -j ACCEPT
Na uitvoeren van het vorige kunnen we met lynx vanaf 10-clt surfen op web12 via http://10.104.201.254
en surfen op web34 via http://10.104.201.254:81
Op een gelijkaardige manier kunnen we ook SSH-toegang naar de twee servers creëren:### reverse masquerading SSH to LAN # # to web12 on port 80 iptables -vt nat -A PREROUTING -i eth0 -p tcp --dport 1222 -j DNAT --to 192.168.201.12:22 iptables -vA INPUT -i eth0 -p TCP --dport 1222 -j ACCEPT # to web34 port 81 iptables -vt nat -A PREROUTING -i eth0 -p tcp --dport 3422 -j DNAT --to 192.168.201.34:22 iptables -vA INPUT -i eth0 -p TCP --dport 3422 -j ACCEPT
Na uitvoeren van het volledig script met 4 DNAT regels kunnen we ssh doen naar poort 22, 1222, en 3422 naar adres 10.104.201.254 en komen we telkens bij een andere server terecht.
bert@10-clt:~$ ssh -p 3422 10.104.201.254 bert@10.104.201.254's password: Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-42-generic x86_64) Last login: Thu Dec 1 17:48:20 2016 from 192.168.201.1 bert@web34:~$
- meer weten
een echte firewall wordt dicht getimmerd zodat alleen de uitzonderingsregels nog zijn toegelaten. Er is dan nog toegang nodig tot de firewall zelf via poort 22 (of een andere poort en eventueel misschien ook andere services). Dat doen we als volgt:
iptables -vP INPUT DROP iptables -vA INPUT -i lo -j ACCEPT iptables -vA INPUT -p TCP --dport 22 -j ACCEPT
een echte firewall verhindert waarschijnlijk ook dat de mensen binnen in het beveiligde LAN alles kunnen doen wat ze willen, en laat dan wel enkele uitzonderingen toe. Dat kan als volgt:## DENY all ROUTING except ADDED rules # iptables -vP FORWARD DROP ## NAT routing (replace 172.16.31.11 with your own exterior IP address ## eth0 is the network card connected to the unsecure network) # iptables -vt nat -A POSTROUTING -o eth0 -j SNAT --to 172.16.31.11 ## ALLOW NAT ROUTING FROM WITHIN for DNS, MAIL and SSH # # allow forward of DNS queries and replies iptables -vA FORWARD -i eth1 -p UDP --dport 53 -j ACCEPT # allow forward of SMTP and POP3 mail communication iptables -vA FORWARD -i eth1 -p TCP --dport 25 -j ACCEPT iptables -vA FORWARD -i eth1 -p TCP --dport 110 -j ACCEPT # allow forward of HTTP and HTTPS mail communication iptables -vA FORWARD -i eth1 -p TCP --dport 80 -j ACCEPT iptables -vA FORWARD -i eth1 -p TCP --dport 443 -j ACCEPT iptables -vA FORWARD -i eth1 -p TCP --dport 22 -j ACCEPT # without the following the requested # internet hosts cannot reply any request iptables -vA FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ### END FORWARDING AND NAT ### ######################
meer weten: http://old.linux800.be/lx-svs-info-iptables.php