home       inleiding       sysadmin       services       links       bash       werk       nothing      

iptables nat router

 

  1. je netwerk
     
    Om router te worden hebben we natuurlijk 2 netwerkkaarten nodig.
    We hebben dan een onveilige verbinding naar buiten toe, in ons voorbeeld enp0s3:
    enp0s3    Link encap:Ethernet  HWaddr 08:00:27:20:a1:61  
          inet addr:10.104.2xy.254  Bcast:10.104.255.255  Mask:255.255.0.0

    en een veilig LAN, in ons voorbeeld enp0s8:

    enp0s8    Link encap:Ethernet  HWaddr 08:00:27:8f:e3:d7  
          inet addr:192.168.2xy.254  Bcast:192.168.2xy.255  Mask:255.255.255.0

    In ubuntu server hebben we deze configuratie:
    $ cat /etc/network/interfaces

    # The loopback network interface
    auto lo
    iface lo inet loopback
     
    # de buitenkant van mijn netwerk (10.10/16) (meestal bridged in vbox)
    auto enp0s3
    iface enp0s3 inet static
    address 10.104.2xy.254
    netmask 16
    gateway 10.104.255.254
    dns-nameservers 10.28.100.10
     
    # de binnenkant van mijn netwerk (192.168.2xy/24) (meestal intnet in vbox)
    auto enp0s8
    iface enp0s8 inet static
    address 192.168.2xy.254
    netmask 24

    Let goed op dat je binnen- en buitennetwerk niet verwisseld
    Het is essentieel dat je netwerk perfect geconfigureerd is vooraleer je kan beginnen aan het router of firewall gedeelte. Test met een aantal pings naar machines binnen en naar machines buiten ...
     

  2. NAT-routing
     
    Het volgende commando zet de vlag "routing" aan. De linux-kernel gaat dan pakketten tussen verschillende fysieke netwerkkaarten of logische netwerken 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 enp0s3 -j SNAT --to 10.104.2xy.254
     
    In het hogere commando gebruiken we de netwerkkaart aan de buitenkant: enp0s3 en zijn ipv4-adres: 10.104.2xy.254
     
    We kunnen beide commando's zomaar aan de bash shell intikken, bijvoorbeeld om te testen; maar wij gaan ze integreren in ons iptables-script:
     
    cat iptables.v-002.nat.sh
    #! /bin/bash
    #
    #  iptables-script 
    #  bvdb  ( 03/11/2017 )
    ######################################################
    #
    # 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
     
    # 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: enp0s3 = 10.104.2xy.254/16 >> buiten
    ##>> my network interfaces: enp0s8 = 192.168.2xy.254/24 >> binnen
     
    ### implement NAT routing
    #
    ## NAT routing - enp0s3 is buiten en een unprotected network
    #  het ip address aan de buitenkant van onze firewall is 10.104.2xy.254 (outside address)
    #
    iptables -vt nat -A POSTROUTING -o enp0s3 -j SNAT --to 10.104.2xy.254
     
    ### PRINT iptables configuration
    ###
    #
    echo ">>>>> iptables -n -L"
    iptables -n -L
    echo "--------------"
    #echo ">>>>> iptables -S"
    #iptables -S 
    #echo "--------------"
    echo ">>>>> iptables -t nat -L"
    iptables -t nat -L
    echo "--------------"
    #echo ">>>>> iptables -t mangle -L"
    #iptables -t mangle -L
    #echo "--------------"
    echo "routing set: " `cat /proc/sys/net/ipv4/ip_forward`
    echo "=============="

    Als we het script uitvoeren krijgen we de volgende output:
    $ sudo ./iptables.v-002.nat.sh

    $ sudo ./iptables.v-002.nat.sh 
    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'
    SNAT  all opt -- in * out enp0s3  0.0.0.0/0  -> 0.0.0.0/0   to:10.104.2xy.254
    >>>>> iptables -n -L
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
     
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
     
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    --------------
    >>>>> iptables -t nat -L
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
     
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
     
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
     
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination         
    SNAT       all  --  anywhere             anywhere             to:10.104.2xy.254
    --------------
    routing set:  1
    ==============

     

  3. testen
     
    We hebben net sudo /etc/iptables/iptables.v-002.nat.sh uitgevoerd op de firewall. Als je ondertussen de firewall herstart hebt moet je dit eerst opnieuw uitvoeren alvorens te testen.
     
    gebruik een machine in LAN, bijvoorbeeld web102
     
    user@ub164-WEB102:~$ ifconfig
    enp0s3    Link encap:Ethernet  HWaddr 08:00:27:9e:2e:76  
          inet addr:192.168.200.102  Bcast:192.168.200.255  Mask:255.255.255.0

     
    we pingen nu een machine aan de buitenkant:

    user@ub164-WEB102:~$ ping 10.28.100.10
    PING 10.28.100.10 (10.28.100.10) 56(84) bytes of data.
    64 bytes from 10.28.100.10: icmp_seq=1 ttl=56 time=19.2 ms
    64 bytes from 10.28.100.10: icmp_seq=2 ttl=56 time=15.3 ms
    --- 10.28.100.10 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss

    ... het werkt ....
     
    we voeren vervolgens op de firewall /etc/iptables/iptables.v-001.clear.sh uit en testen opnieuw:

    user@ub164-WEB102:~$ ping 10.28.100.10
    PING 10.28.100.10 (10.28.100.10) 56(84) bytes of data.
    ^C
    --- 10.28.100.10 ping statistics ---
    3 packets transmitted, 0 received, 100% packet loss

    inderdaad, pingen lukt niet zonder de NAT-router ...