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!