#!/bin/bash NETWORKCONFPATH="/etc/network" NETWORKCONF="interfaces" BRI="BRIGDE" NONBRI="NONBRIGDE" BRIDEV="bri0" TAPSYSPATH="/sys/devices/virtual/net" ETHDEV="eth0" do_ifplugd() { IFPLUGD=`which ifplugd` if [ "$IFPLUGD" ] then if [ "$1" = "stop" ] then /etc/init.d/ifplugd $1 echo "" elif [ "$2" = "start" ] then /etc/init.d/ifplugd $1 echo "" fi fi } do_network() { if [ "$1" = "stop" ] then /etc/init.d/networking stop elif [ "$1" = "start" ] then /etc/init.d/networking start fi } do_ren_interf() { if [ "$1" = "ren2bri" ] then cp -p $NETWORKCONFPATH/$NETWORKCONF $NETWORKCONFPATH/$NETWORKCONF.$NONBRI cp -p $NETWORKCONFPATH/$NETWORKCONF.$BRI $NETWORKCONFPATH/$NETWORKCONF elif [ "$1" = "ren2orig" ] then cp -p $NETWORKCONFPATH/$NETWORKCONF $NETWORKCONFPATH/$NETWORKCONF.$BRI cp -p $NETWORKCONFPATH/$NETWORKCONF.$NONBRI $NETWORKCONFPATH/$NETWORKCONF fi } do_tap() { if [ "$1" = "start" ] then if [ ! -e "$TAPSYSPATH/$TAPDEV" ] then tunctl -b -u $TAPUSER -t $TAPDEV echo "$TAPDEV angelegt" ifconfig $TAPDEV 0.0.0.0 up echo "IP Adressen von $TAPDEV Device geloescht" else echo "$TAPDEV schon vorhanden" fi elif [ "$1" = "stop" ] then tunctl -d $TAPDEV fi } do_bri() { BRIEXIST=`brctl show|egrep ^$BRIDEV|cut -f1` if [ "$BRIEXIST" = "" ] then brctl addif $BRIDEV $TAPDEV echo "Interfaces $BRIDEV und $TAPDEV zur Brigde hinzugefügt" echo "" brctl show elif [ "$BRIEXIST" = "$BRIDEV" ] then brctl addif $BRIDEV $TAPDEV echo "Interfaces $BRIDEV und $TAPDEV zur Brigde hinzugefügt" echo "" brctl show fi } do_eth_interf() { if [ "$1" = "start" ] then echo "Starte Interface $ETHDEV....." ifup $ETHDEV elif [ "$1" = "stop" ] then echo "Stoppe Interface $ETHDEV....." ifdown $ETHDEV fi } errormsg() { echo "Anzahl der Parameter falsch, es sind die Optionen '-u', '-d' und '-i' oder '-s' anzugeben." } do_optionctrl() { if [ "$TAPUSER" = "" -o "$TAPDEV" = "" ] then echo "Option '-u' und '-d' muss angegeben werden." break #exit 1 fi } do_rootchk() { ROOTUSER=`id -u` if [ $ROOTUSER -ne 0 ] then echo "Script $0 bitte als root ausführen." echo "" exit 1 fi } usage() { echo "Dieses Script startet ein Netzwerk für alle beteiligten Systeme in einem KVM/Qemu Netzwerk für" echo "Wirt- und Gastsysteme. Alle Systeme können sich per ssh untereinander erreichen (Gast-Gast, Wirt-Gast" echo "und Gast-Wirt). Über das Gateway (DSL-Router) kann von der Wirtsystem und Gastsystemen eine" echo "Internetverbindung aufgebaut (Standarteinstellung). Um das virtuelle Netzwerk starten zu können" echo "müssen Konfigurationsdatein wie folgt vorliegen." echo "" echo " Ursprüngliche Netzwerk-Konfiguration: /etc/network/interfaces.NONBRIGDE" echo " Netzwerk-Konfiguration für virtuelles Netzwerk: /etc/network/interfaces.BRIGDE" echo "" echo "Eine Beispielkonfiguration der beiden interfaces* Dateien kann durch Aufruf des Scriptes mit der" echo "Option '-l' angezeigt werden." echo "" echo "Syntax: $0 [-h | -l | -u -d | -i -s]" echo " -h (help): diese Hilfeseite" echo " -l (list): ausführliche Hilfe" echo " -u (user): gültiger Useraccount auf Wirtsystem" echo " -d (device): Name des Tap Interface (z.B. tap0, tap1 usw.)" echo " -i (init): Start des virtuellen Netzwerkes" echo " -s (shutdown): Stop des virtuellen Netzwerkes" echo "" echo "Beispiele:" echo " Start des virtuellen Netzwerkes: $ $0 -u michael -d tap0 -i" echo "" echo "Der Start des virtuellen Netzwerkes muss vor dem Hochfahren des Gastes erfolgen. Nachfolgende" echo "Parameter sind dazu nötig:" echo "" echo " $ kvm -hda disk.img -net nic -net tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown" echo "" echo "Der Stop des virtuellen Netzwerkes darf erst nach dem erfolgreichen Herunterfahren des Gastes erfolgen." echo "Dabei werden die Standart-Netzwerkeinstellungen, wie vor dem Start des virtuellen Netzwerkes, wieder" echo "hergestellt." echo "" echo " Stopp des virtuellen Netzwerkes: $ $0 -u michael -d tap0 -s" echo "" } example() { echo "Beispiel für die Netzwerk-Konfiguration zum Aufbau eines virteullen Netzwerkes zwischen Wirt- und Gastsystem." echo "" echo "Für die /etc/network/interfaces.NONBRIGDE kann die bestehende /etc/network/interfaces am Wirtsystem einfach" echo "umbenannt werden." echo "" echo " # mv /etc/network/interfaces /etc/network/interfaces.NONBRIGDE" echo "" echo "Die /etc/network/interfaces.BRIGDE muss neu erstellt werden mit folgenden Inhalt. Im Beispiel wird das Netz" echo "192.168.178.0 mit Standart-Gateway (DSL Router) mit der Adresse 192.168.178.1 genutzt. Für die Netzwerkbrücke" echo "'bri0' wird die IP Adresse 192.168.178.100 benutzt. Diese Werte sind ggf. an die eigene Umgebung anzupassen." echo "" echo " auto lo" echo " iface lo inet loopback" echo "" echo " auto eth0" echo " iface eth0 inet manual" echo "" echo " auto bri0" echo " iface bri0 inet static" echo " address 192.168.178.100" echo " broadcast 192.168.178.255" echo " gateway 192.168.178.1" echo " netmask 255.255.255.0" echo " network 192.168.178.0" echo " dns-nameservers 192.168.178.1" echo " dns-search 192.168.178.1" echo " bridge_ports eth0" echo " bridge_fd 9" echo " bridge_hello 2" echo " bridge_maxage 12" echo " bridge_stp off" echo "" echo "Nachfolgende die Ausgabe von ifconfig des Wirtsystems nach erfolgreicher Ausführung des Scriptes." echo "" echo " bri0 Link encap:Ethernet Hardware Adresse 00:01:80:78:82:35 " echo " inet Adresse:192.168.178.100 Bcast:192.168.178.255 Maske:255.255.255.0" echo " inet6-Adresse: fe80::201:80ff:fe78:8235/64 Gültigkeitsbereich:Verbindung" echo " UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1" echo " RX packets:2383 errors:0 dropped:0 overruns:0 frame:0" echo " TX packets:977 errors:0 dropped:0 overruns:0 carrier:0" echo " Kollisionen:0 Sendewarteschlangenlänge:0 " echo " RX bytes:1211172 (1.1 MiB) TX bytes:110775 (108.1 KiB)" echo " " echo " eth0 Link encap:Ethernet Hardware Adresse 00:01:80:78:82:35 " echo " inet6-Adresse: fe80::201:80ff:fe78:8235/64 Gültigkeitsbereich:Verbindung" echo " UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1" echo " RX packets:67386 errors:0 dropped:0 overruns:0 frame:0" echo " TX packets:30856 errors:0 dropped:0 overruns:0 carrier:0" echo " Kollisionen:0 Sendewarteschlangenlänge:1000 " echo " RX bytes:32617832 (31.1 MiB) TX bytes:3652309 (3.4 MiB)" echo " Speicher:fe9c0000-fe9e0000 " echo " " echo " lo Link encap:Lokale Schleife " echo " inet Adresse:127.0.0.1 Maske:255.0.0.0" echo " inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine" echo " UP LOOPBACK RUNNING MTU:16436 Metrik:1" echo " RX packets:3612 errors:0 dropped:0 overruns:0 frame:0" echo " TX packets:3612 errors:0 dropped:0 overruns:0 carrier:0" echo " Kollisionen:0 Sendewarteschlangenlänge:0 " echo " RX bytes:292563 (285.7 KiB) TX bytes:292563 (285.7 KiB)" echo " " echo " tap0 Link encap:Ethernet Hardware Adresse ca:a2:99:ba:5b:29 " echo " inet6-Adresse: fe80::c8a2:99ff:feba:5b29/64 Gültigkeitsbereich:Verbindung" echo " UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1" echo " RX packets:151 errors:0 dropped:0 overruns:0 frame:0" echo " TX packets:1193 errors:0 dropped:0 overruns:0 carrier:0" echo " Kollisionen:0 Sendewarteschlangenlänge:500 " echo " RX bytes:18924 (18.4 KiB) TX bytes:190128 (185.6 KiB)" echo "" echo "" echo "Die Konfiguration im Gastsystem beschränkt sich auf eine feste IP Adresse, in diesem Fall auf 192.168.178.101." echo "Netzwerk- und Gateway IP-Adresse sind wie am Wirtsystem konfiguriert." echo "" echo " auto lo" echo " iface lo inet loopback" echo "" echo " allow-hotplug eth0" echo " iface eth0 inet static" echo " address 192.168.178.101" echo " broadcast 192.168.178.255" echo " gateway 192.168.178.1" echo " netmask 255.255.255.0" echo " network 192.168.178.0" echo " dns-nameservers 192.168.178.1" echo " dns-search 192.168.178.1" echo "" echo "Nachfolgende die Ausgabe von ifconfig des Gastsystems." echo "" echo " eth0 Link encap:Ethernet Hardware Adresse 52:54:00:12:34:56 " echo " inet Adresse:192.168.178.101 Bcast:192.168.178.255 Maske:255.255.255.0" echo " inet6-Adresse: fe80::5054:ff:fe12:3456/64 Gültigkeitsbereich:Verbindung" echo " UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1" echo " RX packets:906 errors:0 dropped:0 overruns:0 frame:0" echo " TX packets:125 errors:0 dropped:0 overruns:0 carrier:0" echo " Kollisionen:0 Sendewarteschlangenlänge:1000 " echo " RX bytes:132216 (129.1 KiB) TX bytes:13866 (13.5 KiB)" echo " Interrupt:11 Basisadresse:0xe000 " echo " " echo " lo Link encap:Lokale Schleife " echo " inet Adresse:127.0.0.1 Maske:255.0.0.0" echo " inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine" echo " UP LOOPBACK RUNNING MTU:16436 Metrik:1" echo " RX packets:0 errors:0 dropped:0 overruns:0 frame:0" echo " TX packets:0 errors:0 dropped:0 overruns:0 carrier:0" echo " Kollisionen:0 Sendewarteschlangenlänge:0 " echo " RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)" echo "" } ########## Hauptprogramm ########## if [ $# -eq 0 ] then usage fi if [ $# -eq 4 ] then errormsg exit 1 fi while getopts hlu:d:is OPTION; do case $OPTION in h) usage ;; l) example ;; u) TAPUSER=$OPTARG ;; d) TAPDEV=$OPTARG ;; i) ACTION=$OPTARG do_rootchk do_optionctrl echo "Virtuelles Netzwerk starten....." do_ifplugd stop do_network stop do_ren_interf ren2bri do_network start do_tap start do_bri ;; s) ACTION=$OPTARG do_rootchk do_optionctrl echo "Virtuelles Netzwerk stoppen....." do_network stop do_tap stop do_ren_interf ren2orig do_network start do_eth_interf start do_ifplugd start ;; \?) echo "Ungueltige Option $OPTION angegeben" exit 2 ;; esac done shift `expr $OPTIND - 1` exit 0 #EOF