Posts Tagged 'Netzwerk Appliance'

Debian Lenny als Network Security Appliance für VPN, Proxy und andere Netzwerkdienste

Wie in meinem Artikel über PPPoE mit Debian schon angedeutet, bin ich ein Fan von Netzwerk Appliances auf Basis von Linux. In diesem Artikel möchte ich deshalb zunächst auf die Vorteile einer solchen Lösung eingehen und anschließend anhand eines Beispiels zeigen, wie eine entsprechende Konfiguration in der Praxis aussehen kann.

  • Kosten und Transparenz. Im Gegensatz zu den Appliances mancher Hersteller (Cisco, Checkpoint etc.) gibt es keine der Lizenzierung geschuldeten Beschränkungen z.B. was die Anzahl der Benutzer angeht und sowohl das System selbst als auch Softwareupdates sind kostenlos. Wer Linux bereits kennt, muss sich zudem nicht in die proprietären Betriebssysteme der Hersteller einarbeiten, sondern kann die erforderlichen Dienste in einer bekannten Umgebung betreiben.
  • Hardware und Leistung. Linux läuft auf Standardhardware, die im Fehlerfall einfach ersetzt werden kann und nicht aufwendig über den Hersteller im Rahmen eines Wartungsvertrages getauscht werden muss. Die Leistung von Standardhardware ist zudem meist wesentlich höher, da fertige Appliances (außer im höheren Preissegment) oft nur mit langsamen Prozessoren und wenig Speicher ausgestattet sind.
  • Flexibilität und Debugging. Linux kann beliebig um weitere Funktionalität erweitert werden, ohne neue Lizenzen oder Hardware kaufen zu müssen. Mittels Scripting lassen sich Aufgaben flexibel automatisieren und zur Analyse von Fehlern können Standardtools verwendet werden.

Folgendes Beispiel: Ein größeres Unternehmen bezieht zusätzliche Büroräume in Berlin und wird dort 25 Mitarbeiter beschäftigen. Zur Anbindung der Außenstelle an die Zentrale in Bonn ist eine VPN-Verbindung via IPsec erforderlich. Außerdem sollen die Mitarbeiter das Internet über den lokalen DSL-Anschluss nutzen. Realisiert werden soll das ganze mit Debian Lenny.

Im folgenden gehe ich davon aus, dass Kenntnisse im Bereich Debian/Linux vorhanden sind und dass Debian Lenny bereits installiert ist. Generell dienen die folgenden Hinweise nicht als genaue Erklärung, sondern als Übersicht, wie eine entsprechende Lösung aussehen kann.

Initiale Netzwerkkonfiguration

An besagtem Standort steht ein DSL-Anschluss mit mehreren öffentlichen IP-Adressen und Router des Providers zur Verfügung. Der PC ist deshalb mit zwei Netzwerkkarten ausgestattet: Dem internen Interface eth1 mit einer privaten IP-Adresse und dem externen Interface eth0 mit einer öffentlichen IP-Adresse. Nach der Installation von Debian wird zuerst die Konfiguration der beiden Interfaces vorgenommen bzw. kontrolliert:

debian:/# nano /etc/network/interfaces

Richtig konfiguriert sollte die Datei z.B. wie folgt aussehen:

# /etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# The internal network interface
allow-hotplug eth1
iface eth1 inet static
        address 192.168.66.1
        netmask 255.255.255.0
        network 192.168.66.0
        broadcast 192.68.66.255

# The external network interface
allow-hotplug eth0
iface eth0 inet static
        address 194.12.42.10
        netmask 255.255.255.248
        network 194.12.42.8
        broadcast 194.12.42.15
        gateway 194.12.42.9

Damit vor der Installation eines eigenen DNS-Servers Namen aufgelöst werden können, wird übergangsweise der DNS-Server des Providers in die Datei /etc/resolv.conf eingetragen:

# /etc/resolv.conf

nameserver 194.53.24.13

Da der Computer später Pakete weiterleiten wird, muss außerdem der entsprechende Eintrag für das Forwarding von IPv4 Paketen durch Entfernen des Kommentarzeichens in der Datei /etc/sysctl.conf aktiviert werden:

# /etc/sysctl.conf

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.conf.default.forwarding=1

Anschließend wird die Konfigurationsdatei mit dem Kommando sysctl -p neu eingelesen und der Eintrag in der Datei /proc/sys/net/ipv4/ip_forward sollte auf 1 wechseln:

debian:/# cat /proc/sys/net/ipv4/ip_forward
1

Installation von Standardtools

Vor der ersten Installation von Programmen wird zunächst geprüft, ob in der APT-Konfigurationsdatei /etc/apt/sources.list ein aktueller Debian-Mirror vorhanden ist, wie etwa der offizielle von debian.org:

# /etc/apt/sources.list

deb http://ftp.de.debian.org/debian/ lenny main
deb-src http://ftp.de.debian.org/debian/ lenny main

deb http://security.debian.org/ lenny/updates main contrib
deb-src http://security.debian.org/ lenny/updates main contrib

Nach dem Hinzufügen entsprechender Einträge werden die Paketlisten mittels apt-get update auf den aktuellen Stand gebracht und anschließend einige Standardprogramme installiert. Dazu gehört ein SSH-Server zur Administration des Rechners über das Netzwerk, das Netzwerkanalysetool tcpdump, das DNS-Tool host sowie der Textbetrachter less. Alle werden in einem Rutsch via apt-get installiert:

debian:/# apt-get install ssh tcpdump host less

Logging und Rotation der Logfiles

Nach der Installation der ersten Programme wird zunächst das Logging konfiguriert. Insbesondere für die Fehlersuche ist eine funktionierende und übersichtliche Protokollierung unerlässlich. Ich persönlich bevorzuge es dabei, alle Meldungen in eine einzige Logdatei schreiben zu lassen. Zur Analyse auch von größeren Logfiles stehen genügend Tools bereit und man hat eine zentrale Anlaufstelle für Fehlermeldungen. Dazu werden in der Konfigurationsdatei /etc/rsyslog.conf alle vorhandenen Regeln entfernt und durch eine einzige ersetzt:

# /etc/rsyslog.conf

###############
#### RULES ####
###############

# Alles in ein Logfile schieben

*.*                                     /var/log/messages

Nach einem Neustart des rsyslog werden alle Meldungen in die Datei /var/log/messages geschrieben. Standardmäßig wird die Datei einmal pro Woche neu angelegt und es werden vier alte Versionen aufgehoben. Für eine tägliche Rotation und eine Aufbewahrungszeit von einem Monat wird die Datei /etc/logrotate.d/rsyslog wie folgt abgeändert:

# /etc/logrotate.d/rsyslog

/var/log/messages
{
        rotate 30
        daily
        dateext
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                invoke-rc.d rsyslog reload > /dev/null
        endscript
}

Zeitsynchronisation mit NTP

Genau wie die Protokollierung ist eine genaue Systemzeit von großer Bedeutung. Im nächsten Schritt wird deshalb mit ntp und ntpdate ein NTP-Server installiert:

debian:/# apt-get install ntp ntpdate

Nach erfolgreicher Installation bezieht der Rechner seine Systemzeit in regelmäßigen Abständen von den in der Konfigurationsdatei /etc/ntp.conf angegebenen Quellen und fungiert außerdem als NTP Server für andere Computer im Netzwerk. Die Zeitsynchronisation wird in der Datei /var/log/messages wie folgt protokolliert:

debian:/# grep -i "ntp" /var/log/messages
Mar  7 11:04:36 debian ntpd[219]: synchronized to 78.46.10.11, stratum 2
Mar  7 11:54:17 debian ntpd[219]: synchronized to 14.40.10.11, stratum 2

Bei Bedarf kann die Zeit mit dem Befehl ntpdate pool.ntp.org auch manuell synchronisiert werden (hierzu muss der NTP-Server temporär beendet werden, da es ansonsten zu einer Fehlermeldung kommt).

DNS-Server mit BIND

Damit der Rechner selber und später die Clients Namen auflösen können, wird als nächstes der DNS-Server bind9 installiert:

debian:/# apt-get install bind9

Unmittelbar nach der Installation arbeitet bind als DNS Caching-Server und kann externe Namen auflösen. Da er Anfragen für die interne Domain des Unternehmens an den in der Zentrale befindlichen DNS-Server 172.16.15.1 weiterleiten soll, wird in der Datei /etc/bind/named.conf.local ein entsprechender Eintrag vorgenommen:

# /etc/bind/named.conf.local

zone "firma.intern" {
      type forward;
      forwarders { 172.16.15.1; };
};

zone "16.172.in-addr.arpa" {
      type forward;
      forwarders { 172.16.15.1; };
};

Zusätzlich wird der DNS-Server durch einen Eintrag in /etc/bind/named.conf.options an das Loopback- sowie das interne Interface eth1 (192.168.66.1) gebunden:

# /etc/bind/named.conf.options

options {
        listen-on { 127.0.0.1; 192.168.66.1; };
};

Anschließend wird bind mittels /etc/init.d/bind9 restart neu gestartet und der DNS-Server in /etc/resolv.conf auf 127.0.0.1 geändert. Ab sofort kann der Rechner Namen selber auflösen und dient anderen Rechnern im Netzwerk 192.168.66.0/24 als DNS-Server.

IPsec VPN mit strongSwan

Um die Außenstelle mit der Zentrale via VPN verbinden zu können, wird als nächstes strongSwan installiert.

debian:/# apt-get install strongswan

Verbunden werden soll das LAN 192.168.66.0/24 der Berliner Außenstelle mit dem LAN 172.16.0.0/16 der Zentrale in Bonn. Die Definition für den VPN-Tunnel wird in der Datei /etc/ipsec.conf hinterlegt:

# /etc/ipsec.conf

# Verbindung zwischen den Standorten
conn berlin-bonn
     left=194.12.42.10           # Lokaler Rechner
     leftsubnet=192.168.66.0/24  # Lokales Netzwerk
     leftsourceip=192.168.66.1   # Lokale IP fuer Tunnel
     #
     right=184.29.2.23           # VPN-Gateway Bonn
     rightsubnet=172.16.0.0/16   # Remote Netzwerk
     #
     ike=aes-sha-modp1536        # IKE Einstellungen
     ikelifetime=4h              # IKE Lebensdauer
     #
     esp=aes-sha1                # IPsec Einstellungen
     keylife=1h                  # IPsec Lebensdauer
     #
     authby=secret               # PSK Authenfizierung  
     auto=start                  # Starte Verbindung 

Der für die Verbindung erforderliche Pre Shared Key wird für das jeweilige Verbindungspaar in der Datei /etc/ipsec.secrets angegeben:

# /etc/ipsec.secrets

# Verbindung zwischen Berlin und Bonn
194.12.42.10   184.29.2.23:   PSK  "LHyiaaDkXPEwvBASjnuuiep7"

Ein erfolgreicher Aufbau der Verbindung wird in der Logdatei /var/log/messages wie folgt protokolliert:

pluto[3093]: "berlin-bonn" #66: initiating Main Mode
pluto[3093]: "berlin-bonn" #66: ignoring Vendor ID payload [strongSwan 4.1.11]
pluto[3093]: "berlin-bonn" #66: received Vendor ID payload [XAUTH]
pluto[3093]: "berlin-bonn" #66: received Vendor ID payload [Dead Peer Detection]
pluto[3093]: "berlin-bonn" #66: Peer ID is ID_IPV4_ADDR: '184.29.2.23'
pluto[3093]: "berlin-bonn" #66: ISAKMP SA established
pluto[3093]: "berlin-bonn" #67: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS+UP {using isakmp#66}
pluto[3093]: "berlin-bonn" #67: sent QI2, IPsec SA established {ESP=>0x4b5f8e0e <0x8ae5f9e2}

Zum manuellen Auf- bzw. Abbau stehen die Befehle ipsec up berlin-bonn bzw. ipsec down berlin-bonn zur Verfügung. Der Status wird mit ipsec statusall aufgerufen.

Proxyserver mit Squid

Zwar ließe sich der Internetzugang für die Mitarbeiter auch durch reines NAT realisieren, allerdings müsste man in diesem Fall auf Funktionen wie Zugriffsrichtlinien oder das Sperren von Inhalten verzichten. Aus diesem Grund wird Squid installiert und als transparenter Proxyserver eingesetzt:

debian:/# apt-get install squid

Die Konfiguration wird in der Datei /etc/squid/squid.conf vorgenommen. Dabei wird unter anderem festgelegt, wer den Proxy nutzen darf, welche Inhalte geblockt werden und welche ohne Einschränkungen erlaubt (gewhitelistet) sind:

# /etc/squid/squid.conf	

# ACCESS CONTROLS

# Liste mit gewhitelisteten Webseiten
acl whitelisted-websites  url_regex -i "/etc/squid/whitelisted-websites"
# Liste mit geblockten Webseiten
acl blocked-websites    url_regex -i   "/etc/squid/blocked-websites"
# Liste mit geblockten Anhaengen
acl blocked-attachments url_regex -i   "/etc/squid/blocked-attachments"
# Liste mit geblockten MIME-Typen
acl blocked-mimetypes   rep_mime_type -i "/etc/squid/blocked-mimetypes"
# Liste mit geblockten Clients
acl restricted-clients     src "/etc/squid/restricted-clients.txt"

# Internes Netzwerk in Bonn
acl bonn-lan               src 192.168.66.0/24
# Alle Netzwerke
acl all                    src 0.0.0.0/0.0.0.0

# Verbiete bestimmten Clients bestimmte Webseiten
http_access	    deny   restricted-clients	  blocked-websites
# Whitelisting bestimmter Webseiten
http_access         allow  whitelisted-websites
http_reply_access   allow  whitelisted-websites
# Blocken bestimmer Anhaenge bei allen anderen Webseiten
http_reply_access   deny   blocked-mimetypes
http_access         deny   blocked-attachments
# Erlaube Zugriff nur fuer Bonner LAN 192.168.66.0/24
http_access         allow  bonn-lan
http_access         deny   all

# NETWORK OPTIONS

# Hoere auf Port 3128 und sei ein transparenter Proxy
http_port 3128 transparent

# MEMORY CACHE OPTIONS

# Nutze 128MB vom Hauptspeicher als Cache
cache_mem 128 MB
# Maximale Objektgroesse im Cache ist 1MB
maximum_object_size_in_memory 1024 KB

# DISK CACHE OPTIONS

# Groesse des Cache auf Disk ist 256MB
cache_dir ufs /var/spool/squid 8 16 256
# Maximale Objektgroesse im Cache ist 4MB
maximum_object_size 4096 KB

# LOGFILE OPTIONS

# Protokolliere Webseitenzugriffe
access_log /var/log/squid/access.log squid

# OPTIONS FOR FTP GATEWAYING

# FTP User
ftp_user access@bonn.de

# ADMINISTRATIVE PARAMETERS

# Verantwortlicher Squid-Administrator
cache_mgr support@bonn.de

Die Dateien mit gewhitelisteten/verbotenen Inhalten sehen wie folgt aus:

# /etc/squid/whitelisted-websites

microsoft.com
apple.com
adobe.com
llnwd.net
windowsupdate.com
sun.com
f-secure.com
live.com
# /etc/squid/blocked-websites

facebook
ebay
# /etc/squid/blocked-attachments

\.ade$       #Access Project Extension (Microsoft)  
\.adp$       #Access Project (Microsoft)  
\.app$       #Executable Application  
\.bas$       #BASIC Source Code  
\.bat$       #Batch Processing  
\.chm$       #Compiled HTML Help  
\.cmd$       #DOS CP/M Command File, Command File for Windows NT  
\.com$       #Command  
\.cpl$       #Windows Control Panel Extension (Microsoft)  
\.csh$       #csh Script  
\.exe$       #Executable File  
\.fxp$       #FoxPro Compiled Source (Microsoft)  
\.gadget$    #Windows Vista gadget 
\.hlp$       #Windows Help File  
\.hta$       #Hypertext Application  
\.inf$       #Information or Setup File  
\.ins$       #IIS Internet Communications Settings (Microsoft)  
\.isp$       #IIS Internet Service Provider Settings (Microsoft)  
\.its$       #Internet Document Set, Internet Translation  
\.jse$       #JScript Encoded Script File  
\.ksh$       #UNIX Shell Script  
\.lnk$       #Windows Shortcut File  
\.mad$       #Access Module Shortcut (Microsoft)  
\.maf$       #Access (Microsoft)  
\.mag$       #Access Diagram Shortcut (Microsoft)  
\.mam$       #Access Macro Shortcut (Microsoft)  
\.maq$       #Access Query Shortcut (Microsoft)  
\.mar$       #Access Report Shortcut (Microsoft)  
\.mas$       #Access Stored Procedures (Microsoft)  
\.mat$       #Access Table Shortcut (Microsoft)  
\.mau$   
\.mav$       #Access View Shortcut (Microsoft)  
\.maw$       #Access Data Access Page (Microsoft)  
\.mda$       #Access Add-in (Microsoft), MDA Access 2 Workgroup (Microsoft)  
\.mdb$       #Access Application (Microsoft), MDB Access Database (Microsoft)  
\.mde$       #Access MDE Database File (Microsoft)  
\.mdt$       #Access Add-in Data (Microsoft)  
\.mdw$       #Access Workgroup Information (Microsoft)  
\.mdz$       #Access Wizard Template (Microsoft)  
\.msc$       #Microsoft Management Console Snap-in Control File (Microsoft)  
\.msi$       #Windows Installer File (Microsoft)  
\.msp$       #Windows Installer Patch  
\.mst$       #Windows SDK Setup Transform Script  
\.ops$       #Office Profile Settings File  
\.pcd$       #Visual Test (Microsoft)  
\.pif$       #Windows Program Information File (Microsoft)  
\.prf$       #Windows System File  
\.prg$       #Program File  
\.pst$       #MS Exchange Address Book File, Outlook Personal Folder File (Microsoft)  
\.reg$       #Registration Information/Key for W95/98, Registry Data File  
\.scf$       #Windows Explorer Command  
\.scr$       #Windows Screen Saver  
\.sct$       #Windows Script Component, Foxpro Screen (Microsoft)  
\.shb$       #Windows Shortcut into a Document  
\.shs$       #Shell Scrap Object File  
\.tmp$       #Temporary File/Folder  
\.url$       #Internet Location  
\.vb$        #VBScript File or Any VisualBasic Source  
\.vbe$       #VBScript Encoded Script File  
\.vbs$       #VBScript Script File, Visual Basic for Applications Script  
\.vsmacros$  #Visual Studio .NET Binary-based Macro Project (Microsoft)  
\.vss$       #Visio Stencil (Microsoft)  
\.vst$       #Visio Template (Microsoft)  
\.vsw$       #Visio Workspace File (Microsoft)  
\.ws$        #Windows Script File  
\.wsc$       #Windows Script Component  
\.wsf$       #Windows Script File  
\.wsh$       #Windows Script Host Settings File  
# /etc/squid/blocked-mimetypes

^application/octet-stream$     # Ausfuehrbare Dateien

Ebenso die Datei mit eingeschränkten Clients:

# /etc/squid/restricted-clients

192.168.66.112     # Herr Meier
192.168.66.113     # Herr Mueller

Alle Aufrufe über den Proxy werden inkl. IP-Adresse des Clients in der Datei /var/log/squid/access.log protokolliert:

debian:/# less /var/log/squid/access.log
1267976280.605    104 192.168.66.10 TCP_MISS/200 5415 GET http://www.google.de/ - DIRECT/72.14.221.99 text/html
1267976280.693     58 192.168.66.10 TCP_MISS/200 756 GET http://www.google.com/images/mgyhp_sm.png - DIRECT/72.14.221.99 image/png
1267976280.730     67 192.168.66.10 TCP_MISS/200 3978 GET http://www.google.de/extern_chrome/9ab888ab47cefe09.js - DIRECT/72.14.221.99 text/html
1267976280.763     33 192.168.66.10 TCP_MISS/204 389 GET http://www.google.de/csi?v=3&s=webhp&action=&e=0&ei=WMiTS7HWIcyi_AaMkYXtDA&expi=0&imc=2&imn=2&imp=1&rt= - DIRECT/72.14.221.99 text/html
1267976280.772     58 192.168.66.10 TCP_MISS/204 389 GET http://www.google.de/csi?v=3&s=webhp&action=&e=0&ei=WMiTS7HWIcyi_AaMkYXtDA&expi=0&imc=2&imn=2&imp=1&rt=prt.63,xjses.94,xjsee.110,xjsls.110,ol.125,iml.110 - DIRECT/72.14.221.104 text/html
1267976281.023     61 192.168.66.10 TCP_MISS/204 298 GET http://clients1.google.de/generate_204 - DIRECT/72.14.221.101 text/html
1267976298.651     37 192.168.66.10 TCP_MISS/200 5597 GET http://www.winrar.de/ - DIRECT/212.60.5.122 text/html
1267976298.664     22 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/css/all.css - DIRECT/212.60.5.122 -
1267976298.672     21 192.168.66.10 TCP_REFRESH_HIT/304 262 GET http://www.winrar.de/images/bg-header-logo-01.gif - DIRECT/212.60.5.122 -
1267976298.675     11 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/gold.jpg - DIRECT/212.60.5.122 -
1267976298.683     20 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/bg-header-logo-02.gif - DIRECT/212.60.5.122 -
1267976298.684     11 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/bg-banner-01.jpg - DIRECT/212.60.5.122 -
1267976298.684     21 192.168.66.10 TCP_REFRESH_HIT/304 262 GET http://www.winrar.de/images/kaufen.jpg - DIRECT/212.60.5.122 -
1267976298.685     20 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/emsi.jpg - DIRECT/212.60.5.122 -
1267976298.686     19 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/mxi.gif - DIRECT/212.60.5.122 -
1267976298.689     10 192.168.66.10 TCP_REFRESH_HIT/304 261 GET http://www.winrar.de/images/bg-info-area.gif - DIRECT/212.60.5.122 -
1267976298.694     11 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/awards.jpg - DIRECT/212.60.5.122 -
1267976298.696     11 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/bg-logo.gif - DIRECT/212.60.5.122 -
1267976298.697     10 192.168.66.10 TCP_REFRESH_HIT/304 261 GET http://www.winrar.de/images/bg-tabs-left.gif - DIRECT/212.60.5.122 -
1267976298.700     11 192.168.66.10 TCP_REFRESH_HIT/304 261 GET http://www.winrar.de/images/bg-tabs-right.gif - DIRECT/212.60.5.122 -
1267976298.705     10 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/bg-header.gif - DIRECT/212.60.5.122 -
1267976298.707     10 192.168.66.10 TCP_REFRESH_HIT/304 261 GET http://www.winrar.de/images/bg-info-area-separator.gif - DIRECT/212.60.5.122 -
1267976298.708     10 192.168.66.10 TCP_REFRESH_HIT/304 261 GET http://www.winrar.de/images/bg-more.gif - DIRECT/212.60.5.122 -
1267976298.712     11 192.168.66.10 TCP_REFRESH_HIT/304 261 GET http://www.winrar.de/images/bg-text-box-top.gif - DIRECT/212.60.5.122 -
1267976298.716     10 192.168.66.10 TCP_REFRESH_HIT/304 261 GET http://www.winrar.de/images/bg-text-box-bottom.gif - DIRECT/212.60.5.122 -
1267976298.719     11 192.168.66.10 TCP_REFRESH_HIT/304 261 GET http://www.winrar.de/images/bg-footer-separator.gif - DIRECT/212.60.5.122 -
1267976298.719     11 192.168.66.10 TCP_REFRESH_HIT/304 262 GET http://www.winrar.de/images/bg-footer.gif - DIRECT/212.60.5.122 -
1267976300.231     64 192.168.66.10 TCP_MISS/200 24811 GET http://www.winrar.de/download.php - DIRECT/212.60.5.122 text/html
1267976300.271     40 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/Kaufen_button_kl.jpg - DIRECT/212.60.5.122 -
1267976300.272     11 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/bg-banner-02.gif - DIRECT/212.60.5.122 -
1267976300.273     11 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/bg-banner-03.gif - DIRECT/212.60.5.122 -
1267976300.273     11 192.168.66.10 TCP_REFRESH_HIT/304 263 GET http://www.winrar.de/images/bg-banner-04.gif - DIRECT/212.60.5.122 -
1267976302.814      0 192.168.66.10 TCP_DENIED/403 1466 GET http://rarlab.com/rar/winrar-x64-392d.exe - NONE/- text/html

Entsprechend der Datenmenge wird die Rotation der Squid-Logfiles in /etc/logrotate.d/squid ebenfalls auf täglich und eine Aufbewahrungszeit von 30 Tagen geändert (siehe oben).

Firewall und NAT mit iptables

Zu guter Letzt muss geregelt werden, wer mit wem kommunizieren darf und welche Dienste auf dem Rechner selbst von außerhalb erreichbar sind. Außerdem sollen einige Dienste im Internet auch ohne Proxy via NAT erreichbar sein. Die dafür erforderlichen Regeln werden mit iptables erstellt und als Script /etc/init.d/firewall gespeichert:

#! /bin/sh
### BEGIN INIT INFO
# Provides:             firewall
# Required-Start:       $network
# Required-Stop:
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
### END INIT INFO

# SET VARIABLES

IPTABLES="/sbin/iptables"
EXTIF=eth0
INTIF=eth1

case "$1" in
start)

# GLOBAL RULES

# enable connection tracking
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# delete existing rules
$IPTABLES -F
$IPTABLES -F log-and-drop
$IPTABLES -F log-and-reject
$IPTABLES -X log-and-drop
$IPTABLES -X log-and-reject
$IPTABLES -F -t nat
$IPTABLES -F -t mangle

# definition of custom chains
$IPTABLES -N log-and-drop
$IPTABLES -A log-and-drop -j LOG --log-prefix "dropped: "
$IPTABLES -A log-and-drop -j DROP
$IPTABLES -N log-and-reject
$IPTABLES -A log-and-reject -j LOG --log-prefix "rejected: "
$IPTABLES -A log-and-reject -j REJECT

# set default policy
$IPTABLES -P INPUT    DROP
$IPTABLES -P OUTPUT   ACCEPT
$IPTABLES -P FORWARD  DROP

# allow related connections
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# INCOMING CONNECTIONS

# allow everything to the loopback and the internal interface
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -i $INTIF -j ACCEPT

# allow ICMP for diagnostics
$IPTABLES -A INPUT -p icmp -j ACCEPT
$IPTABLES -A FORWARD -p icmp -j ACCEPT

# allow SSH from everywhere
$IPTABLES -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT

# allow udp/500 (isakmp) for ipsec
$IPTABLES -A INPUT -i $EXTIF -p udp --dport 500 -j ACCEPT

# allow udp/4500 for ipsec nat traversal
$IPTABLES -A INPUT -i $EXTIF -p udp --dport 4500 -j ACCEPT

# allow ip protocol 50 (esp) for ipsec 
$IPTABLES -A INPUT -i $EXTIF -p 50 -j ACCEPT

# REDIRECT HTTP TRAFFIC TO SQUID

# do *not* redirect http traffic destined for internal networks
for source in 192.168.66.0/24 ; do
  for destination in 172.16.0.0/16 ; do
    $IPTABLES -t nat -A PREROUTING -s $source -d $destination -j ACCEPT
  done
done

# do not redirect anything from local fileserver
$IPTABLES -t nat -A PREROUTING -p tcp -s 192.168.66.10 -j ACCEPT

# redirect any other http traffic to squid
for source in 192.168.66.0/24 ; do
  $IPTABLES -t nat -A PREROUTING -p tcp -s $source --dport 80 \
            -j REDIRECT --to-port 3128
done

# TRAFFIC BETWEEN VPN NETWORKS

# allow all outgoing connections to bonn that is covered by ipsec
$IPTABLES -A FORWARD -i $INTIF -s 192.168.66.0/24 -o $EXTIF \
          -d 172.16.0.0/16 -m policy --pol ipsec --dir out \
          --mode tunnel --tunnel-dst 184.29.2.23/32 -j ACCEPT

# allow all incoming connections from berlin that is covered by ipsec
$IPTABLES -A FORWARD -o $INTIF -d 192.168.66.0/24 -i $EXTIF \
          -s 172.16.0.0/16 -m policy --pol ipsec --dir in \
          --mode tunnel --tunnel-src 184.29.2.23/32 -j ACCEPT

# INTERNET ACCESS FOR LAN

# allow full access from local fileserver to the internet
$IPTABLES -A FORWARD -s 192.168.66.10/32 -o $EXTIF -m policy --pol none \
          --dir out -j ACCEPT

# allow several tcp services for berlin lan to the internet
$IPTABLES -A FORWARD -s 192.168.66.0/24 -o $EXTIF -p tcp -m multiport \
          --destination-ports 21,1863 -m policy --pol none --dir out \
          -j ACCEPT

# allow several udp services for berlin lan to the internet
$IPTABLES -A FORWARD -s 192.168.66.0/24 -o $EXTIF -p udp -m multiport \
          --destination-ports 7001 -m policy --pol none --dir out \
          -j ACCEPT

# masquerade connections from berlin lan to the internet
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -s 192.168.66.0/24 -m policy \
          --pol none --dir out -j MASQUERADE

# GLOBAL RESTRICTIONS

# drop/reject and log everything else
$IPTABLES -A INPUT -j log-and-drop
$IPTABLES -A FORWARD -j log-and-reject
	
	;;
stop)
	/sbin/iptables -F
        /sbin/iptables -P INPUT ACCEPT
        /sbin/iptables -P FORWARD ACCEPT
        /sbin/iptables -P OUTPUT ACCEPT
	;;
*)
	echo "Usage: $0 start | stop" 1>&2
	;;
esac

Anschließend wird das Script ausführbar gemacht und ein symbolischer Link im Runlevelverzeichnis /etc/rcS.d erstellt, damit es beim Booten ausgeführt wird und die Regeln automatisch in Kraft treten:

debian:/# chmod 755 /etc/init.d/firewall
debian:/# ln -s /etc/init.d/firewall /etc/rcS.d/S43firewall

Alternativ können die Links auch mittels der Programme rcconf oder update-rc.d automatisch erstellt werden.

Manuell können die Regeln mittels /etc/init.d/firewall start und /etc/init.d/firewall stop aktiviert bzw. deaktiviert werden. Nach Ausführen des Scripts ist die Firewalll aktiv und regelt den Verkehr. Blockierte Verbindungen werden ebenfalls in der Logdatei /var/log/messages protokolliert:

debian:/# grep -i "dropped" /var/log/messages/
Mar  7 14:11:38 debian kernel: [171778.967837] dropped: IN=eth0 OUT= MAC=00:1b:21:55:75:dc:00:14:22:21:5a:22:08:00 SRC=174.139.243.244 DST=194.12.42.10 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=6456 PROTO=TCP SPT=80 DPT=48494 WINDOW=16384 RES=0x00 ACK SYN URGP=0
Mar  7 14:25:32 debian kernel: [172613.145448] dropped: IN=eth0 OUT= MAC=00:1b:21:55:75:dc:00:13:72:fe:97:0c:08:00 SRC=121.14.153.168 DST=194.12.42.10 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=42715 DF PROTO=TCP SPT=80 DPT=48494 WINDOW=16384 RES=0x00 ACK SYN URGP=0
Mar  7 14:29:59 debian kernel: [172879.810636] dropped: IN=eth0 OUT= MAC=00:1b:21:55:75:dc:00:13:72:fe:97:0c:08:00 SRC=116.236.180.2 DST=194.12.42.10 LEN=48 TOS=0x00 PREC=0x00 TTL=114 ID=15463 PROTO=TCP SPT=63134 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
Mar  7 14:42:03 debian kernel: [173604.180337] dropped: IN=eth0 OUT= MAC=00:1b:21:55:75:dc:00:13:72:fe:97:0c:08:00 SRC=121.14.153.168 DST=194.12.42.10 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=42673 DF PROTO=TCP SPT=8080 DPT=10766 WINDOW=16384 RES=0x00 ACK SYN URGP=0

Und voilà – wir haben eine kleine Appliance, die alle erforderlichen Aufgaben erfüllt und bei Bedarf beliebig erweitert werden kann, ohne zusätzliche Lizenzen oder neue Hardware kaufen zu müssen. Sinnvolle Ergänzungen und Hinweise nehme ich natürlich gerne entgegen!