home       inleiding       sysadmin       services       links       bash       werk       nothing      

iptables input chain

 
We willen nu onze firewall afsluiten voor verkeer van zowel binnen als buiten, behalve voor ssh-toegang.
Bovendien will we poort 22 vervangen door poort 10022.
 

  1. ssh poort naar 10022
     
    Dit laatste doen we in de config-file van sshd, /etc/ssh/sshd_config
    user@ub164-FW254:/etc/iptables$ head /etc/ssh/sshd_config
    # Package generated configuration file
    # See the sshd_config(5) manpage for details
     
    # What ports, IPs and protocols we listen for
    Port 10022
    # Use these options to restrict which interfaces/protocols sshd will bind to
    #ListenAddress ::
    #ListenAddress 0.0.0.0
    Protocol 2
    # HostKeys for protocol version 2

    Kijk maar even naar de 5de regel (Port 10022)
     
    Vervolgens moeten we sshd herstarten en testen:
    $ sudo systemctl restart sshd.service
    [sudo] password for user: * * * * * * * *
    $ sudo systemctl status sshd.service

    * ssh.service - OpenBSD Secure Shell server
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
    Active: active (running) since ma 2017-11-27 17:00:14 CET; 21s ago
    Main PID: 3872 (sshd)
    Tasks: 1
    Memory: 732.0K
      CPU: 11ms
    CGroup: /system.slice/ssh.service
           └─3872 /usr/sbin/sshd -D
     
    nov 27 17:00:14 ub164-FW254 systemd[1]: Starting OpenBSD Secure Shell server...
    nov 27 17:00:14 ub164-FW254 sshd[3872]: Server listening on 0.0.0.0 port 10022.
    nov 27 17:00:14 ub164-FW254 sshd[3872]: Server listening on :: port 10022.
    nov 27 17:00:14 ub164-FW254 systemd[1]: Started OpenBSD Secure Shell server.

     

  2. iptables sluiten voor alles behalve poort 10022
     
    We houden de NAT router open voor NAT-verkeer.
    We kunnen dus beginnen met een kopie van ons reeds bestaande NAT-router script.
     
    Het commando
     
    # iptables -vP INPUT DROP
     
    zorgt ervoor dat geen enkel pakket bestemd voor de firewall/router zelf doorkomt. De optie -P staat voor policy. INPUT is alles wat toekomt met eindbestemming de machine waarop iptables draait, en DROP betekent letterlijk laten vallen.
     
    Dit is echter nogal drastisch. Want, ook localhost, op netwerkkaart lo, kan nu niet meer naar binnen (bij zichtzelf). We lossen dit op met:
     
    # iptables -vA INPUT -i lo -j ACCEPT
     
    We voegen toe (-A) aan de INPUT regels, dat op de input netwerkkaart lo (-i lo) alles wordt geaccepteerd (-j ACCEPT).
    Dit commando wordt logisch uitgevoerd na het vorige (DROP),
    en de volgorde is belangrijk: eerst alles dicht doen, en dan enkele uitzonderingen toelaten.
     
    Nu moeten we nog de service ssh op poort 10022 toelaten. Dat doen we als volgt:
     
    # iptables -vA INPUT -p TCP --dport 10022 -j ACCEPT
     
    Aan de INPUT voegen we toe dat het protocol TCP op poort 10022 (-p TCP --dport 10022)
    wordt geaccepteerd (-j ACCEPT).
     
    Tot slot voeren we nog het volgende uit om sessies door de firewall geinitieerd naar buiten toe terug binnen te laten en om andere draaiende sessies open te laten:
     
    # iptables -vA INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
     
  3. volledige script:
     
    #! /bin/bash
    #
    #  iptables-script 
    #  bvdb  ( 02/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 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.200.254/16 >> buiten
    ##>> my network interfaces: enp0s8 = 192.168.200.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.200.254 (outside address)
    #
    iptables -vt nat -A POSTROUTING -o enp0s3 -j SNAT --to 10.104.200.254
     
    ## INPUT chain lo + ports 10022
    iptables -vP INPUT DROP
    iptables -vA INPUT -i lo -j ACCEPT
    iptables -vA INPUT -p TCP --dport 10022 -j ACCEPT
    iptables -vA INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
     
    ### 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 "=============="

     

  4. volledige output
     
    user@ub164-FW254:/etc/iptables$ sudo ./iptables.v-003.nat-in.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.200.254
    ACCEPT  all opt -- in lo out *  0.0.0.0/0  -> 0.0.0.0/0  
    ACCEPT  tcp opt -- in * out *  0.0.0.0/0  -> 0.0.0.0/0   tcp dpt:10022
    >>>>> iptables -n -L
    Chain INPUT (policy DROP)
    target     prot opt source               destination         
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:10022
     
    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.200.254
    --------------
    routing set:  1

     
    ... en we testen ...
     
    Ik kan niet meer op de ssh van de binnenste LAN. (ik was de RELATED,ESTABLISHED regel vergeten -- door deze toe te voegen kan de firewall zelf weer SSH gebruiken naar 192.168.200/24) Bijgevolg test ik vanaf het buitennetwerk met een client in 10.104:
     
    user@clt-ub16-nat10-104:~$ ssh -p 10022 10.104.200.254

    The authenticity of host '[10.104.200.254]:10022 ([10.104.200.254]:10022)' can't be established.
    ECDSA key fingerprint is SHA256:ZQq+qHQJMwHScqSRQoXMOHJ9jlDc7+5HX+r8sxTXDVc.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[10.104.200.254]:10022' (ECDSA) to the list of known hosts.
    user@10.104.200.254's password: 
    Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-101-generic x86_64)
     
    * Documentation:  https://help.ubuntu.com
    * Management:     https://landscape.canonical.com
    * Support:        https://ubuntu.com/advantage
     
    92 packages can be updated.
    0 updates are security updates.
     
    Last login: Mon Nov 27 11:08:15 2017 from 10.104.255.254
    $ 

     
    Dit lukte ...
     
    Ik installeer vervolgens een apache2-server op de FW (die heb ik straks nodig met squid) en test nu met telnet op poort 80 ... maar dit geeft een time out:

    $ telnet 10.104.200.254 80
    Trying 10.104.200.254...
    telnet: Unable to connect to remote host: Connection timed out

    Poort 80 is dus dicht naar de firewall toe ...