IP-Forwarding und ICMP-Source-Routing

Ein Unix-Rechner, der mehr als ein Netzwerk-Interface hat, leitet Pakete, die von der einen Seite kommen und auf die andere Seite gehören, entsprechend weiter. Somit kann jeder Unix-Rechner als Router dienen.

Im Prinzip genügt es schon, den Routing-Daemon in.routed zu starten und alle anderen Rechner im Netz wissen dann darüber Bescheid.

Wie stellt man das ab?

Manchmal ist es aber wünenswert, dass ein Rechner mit mehreren Interfaces nicht routet. Zuerst kann man mal den in.routed abschalten. Damit wird die Funktion des Routers nicht mehr dauernd auf dem Netz verkündet. Braucht man den Routing -Daemon, dann startet man ihn mit der Option -q (quiet, leise).

Damit ist aber die Funktion des Routers noch nicht abgestellt. Auf anderen Rechenrn eingetragene Default-Routes oder missbräuchliche Nutzung sind weiterhin möglich.

Es gibt aber im Kernel eine Variable, die das Routing blockiert. Diese kann man entweder im laufenden Betrieb umsetzen oder auch schon beim Konfigurieren des Kernels angeben.

Forwarding im Kernel abstellen

In die Kernel-Konfiguration schreibt man:
# turn off ipforwarding
options "IPFORWARDING=-1"
Eine passende Stelle ist hinter all den anderen Optionen und vor den Kommentaren zur "config vmunix"-Zeile.

Im laufenden Betrieb benutzt man adb:

# adb -w -k /vmunix /dev/mem
_ip_forwarding/W-1
_ip_forwarding?W-1
$q
Dabei modifiziert die Zeile mit "/" den Kernel auf der Platte und die Zeile mit "?" den Kernel im Speicher.

Und wie macht man das Routing wieder an?

# adb -w -k /vmunix /dev/mem
_ip_forwarding/W0
_ip_forwarding?W0
$q

ICMP-Source-Routing

Ein Loch verbleibt da noch. Mittels ICMP-Paketen kann der Rechner getäuscht und zur Weiterleitung von Paketen verführt werden. Leider gibt es hier keine so einfache Möglichkeit, das abzustellen. Man muss dazu eine Funktion im Kernel abändern. Die Quelldateien von SunOS fehlen leider, aber man kann die entsprechenden Quellen von BSD (z.b. 4.3reno, 4.3tahoe oder NetBSD) nehmen: Die vorcompilierte Datei ip_input.o und das Original von in_proto.c muss man umbenennen und dann die neuen Dateien an die richtige Stelle bringen:
# mv /sys/`arch -k`/OBJ/ip_input.o /sys/`arch -k`/OBJ/ip_input.o.FCS
# mv /sys/netinet/in_proto.c /sys/netinet/in_proto.c.FCS
# cp ./in_proto.c /sys/netinet/in_proto.c
# cp ./ip_input.c /sys/netinet/ip_input.c
Nun muss man einen neuen Kernel bauen. Aber zuvor setzen wir noch in der Kernel-Konfiguration folgende Optionen:
# turn off ipforwarding
options "IPFORWARDING=-1"

# drop source routed packets
options "IPBLOCKSOURCEROUTE=1"
Jetzt kann der neue Kernel gebaut werden:
# KERNELNAME=`head -1 /etc/motd | sed -e "s/.*(//" -e "s/).*//"`
# cd /sys/`arch -k`/conf
# config $KERNELNAME
# cd ../$KERNELNAME
# make
# mv /vmunix /vmunix.old
# mv vmunix /vmunix
# reboot
Natürlich kann man die Option im laufenden Betrieb umschalten, sodass Source-Route wieder geht:
# adb -w -k /vmunix /dev/mem
_ip_block_source_routed/W0
_ip_block_source_routed?W0
$q
Mit W1 statt W0 schaltet man das Source Routing dann wieder ab.

Danksagung

Dank an B. Powell, der 1993 die Ur-Version des Source-Route-Patch gebaut hat.
Copyright 1999-2001