home       inleiding       sysadmin       services       links       bash       werk       nothing      

centOS7 virtual firewall in een KVM-bak op RUBAX

We willen een virtuele omgeving opzetten adhv 1 publiek ip-adres op de KVM van RUBAIX.
Omdat dit document op een website werd gepubliceerd zijn ip-adressen en hostnames aangepast.
 

  1. de firewall installatie
     
    We installeren eerst een machine die het verkeer van en naar onze virtuele omgeving zal regelen. Die krijgt straks 2 netwerkkaarten, en zal SNAT en DNAT toepassen om verschillende servers ( VPN / Owncloud / ... ) hun werk te laten doen.
     
    Met de software Virtual Machine Manager powered by lib-virt,
    plaatsen we een virtuele machine (centos-bert) op RUBAIX.
     

    • 2 logical cpus / copy host cpu config
    • 1024MB RAM
    • virtio disk 20GB in /vms
    • 1 netwerkkaart (om te beginnen) / bridged op publieke netwerkkaart van RUBAIX
    • VNC-server met VNC (geen spice) -- password protected -- auto port -- keymap US
    • we gebruiken een DVD-iso bestand van 442499072 bytes -- CentOS-7.4-x86_64-NetInstall-1708.iso

     
    We BOOTEN de machine van DVD.iso om te installeren.
    Doen een minimal + net-tools installatie ...
    .. en configureren het netwerk tijdens de installatie als volgt:
     

    • ip: 151.152.153.154 mask 32 krijgen we van de provider
    • gw: vinden we op RUBAIX met route -n : 94.95.96.254
    • dns: 8.8.8.8 en 4.2.2.2
       

    Je kan ook een MAC-address ingeven tijdens de installatie. OVH-routing werkt a.d.h.v. MAC-address dus geven we dit nu al in. (maar we kunnen dit ook gewoon straks aanpassen in de KVM virt manager): 02:00:00:01:02:03
     

  2. centOS first boot
     
    In het begin wil de machine niet opstarten. Er is geen bootmedium gevonden.
    We stellen onze virtuele HardDisk in virt-manager in als BOOT -- en vervolgens krijgen we beeld ...
     
    We hebben een keyboard-layout ongevoelig paswoord gekozen. Maar onze BE-layout is QWERTY vreemd. We tikken:
     
    $ sudo loadkeys be
     
    Om vervolgens het netwerk te bekijken met ifconfig (ja we hebben net-tools (zie install))

    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 151.152.153.154  netmask 255.255.255.255  broadcast 151.152.153.154
        inet6 fe80::ecbd:d8a1:571:c057  prefixlen 64  scopeid 0x20<link>
        ether 02:00:00:01:02:03  txqueuelen 1000  (Ethernet)
        RX packets 160245  bytes 114352597 (109.0 MiB)
        RX errors 0  dropped 160  overruns 0  frame 0
        TX packets 57741  bytes 4189572 (3.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 64  bytes 6952 (6.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64  bytes 6952 (6.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    IP en MAC blijken correct ...
    Maar een ping naar 8.8.8.8 lukt niet: de routing doet het nog niet.
    We tikken het volgende in:
     
    $ sudo route add 94.95.96.254 dev eth0
     
    Vervolgens werkt de ping ...
     
    Ik editeer nog even de netwerkinterface configuratie om de gateway settings aan te passen:
     
    $ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
      

    TYPE="Ethernet"
    PROXY_METHOD="none"
    BROWSER_ONLY="no"
    BOOTPROTO="none"
    DEFROUTE="yes"
    IPV4_FAILURE_FATAL="no"
    IPV6INIT="yes"
    IPV6_AUTOCONF="yes"
    IPV6_DEFROUTE="yes"
    IPV6_FAILURE_FATAL="no"
    IPV6_ADDR_GEN_MODE="stable-privacy"
    NAME="eth0"
    UUID="9db385c2-08b4-442b-a7d1-a2ced0d090ad"
    DEVICE="eth0"
    ONBOOT="yes"
    MACADDR="02:00:00:01:02:03"
    IPADDR="151.152.153.154"
    PREFIX="32"
    GATEWAY="94.95.96.254"
    DNS1="8.8.8.8"
    IPV6_PRIVACY="no"
    ZONE=public

     

  3. centOS 2nd boot
     
    Ik begin met het netwerk te testen: een ping naar google.be werkt.
     
    Vervolgens kijk ik naar de routing table:
    $ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         94.95.96.254    0.0.0.0         UG    101    0        0 eth0
    94.95.96.254    0.0.0.0         255.255.255.255 UH    101    0        0 eth0
    151.152.153.154 0.0.0.0         255.255.255.255 UH    101    0        0 eth0

     
    ... en nog even naar de DNS:
    $ cat /etc/resolv.conf

    # Generated by NetworkManager
    nameserver 8.8.8.8

     
    Ik pas tenslotte de hostnaam aan in /etc/hostname en /etc/hosts:

    centos-fw
    127.0.0.1   localhost localhost4 localhost.localdomain centos-fw
    ::1         localhost localhost6 localhost.localdomain centos-fw

     
    ... en na het aanpassen van de hostname is het belangrijk het systeem te herstarten ...
     

  4. ssh toegang ...
     
    We kunnen ondertussen met ssh inloggen op onze centos-fw.
    Nu willen we de poort aanpassen naar bijvoorbeeld 22422.
    Dit kan in /etc/ssh/sshd_config,
    maar er staat expliciet in deze file:
    # If you want to change the port on a SELinux system, you have to tell
    # SELinux about this change.
    # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER

    Dus ....

    • software updaten: sudo yum update
    • policy-core utils installeren: sudo yum install policycoreutils-python
    • port 22422 in SELinux: sudo semanage port -a -t ssh_port_t -p tcp 22422
    • sshd_config aanpassen ... : sudo vim /etc/ssh/sshd_config
      # This is the sshd server system-wide configuration file.  See
      # sshd_config(5) for more information.
      # ...
      # If you want to change the port on a SELinux system, you have to tell
      # SELinux about this change.
      # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
      #
      Port 22422
      #AddressFamily any
      #ListenAddress 0.0.0.0
      #ListenAddress ::
       
      HostKey /etc/ssh/ssh_host_rsa_key
      #HostKey /etc/ssh/ssh_host_dsa_key
      HostKey /etc/ssh/ssh_host_ecdsa_key
      HostKey /etc/ssh/ssh_host_ed25519_key
       
      # Ciphers and keying
      #RekeyLimit default none
      # ...
    • ssh daemon herstarten: sudo systemctl restart sshd
    • ssh status checken: sudo systemctl status sshd
    • centOS firewall aanpassen:
      sudo firewall-cmd --permanent --zone=public --add-port=22422/tcp
    • centOS firewall herladen: sudo firewall-cmd --reload
    • centOS FW zone public bekijken: sudo firewall-cmd --list-all-zones
      ....
      public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0
      sources: 
      services: ssh dhcpv6-client
      ports: 22422/tcp
      protocols: 
      masquerade: no
      forward-ports: 
      source-ports: 
      icmp-blocks: 
      rich rules:
      ...
    • En testen ... : **ssh -p 22422 user@151.152.153.154**
      Last login: Wed Jun 6 09:27:22 2018 from d51530cb1.static.telenet.be*
       
  5. private network
     
    Onze centOS firewall moet toegang geven tot een intern netwerk.
    Hiertoe moeten we eerst een intern netwerk bouwen.
    Ik doe eerst een shutdown van de centOS-fw.
    Daarna ga ik naar virt-manager en klik ik rechts op de HOST-machine, en daarna op NEW ...
     
    hostonly-adapter

     
    klik vervolgens op de virtual hardware details van de centOS-fw, daarna op ADD HARDWARE
    klik netwerk en selecteer de juist gemaakte adapter als network source.
     
    Vervolgens start ik de centOS-fw terug op ...
     
    Ik kijk met ifconfig (ja, ik heb nog steeds net-tools), en zie een extra netwerkkaart zonder ip ...
     
    $ ifconfig

    ens10: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::14af:5362:e921:d86b  prefixlen 64  scopeid 0x20<link>
        ether 52:54:16:bf:9e:29  txqueuelen 1000  (Ethernet)
        RX packets 42581  bytes 3171278 (3.0 MiB)
        RX errors 0  dropped 31727  overruns 0  frame 0
        TX packets 79537  bytes 113247349 (108.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    Ik kopieer /etc/sysconfig/network-scripts/ifcfg-eth0naar ifcfg-ens10 ...
    En ik pas de file aan als volgt:

    TYPE="Ethernet"
    PROXY_METHOD="none"
    BROWSER_ONLY="no"
    BOOTPROTO="none"
    DEFROUTE="yes"
    IPV4_FAILURE_FATAL="no"
    IPV6INIT="yes"
    IPV6_AUTOCONF="yes"
    IPV6_DEFROUTE="yes"
    IPV6_FAILURE_FATAL="no"
    IPV6_ADDR_GEN_MODE="stable-privacy"
    NAME="ens10"
    #UUID="9db385c2-08b4-442b-a7d1-a2ced0d090ad"
    DEVICE="ens10"
    ONBOOT="yes"
    IPADDR="192.168.255.77"
    PREFIX="24"
    IPV6_PRIVACY="no"
    ZONE=work
    • NAME en DEVICE krijgen ens10 als waarde
    • UUID wordt afgevinkt met een #
    • IPADDR en PREFIX worden ingesteld voor het interne netwerk
    • ZONE in firewalld, de firewall en iptables van centOS worden zones gebruikt, ik denk proactief aan een reeds bestaande zone work om mijn VPN en Owncloud servers straks in te plaatsen.
       
      Ik herstart het netwerk ... sudo systemctl restart network.service
       
      Test de nieuwe settings: ifconfig ens10
      ens10: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
      inet 192.168.255.77  netmask 255.255.255.0  broadcast 192.168.255.255
      inet6 fe80::14af:5362:e991:d89b  prefixlen 64  scopeid 0x20<link>
      ether 52:54:16:bf:9e:29  txqueuelen 1000  (Ethernet)
      RX packets 0  bytes 0 (0.0 B)
      RX errors 0  dropped 0  overruns 0  frame 0
      TX packets 13  bytes 918 (918.0 B)
      TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

      IT WORKS
       

  6. NAT naar private network
     
    Ik begin met het aanzetten van ROUTING ... sudo vim /etc/sysctl.conf
    # sysctl settings are defined through files in
    # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
    #
    # Vendors settings live in /usr/lib/sysctl.d/.
    # To override a whole file, create a new file with the same in
    # /etc/sysctl.d/ and put new settings there. To override
    # only specific settings, add a file with a lexically later
    # name in /etc/sysctl.d/ and put new settings there.
    #
    # For more information, see sysctl.conf(5) and sysctl.d(5).
    #
    # IP forwarding
    net.ipv4.ip_forward = 1

     
    vervolgens voeg ik de volgende regels toe aan firewalld ...
     
    sudo firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
     
    sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ens10 -o eth0 -j ACCEPT
     
    sudo firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o ens10 -m state --state RELATED,ESTABLISHED -j ACCEPT
     
    ik kijk of er iets is aangepast met
    sudo firewall-cmd --permanent --direct --get-all-rules

    ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
    ipv4 filter FORWARD 0 -i ens10 -o eth0 -j ACCEPT
    ipv4 filter FORWARD 0 -i eth0 -o ens10 -m state --state RELATED,ESTABLISHED -j ACCEPT

     
    Het kan nooit kwaad om na een dergelijke ingreep de virtuele machine te herstarten, om te zien of de wijziging werkelijk permanent is ... na verloop van tijd begin je dit enigszins te vertrouwen.
     

  7. NAT testen
     
    we kunnen NAT alleen maar testen vanaf een nieuwe virtual in de private address space ...