Router-Firewall selbst Bauen

<---TOC--->

In diesem Tutorial lernen wir zuerst einen Linux NAT Router mit Firewall und IP Masquerading für den Zugang über ein Kabel- oder DSL-Modem zu erstellen und dann optional zusätzliche Services, wie DNS, DHCP und Port-Forwarding zu aktivieren.

Inhalt

Einleitung

Dieses Tutorial möchte schritt für schritt erklären, wie man erst ein sicheres Linux System als Internet Gateway aufsetzt, als nächstes das Netzwerk mit dem Internet verbindet, grundsätzliche Router Funktionen aktiviert, eine Firewall mit IPTABLES konfiguriert und als letztes optional einen DHCP und DNS Server für die einfache Netzwerkverwaltung aufsetzt, sowie über Port Forwarding zusätzliche Dienste auf einem Zweitcomputer laufen lassen kann.

Dieses Tutorial ist in 3 Teile unterteilt:

1. Router / Firewall selbst Bauen
Hier lernen wir, wie man einen einfachen Router mit Firewall erstellt; wir installieren die nötige Software und Konfigurieren den Router und das Gateway.

2. Das Gateway in eine Festung verwandeln
Hier werden Konzepte erklärt um das Gateway zusätzlich abzusichern

3. Zusätzliche Services Installieren
Hier werden DNS, DHCP und zusätzliche Webserver über Port-Forwarding aufgesetzt.

Das Kapitel über DHCP, DNS und Port Forwarding ist optional, da es bereits ein (geringes) Sicherheitsrisiko darstellt und wenn immer möglich nicht auf der Firewall laufen sollte.

Dieses Tutorial lehnt sich an das sehr gute: Private Networks and Roadrunner using IP Masquerading von Mark Nielsen und Andrew Byrd (http://www.linuxgazette.com/issue51/nielsen.html) an, das leider mittlerweile etwas outdated geworden ist.

Voraussetzungen

Obwohl ich darauf geachtet habe das Tutorial so einfach wie möglich zu halten, muss ich voraussetzen, dass du Windows fortgeschritten beherrschst, Linux schon installiert hast und weisst wie man ein Netzwerk aufsetzt.
-Falls nicht, solltest du erst mal versuchen ein normales Netzwerk ohne Gateway und Firewall aufzusetzen.

Sinnvolle Lesevorbereitung

Folgende Informationen wären sinnvoll, aber nicht unbedingt nötig zu lesen, bevor man anfängt; sie vermitteln einem das Basiswissen über die vorgestellten Konzepte:

  • Netzwerke – Grundsätzliche Informationen zu TCP/IP Netzwerken
  • IP Masquerading
  • Unix Security

Die Idee dahinter

{img fileId="52" thumb="y" alt="" rel="box[g]"}
Jeder schwarze Punkt im Bild oben stellt eine Netzwerkkarte dar und jede linie ist ein CAT5 Netzwerkkabel.
Wie man sieht, braucht es an jedem angeschlossenen Computer eine Netzwerkkarte und zwei Netzwerkkarten im Gateway.
Sinn und Zweck der ganzen Sache: Alle PCs sind im internen Netzwerk und haben keinen direkten Zugang zum Internet, sind also auch nicht direkt erreichbar.
Der Gateway Rechner ist dann der einzige, der direkten Zugang zum Internet hat und sämtlicher Internet-Verkehr muss über diesen -mit Firewall geschützten- Rechner laufen und stellt so die Mauer zwischen dem Netzwerk und der Aussenwelt dar.

Netzwerk-Überlegungen

Heutzutage macht es durchaus Sinn, wenn man sich auch im Heim-Bereich Gedanken über die Netzwerk-Topologie macht.

Beispielsweise wurde hier früher empfohlen ein Netzwerk 10.0.0.0/8 (subnetzmaske: 255.0.0.0) aufzubauen, doch dies birgt einen grossen Nachteil: Damit sind zwar über 16 Millionen Hosts möglich, aber kein einziges subnet mehr – Das dies zum Verhängnis werden kann, wenn man z.B. dann ein zweites Netzwerk aufbauen- und diese beiden mit einem VPN verbinden will, das musste auch der Autor dieses Artikels kürzlich feststellen…. 😉

Für diesen Artikel definieren wir deshalb ein Klasse-A-Netzwerk (10.1.1.x/24) mit der Netzmaske: 255.255.255.0 – Natürlich kannst du aber auch einen anderen Netzwerkblock wählen, wenn du weisst was du tust. 😉

Mit dem oben genannte Schema lassen sich 254 Hosts anschliessen (10.1.1.1 bis 10.1.1.254) und dürfte für die meisten Menschen mehr als genug sein. – Kommt dann ein zweites Netzwerk dazu, bekommt das das Netzwerk: 10.1.2.x, das dritte 10.1.3.x, usw.

– Praktisch zum Einsatz kommen kann das beispielsweise, wenn du momentan noch bei deinen Eltern wohnst; irgendwann aber ausziehen möchtest und das Netzwerk deiner Eltern mit dem deiner neuen Wohnung verbinden willst. -> Dieses Szenario wird ausführlich im Workshop: Mit OpenVPN zwei Netzwerke verbinden behandelt.

Als Domain Namen nahm ich hier: home.lan (der Domainname kann, muss aber nicht existieren) genommen.
Das Gateway heisst hier gateway.home.lan (Interne IP: 10.1.1.1) und die drei angeschlossenen Workstations heissen: pc01.home.lan (10.1.1.10), pc02.home.lan (10.1.1.20) und pc03.home.lan (10.1.1.30) -Es steht dir natürlich hier frei das ganze nach belieben mit mehr oder weniger PCs zu machen.

Auswahl der Hardware

Die Gateway Maschine braucht sehr wenig Ressourcen, es kann also auch ein alter 486-er mit relativ wenig Speicher sein; IP-Pakete zu Routen ist keine grosse Arbeit. Wenn Linux darauf laufen kann, sollte es auch mit dem anderen keine Probleme haben.
Als Gateway Rechner habe ich einen alten Dell mit 333 MHz, 128 MB RAM und 3 GB Festplatte genommen weil der grad rumstand. Aber nochmals: Es wird kein so leistungsfähiger Rechner für die Aufgabe gebraucht; ein Pentium 90 mit 16 MB RAM und 500 MB Harddisk tut’s längstens noch.

Bei den Netzwerkkarten kann es bereits Sinn machen auch für die Internet-Netzwerkkarte auf GBit zu setzten; da einige Provider bereits Internet-Zugänge mir über 100MBit/s anbieten.

Weiter braucht man noch einen Switch, welcher ist aber relativ egal. Falls man später mit VLAN’s arbeiten möchte, sollte es ein managed switcht sein. Für dieses tutorial spielt das jedoch keine Rolle.

Eine Tastatur und Monitor braucht’s nur während der Installation, da sich das Gateway später über SSH bequem vom PC aus "Fernwarten" lässt.

Software

Als Software für das Gateway nehmen wir hier ein aktuelles Debian Release. Grund: Debian ist schon von Haus aus sehr auf Sicherheit konzipiert und dazu extrem einfach zu handhaben.

Debian kann man entweder über das "net-inst" ISO, welches auf CD gebrannt wird über das Internet installieren, oder man lädt sich ein ISO der vollen CD. Die Internet Installation ist aus Sicherheitsgründen jedoch nicht empfehlenswert, sofern das gateway bereits direkt am Internet angeschlossen ist.

Die Workstations können irgend ein TCP/IP basiertes Betriebssystem, solche wie Windows (95/98/ME/NT/2000/XP/7/8…), Linux, MacOS, usw. sein. Es müssen nur alle eine lauffähige Netzwerkkarte eingebaut haben.

Linux System aufsetzen

Ein sicheres System beginnt als allererstes mit einer frischen, auf Sicherheit bedachten Installation!

Wir werden deswegen hier ein frisches Debian System mit nur den wichtigsten Komponenten installieren. Alles zusätzliche, wie X-Server, KDE/GNOME, FTP-Server, usw. birgt später ein Sicherheitsrisiko.

Bei der Installation von Debian einfach ENTER drücken und sich vom Assistenten leiten lassen; die Installation sollte mehr oder weniger selbsterklärend sein.

Nach der Sprachwahl, Tastatur, Einstellungen, usw. gelangt man zur Partitionierung ("Partition Disks")

Hier wählen wir: "Manually edit Partition Table".
Nachdem wir evtl. schon vorhandene Partitionen entfernt haben, erstellen wir neue nach diesem Schema:

<PRE>
Partition Minimum % des totalen Empfohlen
/ 200 MB 10% 1 GB
/boot 100 MB 300 MB 300 MB
/home 10 MB 25% 100 MB
/tmp 40 MB 10% 100 MB
/usr 500 MB 45% 2 GB
/var 384 MB 10% 500 MB
swap 64 MB 2X RAM 512 MB
</PRE>

Nachdem alles partitioniert ist, kommen wir zur Auswahl der Programm-Pakete.
Da es bei einem Firewall System essentiell ist, das darauf möglichst wenig läuft, lassen wir bei der Paketauswahl vorerst alles deaktiviert.

Falls während der Installation nach der Konfiguration der Netzwerkkarte(n) gefragt wird, wählen wir bei der ersten (eth0): "statisch"; als IP Adresse ist 10.1.1.1, als subnet mask 255.255.255.0 und als Standard Gateway 10.1.1.1 einzugeben.
Bei der zweiten (eth1): "DHCP zugewiesene IP Adresse (DHCP)".
Den Rest kann man bei den Standard werten belassen.
Hinweis: Falls nicht beide Netzwerkkarten erkannt worden sind, muss man nach der Installation die nicht erkannte(n) mittels Installation der Treiber so konfigurieren, dass sie lauffähig sind bevor man weitermacht; wer sich den ärger ersparen will, kauft für n paar Euro ne andere Netzwerkkarte die erkannt wird…

Dass das Passwort, dass man eingeben muss, sehr kompliziert sein soll, braucht wohl nicht extra erwähnt zu werden… 😉

Zusätzliche Software installieren

Da das System nun praktisch keine Software drauf hat, installieren wir das nötigste noch von hand:

aptitude install vim vlan locate ntp tmux unzip rsync telnet lsof sudo less iftop atop htop ethtool acl setfacl

Dafür schmeissen wir unötige Software weg:

aptitude purge ruby inetd portmap resolvconf nano ufw wireless-regdb crda qstat qstat

Konfiguration

Nach dem ersten Login auf dem gateway können wir mit der Konfiguration beginnen.
Erst werden wir die Netzwerkkarten überprüfen und ggf. konfigurieren, dann das Rounting aktivieren, Firewall und ggf. Port-Forwarding aufsetzen und zum schluss ein Firewall Script schreiben.

Netzwerkkarten

Erst müssen wir die Datei ‚/etc/network/interfaces‘ editieren.
Darin sollte stehen:

# Loopback network interface
auto lo
iface lo inet loopback
 
# Internal Interface
auto eth0
iface eth0 inet static
address 10.1.1.1
netmask 255.255.255.0
network 10.1.1.0
gateway 10.1.1.1
 
# External interface
auto eth1
iface eth1 inet dhcp

Firewall und IP Masquerading konfigurieren

Ping’e nun erst mal einige Server draussen um zu testen, ob die Internet Verbindung klappt.

Stelle nun sicher, dass alle Workstations und das Gateway am Switch angeschlossen sind.
Die erste Netzwerkkarte (eth0) wird wie die PCs mit dem Switch verbunden. Das Kabel- oder DSL-Modem steckst du bei der zweiten Netzwerkkarte im Gateway an (eth1).

Gib nun dem ersten PC im Netzwerk die IP Adresse 10.1.1.10, dem zweiten 10.1.1.20, dem dritten 10.1.1.30, usw. Die Subnetz Maske ist immer 255.255.255.0 und das Standard Gateway 10.1.1.1.
Hinweis: Die DNS Server Adressen kannst du beim Provider raus finden, oder z.B. unter Windows durch Eingabe von

ipconfig /all

in der Konsole. (Start->Ausführen->"cmd" (Win 2000/XP) oder "command" (Win 95/98/ME) eingeben) – Dies natürlich bevor du die Konfigurationen an den Workstations änderst!.

Nun musst du noch das Konfigurationsscript für die Firewall erstellen.
Mittels Eingabe von <PRE>vi /etc/init.d/firewall</PRE> erstellst du die Firewall Start- und Konfigurationsdatei, die das Routing und die Firewall aktiviert.

In diese Datei gibst du folgende Zeilen ein:

#!/bin/bash
 
### BEGIN INIT INFO
# Provides:             firewall
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Starts iptables firewall
# Description:          iptables provides packet filter security.
### END INIT INFO
 
 
################################################################################
# Script Written by Steven Varco, root@webserver.tech-island.com
#
# DESCRIPTION: Starts and stops iptables firewall
# CREATED: 04.09.2013
#
# CHANGE HISTORY:
# Date:       Author:         Description
# =============================================================================
# 04.09.2013  Steven Varco      - Created script
################################################################################
 
# Variables
IPTABLES=$(which iptables)
IPTABLES_RESTORE=$(which iptables-restore)
IPTABLES_APPLY=$(which iptables-apply)
CONFIG=/etc/firewall.conf
 
# Source function library.
. /etc/init.d/functions
 
 
start()
{
  echo "Loading Firewall..."
  # Delete all previous tables and chains
  for i in $tables; do
    # Flush firewall rules.
    $IPTABLES -t $i -F;
    let ret+=$?;
 
    # Delete firewall chains.
    $IPTABLES -t $i -X;
    let ret+=$?;
 
    # Set counter to zero.
    $IPTABLES -t $i -Z;
    let ret+=$?;
  done
 
  # Load firewall
  $IPTABLES_RESTORE $CONFIG
  RC=$?
 
  if [ "$RC" -eq 0 ]; then
    echo_ok
  else
    echo_fail
  fi
 
  exit $RC
}
 
apply()
{
  echo "Applying Firewall..."
  # Delete all previous tables
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -t nat -F
  $IPTABLES -t nat -X
 
  # Load firewall
  $IPTABLES_APPLY $CONFIG
  RC=$?
 
  if [ "$RC" -eq 0 ]; then
    echo_ok
  else
    echo_fail
  fi
 
  exit $RC
}
 
 
stop() {
 
  echo -n $"Firewall shutting down..."
 
  # Delete Rules
  $IPTABLES -F
  $IPTABLES -X
  # Delete NAT-Table
  $IPTABLES -t nat -F
  $IPTABLES -t nat -X
  # Delete all previous tables and chains
  for i in $tables; do
    # Flush firewall rules.
    $IPTABLES -t $i -F;
    let ret+=$?;
 
    # Delete firewall chains.
    $IPTABLES -t $i -X;
    let ret+=$?;
 
    # Set counter to zero.
    $IPTABLES -t $i -Z;
    let ret+=$?;
  done
 
  #Default Policy Accept (allow all)
  $IPTABLES -P INPUT ACCEPT
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P OUTPUT ACCEPT
 
  echo_ok
  echo_warning; echo "Firewall is OFF!"
 
  exit 0
}
 
reload()
{
  $0 stop
  $0 start
}
 
reloadapply()
{
  $0 stop
  $0 apply
}
 
restart()
{
  # For security reasons stop external interface before reloading
  ifdown $EXT_INTERFACE
  sleep 2
  $0 stop
  # wait a couple of seconds for the firewall to finish closing down
  sleep 2
  $0 start
  sleep 2
  ifup $EXT_INTERFACE
}
 
status()
{
  $IPTABLES -v --list --line-numbers
}
 
help() {
 
#prints a short help
 
cat << HELP
 
This Script starts/stops an $IPTABLES-Based Firewall
 
Usage: firewall {start|stop|reload|restart|apply|reloadapply|status|help}
Example: ./firewall reload
 
check the Firewall-Rules with
$IPTABLES --list
 
HELP
exit 0
}
 
case "$1" in
start) start ;;
stop) stop ;;
reload) reload ;;
restart) restart ;;
apply) apply ;;
reloadapply) reloadapply ;;
status) status ;;
help) help ;;
<ul>
<li>)</li>
</ul>
echo $"Usage : $0 {start|stop|reload|restart|apply|reloadapply|status|help}"
exit 1
esac
exit 0
 
#end of file

Speichere das ganze und verlasse den Editor.4

Dann erstellst du noch ein file "functions.sh" welches die Ausgabe des scripts ein bisschen schöner macht:

RES_COL=60
MOVE_TO_COL="echo -en 33[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en 33[1;32m"
SETCOLOR_FAILURE="echo -en 33[1;31m"
SETCOLOR_WARNING="echo -en 33[1;33m"
SETCOLOR_NORMAL="echo -en 33[0;39m"
 
function echo_done()
{
  $MOVE_TO_COL
  echo -n "[ "
  $SETCOLOR_SUCCESS
  echo -n "DONE"
  $SETCOLOR_NORMAL
  echo " ]"
  return 0
}
 
function echo_ok()
{
  $MOVE_TO_COL
  echo -n "[  "
  $SETCOLOR_SUCCESS
  echo -n "OK"
  $SETCOLOR_NORMAL
  echo "  ]"
  return 0
}
 
function echo_warning()
{
  $SETCOLOR_WARNING
  echo -n "WARNING: "
  $SETCOLOR_NORMAL
  return 1
}
 
function echo_failure()
{
  $MOVE_TO_COL
  echo -n "[ "
  $SETCOLOR_FAILURE
  echo -n "FAILED"
  $SETCOLOR_NORMAL
  echo " ]"
  return 2
}

Speichere und schliesse auch diese Datei.

Nun musst du das firewall-script noch ausführbar machen; folgender Befehl ist dafür zuständig:

chmod +x /etc/init.d/firewall

Dieses script ist nun fürs starten/stoppen der firewall zuständig, enthällt aber noch keine Regeln.
Deshalb wird nun noch das file mit den firewall-Regeln erstellt:

#========================== Global Section ====================================
### currently not used
#*raw
#:PREROUTING ACCEPT
#:OUTPUT ACCEPT
#COMMIT
 
 
#========================== NAT Traffic =======================================
# Rules for NAT-ing
<ul>
<li>nat</li>
</ul>
:PREROUTING ACCEPT
:OUTPUT ACCEPT
:POSTROUTING ACCEPT
 
#-------------------------- Port-Forwardings ---------------------------------
# PORT:         PROTOCOL:       FROM:           TO:                     DESC:
# 80            HTTP            INTERNET        TESTPC (10.1.1.40)      Beispiel Webserver
 
#-A PREROUTING -i eth1 -p tcp -m multiport --dports 80 -j DNAT --to-destination 10.1.1.40
 
 
#-------------------------- Masquerading -------------------------------------
# Enable masquerading for all interfaces
-A POSTROUTING -j MASQUERADE
COMMIT
 
 
#========================== mangle ============================================
### currently not used
#*mangle
#:PREROUTING ACCEPT
#:INPUT ACCEPT
#:FORWARD ACCEPT
#:OUTPUT ACCEPT
#:POSTROUTING ACCEPT
#COMMIT
 
 
#========================== Filter ============================================
# The FILTER section of the ruleset is where we initially drop all packets and then selectively open certain ports.
# We will also enable logging of all dropped requests.
<ul>
<li>filter</li>
</ul>
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP
:LOG_DROP -
:LOG_ACCEPT -
:LOG_FORWARD -
:icmp_packets -
:invalid_flags -
 
 
 
#========================== Custom chains =====================================
 
#-------------------------- Chain: Invalid Flags ------------------------------
# Here is where unwanted packet types get dropped.
# This helps in making port scans against the server a bit more time
# consuming and difficult, but not impossible.
-A invalid_flags -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A invalid_flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A invalid_flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A invalid_flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A invalid_flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A invalid_flags -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A INPUT -p tcp -j invalid_flags
 
 
#-------------------------- ICMP Packets --------------------------------------
# Enable selected ICMP requests
-A icmp_packets -p icmp --icmp-type echo-request -j ACCEPT
-A icmp_packets -p icmp --icmp-type echo-reply -j ACCEPT
-A icmp_packets -p icmp --icmp-type destination-unreachable -j ACCEPT
-A icmp_packets -p icmp --icmp-type source-quench -j ACCEPT
-A icmp_packets -p icmp --icmp-type time-exceeded -j ACCEPT
-A icmp_packets -p icmp -j DROP
-A INPUT -p icmp -j icmp_packets
-A OUTPUT -p icmp -j icmp_packets
 
 
 
#========================== Inbound Traffic ===================================
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
#-------------------------- Policies -----------------------------------------
# IFACE:        PORT:           PROTOCOL:       FROM:           DESC:
# lo            ANY             ANY             ANY             Local interface
# eth0          22              tcp             eth0            SSH from local net
# eth1          N/A             ICMP            ANY             restricted ICMP
 
 
-A INPUT -i lo -s 127.0.0.0/8 -j ACCEPT
-A INPUT -i eth0 -s 10.1.1.0/24 -p tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -i eth1 -j icmp_packets
 
# Log all dropped requests
-A INPUT -j LOG_DROP
 
 
#========================== Outbound Traffic ==================================
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
#-------------------------- Policies -----------------------------------------
# IFACE:        PORT:           PROTOCOL:       TO:             DESC:
# lo            ANY             ANY             ANY             Local interface
# eth1          N/A             ICMP            ANY             restricted ICMP
# eth1          53              tcp,udp         ANY             DNS lookups
# eth1          67              udp             DHCP            DHCP domain
# eth1          80              tcp             ANY             http: updates, noip.com alternate port
 
-A OUTPUT -o lo -d 127.0.0.0/8 -j ACCEPT
-A OUTPUT -o eth1 -j icmp_packets
-A OUTPUT -o eth1 -p tcp -m multiport --dports 53,80 -m state --state NEW -j ACCEPT
-A OUTPUT -o eth1 -p udp -m multiport --dports 53 -j ACCEPT
#DHCP
#-A OUTPUT -o eth1 -d 10.181.0.1 -p udp -m udp --dport 67 -m state --state NEW -j ACCEPT
 
# Log all dropped requests
-A OUTPUT -j LOG_DROP
 
 
#========================== Forward Traffic ===================================
# see PREROUTING tables for details
 
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
 
#-A FORWARD -i eth1 -m state --state NEW -p tcp -m multiport --dports 80 -j ACCEPT
 
# LOG and DROP spoofing attacks
-A FORWARD -s 10.1.1.0/24 -i eth1 -j LOG --log-prefix "iptables [SPOOFING]: " --log-level 6
-A FORWARD -s 10.1.1.0/24 -i eth1 -j DROP
-A FORWARD ! -i eth1 -m state --state NEW -j ACCEPT
 
-A FORWARD -j LOG_FORWARD
 
 
#========================== Logging ===========================================
# Here we have 2 sets of logging rules. One for dropped packets to log all dropped requests
# and one for accepted packets, should we wish to log any accepted requesets.
-A LOG_DROP -j LOG --log-prefix "iptables [DROP]: " --log-tcp-options --log-ip-options
-A LOG_DROP -j DROP
-A LOG_ACCEPT -j LOG --log-prefix "iptables [ACCEPT]: " --log-tcp-options --log-ip-options
-A LOG_ACCEPT -j ACCEPT
-A LOG_FORWARD -j LOG --log-prefix "iptables [FORWARD]: " --log-level 6
-A LOG_FORWARD -j ACCEPT
 
COMMIT

Starte nun das Script mittels:
<PRE>/etc/init.d/firewall start</PRE>

Der Internetverkehr ist nun sicher und du solltest mit allen PCs Zugang zum Internet haben!

Allerdings wird die Firewall noch nicht automatisch gestartet, so dass du bei jedem Neustart des Gateways diese wieder manuell starten müsstest.
Da dies ziemlich lästig ist, lassen wir die Dateien bei jedem Neustart automatisch über ein "rc.d-Startscript starten"; dieses ist vergleichbar mit dem Autostart-Ordner von Windows.

Dazu ist folgedens Kommando nötig:

update-rc.d firewall enable

Starte nun Linux neu (<PRE>shutdown -r now</PRE>) und wenn du alles richtig gemach hast, solltest du jetzt sicher ins Internet kommen!

{IMG(fileId="58",thumb="y",rel="box[g]",imalign="left")}{IMG} Abschliessend noch ein Hinweis zu Firewall-Konfigurationen, die den Server "unsichtbar" machen sollen, etwa durch das nicht zulassen von ping-signalen:
Das "unsichtbar machen" von Systemen bringt keine wirkliche sicherheit, da praktisch alle neuen würmer und cracker-tools einen request an den Zielrechner senden, egal ob dieser erreichbar ist, oder nicht. Profis hingegen können dennoch rauskriegen, ob dein System wirklich nicht existeiert oder einfach nur "versteckt" ist, da es gemäss der Struktur des Internets unmöglich ist ein system "unsichtbar" zu machen. Das ignorieren von pings macht zudem die fehleranalyse nur unnötig kompliziert und ist auch von der sicherheits-szene verpönnt.

Zusätzliche Firewall-Regeln

Hier noch einige zusätzlichen Firewall Regeln

SMB-Traffic

Vor allem Windows-PCs schicken häufig ziellos nachrichten an alle Hosts, die dann beim gateway das log zumüllen können. Wen das stört kanns zulassen:

-A INPUT -i eth1 -s 10.1.1.0/24 -p tcp --dport 137:139 -m state --state NEW -j ACCEPT
-A INPUT -i eth1 -s 10.1.1.0/24 -p udp --dport 137:139 -m state --state NEW -j ACCEPT
-A INPUT -i eth1 -s 10.1.1.0/24 -d 10.1.1.255 -p udp -m multiport --dports 138 -m state --state NEW -j ACCEPT

Broadcasts

-A INPUT -i eth1 -s 10.1.1.0/24 -d 255.255.255.255 -p udp --dport 7423 -j ACCEPT

Ganglia Mulitcast

Falls man das gateway mit ganglia monitoren möchte

-A INPUT  -i lan0 -s 10.1.1.1  -d 239.2.11.71 -p udp --dport 8649 -j ACCEPT
# 10.1.1.2 ist die IP-Addresse vom server wo gmetad läuft:
-A INPUT  -i lan0 -s 10.1.1.2 -d 239.2.11.71 -p udp --dport 8649 -j ACCEPT
-A OUTPUT -o lan0 -s 10.1.1.1  -d 239.2.11.71 -p udp --dport 8649 -j ACCEPT
-A OUTPUT -o wan0 -d 239.2.11.71 -p udp --dport 8649 -j ACCEPT

Fernwartung des Gateways

Als letztes musst du nun noch deinen PC so einrichten, dass du ihn über SSH Fernwarten kannst.
Lade dir dafür unter: http://www.chiark.greenend.org.uk/~sgtatham/putty/ das Programm PUTTY herunter. Wenn du dieses dann startest, musst du folgendes eingeben:
<PRE>
Hostname : 10.1.1.1
Protocol : SSH
</PRE>

mittels OPEN verbindest du dich dann mit deinem Gateway und kannst dich ganz normal einloggen.

Zusätzliche Services Installieren

Das aufsetzen von zusätzlichen services wurde nicht ohne Grund bis zum Schluss aufgehoben; denn es stellt ein gewisses Sicherheitsrisiko dar auf dem selben Rechner wie die Firewall noch was anderes wie z.B. DNS-Server laufen zu lassen.
Idealerweise sollte deswegen der DHCP und DNS Server auf einem seperaten Rechner hinter der Firewall drauf sein. -Da dies allerdings den Rahmen vieler Benutzer sprengt und es auch nicht ein sehr grosses Risiko ist, werden wir hier den DHCP- und DNS-Server auf das Gateway installieren und wer nicht auf den zusätzlichen Konfort verzichten will, kann dies auch so machen. Aber nochmals: Wenn möglich, ist es besser diese Server auf einem seperaten standalone Rechner zu haben. Auf keinem Fall sollte ausser SSH, DNS und DHCP noch etwas anderes, wie beispielsweise web- und mail-server darauf laufen; diese gehören definitv auf einen drittrechner.

Das Tutorial geht in diesem Falle bei Zusätzliche Services Installieren weiter.

Falls du noch interessiert bist dein Gateway noch zusätzlich abzusichern, liess den zweiten Teil: Das Gateway in eine Festung verwandeln .

Related Pages

<---TOC--->

Related Links

|| Link | Beschreibung
[http://www.linuxgazette.com/issue54/stoddard.html|Building a Secure Gatway System By Chris Stoddard] | Chris Stoddard hat auf dieser Seite sehr gut beschrieben, wie man ein sicheres Linux-System aufsetzt; viele Informationen in disem Tutorial stammen von ihm
[http://www.linuxgazette.com/issue51/nielsen.html|Private Networks and Roadrunner using IP Masquerading] | Dies war das Tutorial, bei dem ich angefangen habe mein Gateway aufzusetzen! Leider sind die Informationen darauf etwas veraltet; dieses Tutorial hier ist eine neu-adaption des Tutorials von Mark Nielsen und Andrew Byrd
[http://www.linuxdoc.org/HOWTO/NET3-4-HOWTO.html|Netzwerke – Grundsätzliche Informationen zu TCP/IP Netzwerken] |
[http://dir.yahoo.com/Computers_and_Internet/Software/Operating_Systems/Unix/Security/|Unix Security] |
[http://www.linuxdoc.org/HOWTO/IP-Masquerade-HOWTO.html|IP Masquerading] |
[http://www.debian-administration.org/articles/23|Setting up a simple Debian gateway auf debian-administration.org] | Ein kleines, aber feines Tutorial zum schnellen Aufsetzen eines einfachen Routing-Gateways unter Debian
[https://kb.isc.org/article/AA-00378/0/Why-does-DHCP-use-raw-sockets.html|Why does DHCP use raw sockets?] | Erklärt, warum DHCP immer durch die firewall kommt
||

One thought on “Router-Firewall selbst Bauen”

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert