home       inleiding       sysadmin       services       links       bash       werk       nothing      

iptables firewall

 
situatie schets:

iptables

 
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.
 

  1. 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'
  2. 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 de POSTROUTING
    op output kaart eth0 (-o eth0) en na -j volgt wat we dan doen: SNAT = Source-network-adress-translation naar adres 10.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.
     

  3. 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:~$ 

     

  4. 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