Einen einfachen Router mit Linux einrichten

aus HaBo WiKi, der freien Wissensdatenbank von http://www.hackerboard.de
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Was wird benötigt?

Um einen Router mit Linux einzurichten, benötigen wir einen Computer mit 2 Netzwerkkarten (bei ISDN mit einer Netzwerkkarte und einer ISDN-Karte), auf dem ein minimales Linux installiert ist. Welche Distribution spielt nicht wirklich eine Rolle, wenn man nicht auf paranoide Sicherheit besteht. In diesem Fall sei von mir SELinux oder Openwall angeraten. Wichtig ist nur, dass iptables installiert ist und vom Kernel unterstützt wird. Das Netzwerk sollte natürlich soweit eingerichtet sein, dass mit einer Netzwerkkarte (bzw. der ISDN-Karte) eine Verbindung zum Internet besteht während die andere mit den zu routenden Rechnern verbunden sein muss. IP-Kommunikation sollte bereits möglich sein, d.h. dass die zu routenden Rechner den Router pingen können sollten.

Das elementare Skript

Um den Router nun zum Routen zu bewegen brauchen wir nun nur noch ein kleines Skript, dass entsprechende Regeln für die iptables setzt. Das folgende Skript sorgt auch gleichzeitig noch dafür, dass eine grundlegend sichere Firewall aufgebaut wird. Es müssen nur noch die Netzwerk-Devices (ohne /dev/ davor) an den angegebenen Stellen eingetragen und bei einigen Distributionen der Pfad zum iptables-Befehl angepasst werden.

#!/bin/bash

echo "Starting firewall"

LOGLIMIT=20
IPTABLES=/sbin/iptables

case "$1" in
start)
	# alle alten Regeln entfernen
	echo "Loesche alte Regeln"
	$IPTABLES -F
	$IPTABLES -X
	$IPTABLES -t nat -F
	# Routing
	echo 1 > /proc/sys/net/ipv4/ip_forward
	$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
	$IPTABLES -t nat -A POSTROUTING -o <netzwerk-device-zum-internet> -j MASQUERADE
	### ERSTELLE NEUE KETTEN ###
	# Chain to log and reject a port by ICMP port unreachable 
	$IPTABLES -N LOGREJECT 
	$IPTABLES -A LOGREJECT -m limit --limit $LOGLIMIT/minute -j LOG \
          --log-prefix "FIREWALL REJECT " --log-level notice --log-ip-options --log-tcp-options 
	$IPTABLES -A LOGREJECT -j REJECT --reject-with icmp-port-unreachable 
	
	### PROC MANIPULATION ###
	# auf Broadcast-Pings nicht antworten
	echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
	# halt die Klappe bei komischen ICMP Nachrichten
	echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
	# Kicke den ganzen IP Spoofing Shit
	# (Source-Validierung anschalten)
	echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
	# Setze Default-TTL auf 61 (Default fuer Linux ist 64)
	echo 61 > /proc/sys/net/ipv4/ip_default_ttl
	# sende RST-Pakete wenn der Buffer voll ist
	echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow
	# warte max. 30 secs auf ein FIN/ACK
	echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
	# unterbreche Verbindungsaufbau nach 3 SYN-Paketen
	# Default ist 6
	echo 3 > /proc/sys/net/ipv4/tcp_syn_retries
	# unterbreche Verbindungsaufbau nach 3 SYN/ACK-Paketen
	# Default ist 6
	echo 3 > /proc/sys/net/ipv4/tcp_synack_retries
	
	### MAIN PART ###
	$IPTABLES -P INPUT DROP
	$IPTABLES -P FORWARD DROP
	$IPTABLES -P OUTPUT ACCEPT
	$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
	$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
	# im Loopback koennen wir jedem trauen 
	$IPTABLES -A INPUT -i lo -j ACCEPT
	# ebenso im LAN
	$IPTABLES -A INPUT -i <netzwerk-device-zum-lan> -j ACCEPT
	# erlaube Pings
	$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

	# Alle TCP Packete, die bis hier hin kommen, werden 
        # geloggt und rejected 
        # Der Rest wird eh per Default Policy gedroppt... 
	$IPTABLES -A INPUT -p tcp -j LOGREJECT 
	$IPTABLES -A FORWARD -p tcp -j LOGREJECT
	;;
*)
	echo "Usage: `basename $0` {start}" >&2
	exit 64
	;;
esac

exit 0

Dieses Skript muss einfach nur abgespeichert und ausführbar gemacht werden. Danach ruft man es als root mit

<pfad-zum-skript> start

auf.

Einrichtung der Client-Rechner

Damit nun die Rechner aus dem LAN über den Router ins Internet können, müssen bei diesen die LAN-IP des Routers als Gateway und die DNS-Server des Providers eingetragen werden.

Nach dieser Prozedur sollte man einen grundlegenden kleinen Router haben, der alle Rechner im LAN ohne Einschränkungen ins Internet routet.

Port-Freigabe

Bei den folgenden Befehlen sind die Werte in den spitzen Klammern entsprechend zu ersetzen.

Wenn auf dem Router noch ein Server-Programm (z.B. ein Webserver oder Mailserver) läuft, das vom Internet aus erreichbar sein soll, muss man dazu die entsprechenden Ports auf dem Router freischalten.

$IPTABLES -A INPUT -m state --state NEW -p <tcp/udp> --dport <portnummer> -j ACCEPT

Manche Programme machen es notwendig, dass eingehender Traffic auf dem Router an einen bestimmten Port eines Client-Rechner weitergeleitet werden muss. Dies kann man mit folgendem Befehl erreichen:

$IPTABLES -t nat -A PREROUTING -i <netzwerk-device-zum-internet> -p <tcp/udp> --dport <portnummer> \
  -j DNAT --to-destination <ip-des-client-rechners>

Wir sehen also, dass es garnicht schwierig ist einen Linux-Router einzurichten und jeder Rechner, dessen Netzwerk entsprechend eingerichtet ist, kann mit diesem kleinen Howto binnen weniger Minuten zum Router gemacht werden, der eine recht sichere Firewall zur Verfügung stellt.

Bitmuncher 13:45, 20. Okt 2006 (CEST)

Computer Forum
Computer Forum
Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge