home       inleiding       sysadmin       services       links       bash       werk       nothing      

iptables & squid

deze oefening is het vervolg van linux800.be/services/iptables/squid-squidguard
 
We hebben ondertussen een werkende squid en squidguard, met default referer-webpagina. Dit moet nog ingebouwd in een firewall, om te vermijden dat de proxy overbrugd wordt. We werken met iptables. In wat volgt configureren we die op machine iptbls-fw
 
opbouw testomgeving:

opzet-squid-iptables-2016

nog te doen:

  • configureer iptables op als NAT-router
  • configureer iptables als input filter: 3128 (squid), 80 (waarschuwingspagina), 22, e.a.
  • configureer iptables als forwarder: GEEN poort 80, wel 53 en 22
  • configureer op de web-server www-binnen in FWnet een tweede ip-adres
  • op www-binnen apache2 met virtual hosts op ip-adres configureren;
  • configureer DNAT op iptables naar de www-binnen. Gebruik poort 80 voor het eerste ip, en poort 81 voor het tweede ip. Test vanaf een client-computer (om het even wat met een browser, hoeft niet eens virtueel te zijn) in het netwerk 10.104/16
     
    1. NAT-router
       
      We maken een directory /etc/iptables aan en plaatsen hierin
      /etc/iptables/nat-iptables
      /etc/iptables# cat nat-iptables 
      #! /bin/bash
      #
      # configure this machine as a router with ip4 forwarding
      #
      echo 1 > /proc/sys/net/ipv4/ip_forward
       
      ### Clear iptables
      ###
      #
      # flush iptables and delete non standard chains
      #
      iptables -vF
      iptables -vX
      #
      # flush nat-tables and non standard nat chains
      iptables -vt nat -F
      iptables -vt nat -X
      #
      ## Mangle is used to modify the TCP Header. The chain's function is
      ## Modification of the TCP packet quality of service bits before routing
      ## occurs
      #
      # flush mangle-tables and non standard mangle chains
      iptables -vt mangle -F
      iptables -vt mangle -X
       
      ### 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.120.1 (outside address)
      #
      iptables -vt nat -A POSTROUTING -o eth0 -j SNAT --to 10.104.120.1
       
      ### PRINT iptables configuration
      ###
      iptables -t filter -n -L
      iptables -t nat -L

       
      We maken de file executable met chmod +x en voeren hem uit.
       
      Als we hierna op de client
       
      $ dig
       
      uitvoeren, krijgen we een antwoord van de nameserver te zien aan de andere kant van de firewall.

      ; <<>> DiG 9.9.5-3ubuntu0.5-Ubuntu <<>>
      ;; global options: +cmd
      ;; Got answer:
      ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28809
      ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 3
       
      ;; OPT PSEUDOSECTION:
      ; EDNS: version: 0, flags:; udp: 4000
      ;; QUESTION SECTION:
      ;.              IN  NS
       
      ;; ANSWER SECTION:
      .           86196   IN  NS  b.root-servers.net.
      .           86196   IN  NS  c.root-servers.net.
      .           86196   IN  NS  d.root-servers.net.
      .           86196   IN  NS  e.root-servers.net.
      .           86196   IN  NS  f.root-servers.net.
      .           86196   IN  NS  g.root-servers.net.
      .           86196   IN  NS  h.root-servers.net.
      .           86196   IN  NS  i.root-servers.net.
      .           86196   IN  NS  j.root-servers.net.
      .           86196   IN  NS  k.root-servers.net.
      .           86196   IN  NS  l.root-servers.net.
      .           86196   IN  NS  m.root-servers.net.
      .           86196   IN  NS  a.root-servers.net.
       
      ;; ADDITIONAL SECTION:
      b.root-servers.net. 86400   IN  A   192.228.79.201
      a.root-servers.net. 86196   IN  A   198.41.0.4
       
      ;; Query time: 24 msec
      ;; SERVER: 10.28.100.10#53(10.28.100.10)
      ;; WHEN: Thu Oct 13 14:04:22 CEST 2016
      ;; MSG SIZE  rcvd: 284

       

    2. linux client upgrades
       
      We gaan straks niet meer kunnen updaten via poort 80. Alles zal via onze proxy moeten, ook apt-get update. Om die reden passen we op de linux machines binnen 172.16/16 de volgende file aan (of als ze nog niet bestaat maken we ze aan):
       
      $ sudo vim /etc/apt/apt.conf
      Acquire::http::Proxy "http://172.16.0.1:3128";

       
      Hierna voeren we een apt-get update uit om te testen:
       
      $ sudo apt-get update

      Ign http://archive.canonical.com trusty InRelease
      Ign http://archive.ubuntu.com trusty InRelease                                 
      Get:1 http://security.ubuntu.com trusty-security InRelease [65,9 kB]           
      Get:2 http://archive.ubuntu.com trusty-updates InRelease [65,9 kB]             
      Hit http://archive.canonical.com trusty Release.gpg                            
      Hit http://archive.canonical.com trusty Release                                
      Hit http://archive.ubuntu.com trusty Release.gpg 
      ... ... ...

       
      en dit schijnt te werken.
       

    3. de INPUT filter van IPtables
       
      Als we een firewall bouwen moeten we alle verkeer dat niet strict noodzakelijk is NAAR de firewall verbieden. Dat doen we met het INPUT filter.
       
      Naar onze firewall is verkeer nodig van binnen op poort 3128 en poort 80 (proxy en default page). SSH verkeer zou ook nuttig zijn.
       
      Hiertoe voegen we de volgende regels toe aan ons reeds bestaande NAT-script:
      ### INPUT POLICIES: traffic to the
      ### firewall/router
      iptables -vP INPUT DROP
      iptables -vA INPUT -i lo -j ACCEPT
      iptables -vA INPUT -i eth1 -p TCP --dport 22 -j ACCEPT
      iptables -vA INPUT -i eth1 -p TCP --dport 80 -j ACCEPT
      iptables -vA INPUT -i eth1 -p TCP --dport 3128 -j ACCEPT
      ### RELATED,ESTABLISHED
      iptables -vA INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

      iptables -vP INPUT DROP - verbiedt alle toegang tot de firewall.
      iptables -vA INPUT -i lo -j ACCEPT - laat de firewall toe met zichzelf te communiceren via localhost op interface -i lo
      De daaropvolgende uitzonderingen werken alleen vanaf de interface -i eth1 (het binnen netwerk):
      -p TCP --dport 22 - protocol TCP destination port 22 (van pakketten die binnenkomen vanuit 172.16/16 bestemd voor ssh)
       

    4. de FORWARD filter van IPtables
       
      doorheen onze firewall is momenteel nog verkeer naar en van DNS nodig, en voor de systeembeheerders een link naar SSH van andere machines. In principe zouden we DNS verkeer kunnen beperken tot enkele DNS servers in het binnen netwerk. En alle machines in 17.16/16 zouden deze lokale DNS dan verplicht gebruiken. Je zou SSH ook gewoon kunnen verbieden.
      ### FORWARD POLICIES: traffic THROUGH the firewall
      ### DENY all ROUTING except ADDED rules
      #
      iptables -vP FORWARD DROP
      #
      # allow forward of DNS queries and replies
      iptables -vA FORWARD -i eth1 -p UDP --dport 53 -j ACCEPT
      #
      # allow forward of ssh
      iptables -vA FORWARD -i eth1 -p TCP --dport 22 -j ACCEPT
      #
      # forward related established
      iptables -vA FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

       
      Het geheel van NAT, INPUT en FORWARD geeft het volgende totaal-script:

      #! /bin/bash
      #  bvdb (29/10/2016)
      #
      # configure this machine as a router with ip4 forwarding
      #
      echo 1 > /proc/sys/net/ipv4/ip_forward
      #
      ### Clear iptables
      ###
      # flush iptables and delete non standard chains
      #
      iptables -vF
      iptables -vX
      #
      # flush nat-tables and non standard nat chains
      iptables -vt nat -F
      iptables -vt nat -X
      #
      ## Mangle is used to modify the TCP Header. The chain's function is
      ## Modification of the TCP packet quality of service bits before routing
      ## occurs
      #
      # flush mangle-tables and non standard mangle chains
      iptables -vt mangle -F
      iptables -vt mangle -X
      #
      ### implement NAT routing
      #
      ## eth0 is on your outside and unprotected
      #  network, in our case the ip address is 10.104.120.1 (outside address)
      #
      iptables -vt nat -A POSTROUTING -o eth0 -j SNAT --to 10.104.120.1
      #
      ### INPUT POLICIES: traffic to the
      ### firewall/router
      iptables -vP INPUT DROP
      iptables -vA INPUT -i lo -j ACCEPT
      iptables -vA INPUT -p -i eth1 TCP --dport 22 -j ACCEPT
      iptables -vA INPUT -p -i eth1 TCP --dport 80 -j ACCEPT
      iptables -vA INPUT -p TCP --dport 3128 -j ACCEPT
      ### RELATED,ESTABLISHED
      iptables -vA INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      #
      ### FORWARD POLICIES: traffic THROUGH the firewall
      ### DENY all ROUTING except ADDED rules
      #
      iptables -vP FORWARD DROP
      #
      # allow forward of DNS queries and replies
      iptables -vA FORWARD -i eth1 -p UDP --dport 53 -j ACCEPT
      #
      # allow forward of ssh
      iptables -vA FORWARD -i eth1 -p TCP --dport 22 -j ACCEPT
      #
      # forward related established
      iptables -vA FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
      #
      ### PRINT iptables configuration
      ###
      iptables -n -L
      iptables -t nat -L

       

    5. de apache server www-binnen
       
      • tweede address
         
        We moeten onze apache server een tweede ip-adres toekennen. We editeren:
        /etc/network/interfaces
        # This file describes the network interfaces available on your system
        # and how to activate them. For more information, see interfaces(5).
         
        # The loopback network interface
        auto lo
        iface lo inet loopback
         
        # The primary network interface
        auto eth0
        iface eth0 inet static
        address 172.16.10.100
        netmask 16
        gateway 172.16.0.1
        dns-nameservers 10.28.100.10 10.28.100.20
         
        auto eth0:0
        iface eth0:0 inet static
        address 172.16.10.101
        netmask 16

        We herstarten het netwerk (of de server) en testen met ifconfig:

        user@www-binnen:~$ ifconfig
        eth0      Link encap:Ethernet  HWaddr 08:00:27:79:b1:eb  
        inet addr:172.16.10.100  Bcast:172.16.255.255  Mask:255.255.0.0
        inet6 addr: fe80::a00:27ff:fe79:b1eb/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:145 errors:0 dropped:0 overruns:0 frame:0
        TX packets:189 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000 
        RX bytes:16804 (16.8 KB)  TX bytes:25292 (25.2 KB)
         
        eth0:0    Link encap:Ethernet  HWaddr 08:00:27:79:b1:eb  
        inet addr:172.16.10.101  Bcast:172.16.255.255  Mask:255.255.0.0
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

         

      • apache ip-virtual hosts
         
        Het aanmaken van virtual hosts op ip-address is bijna hetzelfde als op servernaam:
        In de declaratie van een virtualhost, zetten we het luisteradres:
        <VirtualHost 1.2.3.4:80>
        ServerAdmin webmaster@www1.example.com
        DocumentRoot "/www/vhosts/www1"
        ServerName www1.example.com
        ErrorLog "/www/logs/www1/error_log"
        CustomLog "/www/logs/www1/access_log" combined
        </VirtualHost>

        We creëren twee config-bestanden, en plaatsen deze in /etc/apache2/sites-available:
         
        /etc/apache2/sites-available/172.16.10.100.conf

        <VirtualHost 172.16.10.100:80>
        ServerAdmin webmaster@yoursite.be
        DocumentRoot "/var/www/html1"
        ServerName www1.voorbeeld.com
        </VirtualHost>

         
        /etc/apache2/sites-available/172.16.10.101.conf

        <VirtualHost 172.16.10.101:80>
        ServerAdmin webmaster@yoursite.be
        DocumentRoot "/var/www/html2"
        ServerName www2.voorbeeld.com
        </VirtualHost>

         
        Vervolgens zetten we symbolic links in /etc/apache2/sites-enabled
        (vergeet de link naar 000-default niet te verwijderen):

        user@www-binnen:/etc/apache2/sites-enabled$ sudo ln -sv ../sites-available/172* .
        './172.16.10.100.conf' -> '../sites-available/172.16.10.100.conf'
        './172.16.10.101.conf' -> '../sites-available/172.16.10.101.conf'

         
        Nu de websites nog in respectievelijk /var/www/html1 en /var/www/html2
         
        Tenslotte herstarten we apache2 en testen we de websites op www-binnen met lynx ...
         
        $ sudo service apache2 restart
        $ lynx 172.16.10.100

        HTML1 -- 172.16.10.100 of poort 80

        $ lynx 172.16.10.101

        HTML2 -- 172.16.10.101 of poort 81

         

    6. www-binnen van 'buiten' af ...
       
      In iptables maken we nog 2 port forwarders met DNAT:
      #
      iptables -vA FORWARD -i eth0 -p TCP --dport 80 -j ACCEPT
      iptables -vA FORWARD -i eth0 -p TCP --dport 81 -j ACCEPT
      #
      iptables -vt nat -A PREROUTING -i eth0 -p TCP --dport 80 -j DNAT --to 172.16.10.100:80
      iptables -vt nat -A PREROUTING -i eth0 -p TCP --dport 81 -j DNAT --to 172.16.10.101:80

      Eerst de forward toelating van buiten (-i eth0) naar poort 80 (--dport 80) en 81 (--dport 81)
      Vervolgens de reverse NAT waarbij Destination Network Address Translation gebeurt , op destination address + port:
      10.104.120.1:80 wordt in alle binnenkomende pakketten vervangen door 172.16.10.100:80, en
      10.104.120.1:81 wordt vervangen door 172.16.10.101:80
       
      we voegen deze regels toe aan ons iptables-script en voeren dit uit ...
       
      En bingo, vanuit een PC in 10.104/16 krijgen we de volgende resultaten:

      port-forwarding-port-80
      port-forwarding-81