Weiterleitung auf eine ausgelesene IP in dem Script

Kenny1980

Registered User
Hallo miteinander,
ich hoffe, das mir hier jemand helfen kann. Ich habe aus dem Ip Phone Forum folgendes Script bei mir am testen, jedoch bekomme ich eine wichtige sache nicht zum laufen. Es wird hier von der Fritzbox quasi die aktuelle IP gesendet und auch dort erfolgreich angezeigt.

Link zum Thread

Der Code sieht folgendermaßen aus:

PHP:
<?php
/*	
	Version vom 04.10.2010 by Karl Loncarek

	Dieses Skript dient als Hilfsmittel für den Einsatz mit mehreren
	Routern. Es können z.B. die IP-Adressen übergeben werden (ähnlich
	wie bei dyndns). Die Informationen werden über Parameter in der URL
	übergeben. Hierzu muss ein benutzerdefinierter DNS-Anbieter
	eingestellt werden.
	
	Beispiel, das mit meiner Fitz!Box funktioniert (Update-URL):
		...../RouterTool.php?myip=<ipaddr>&n=2
		
	Diese Parameter können übergeben werden (mehrere mit "&" verknüpfen):
	myip
		für die Übergabe der dynamischen IP-Adresse gedacht
		Beispiel:	...../RouterTool.php?myip=192.168.1.1
	n
		für Einträge mehrerer Router; "n" ist die Nummer des Eintrags
		wenn "n" nicht angegeben wird, wird der erste Eintrag bearbeitet
		Beispiel:	...../RouterTool.php?myip=192.168.1.1&n=2
	comment
		für zusätzlichen Kommentar, der zusammen mit Parametern
		angezeigt wird
		Beispiel:	...../RouterTool.php?comment=Router zu Hause
	wakeip
		für die Übergabe einer eigenen Wake-on-LAN IP-Adresse.
		Mehr zu Wake-on-LAN weiter unten.
		Beispiel:	...../RouterTool.php?wakeip=192.168.1.255
	wake
		die für Wake-on-LAN notwendige MAC-Adresse.
		Mehr zu Wake-on-LAN weiter unten.
		Beispiel:	...../RouterTool.php?wake=00-12-AB-34-CD-56
		wird kein Wert übergeben, wird das Magic Paket zur
		gespeicherten IP-Adresse verschickt, einziger erlaubter
		zusätzlicher Parameter ist "n".
	ftp
		für die Übergabe einer IP zum FTP-Server (evtl. mit Port)
		Beispiel:	...../RouterTool.php?ftp=192.168.1.5:40
		wird kein Wert übergeben wird direkt zum FTP-Server weiter-
		geleitet, einziger erlaubter zusätzlicher Parameter ist "n".
	web
		für die Übergabe einer IP zum Webserver (evtl. mit Port)
		Beispiel:	...../RouterTool.php?web=192.168.1.5:8080
		wird kein Wert übergeben wird direkt zum Web-Server weiter-
		geleitet, einziger erlaubter zusätzlicher Parameter ist "n".
	del
		löscht existierende Einträge. Zu löschender Eintrag kann als
		Wert oder mit "n" übergeben werden. Der Wert wiegt schwerer.
		Beispiel:	...../RouterTool.php?del=3
	pw
		übergibt ein Passwort für das Schreiben bzw. Anzeigen des/der
		Einträge. Die Passwörter werden im Klartext in den Variablen
		$LESEPW und $SCHREIBPW gesetzt (siehe weiter unten).
		Standardmäßig sind Sie leer. Ist einer von beiden leer,
		muß kein Passwort angegeben werden.
		Beispiel:	...../RouterTool.php?myip=192.168.1.1&pw=geheim
	
	Um die gespeichertern Parameter anzuzeigen einfach Skript ohne
	Parameter aufrufen:
		...../RouterTool.php
	Falls ein Passwort für die Anzeige gesetzt wurde, muss es so aussehen:
		...../RouterTool.php?pw=geheim
	
	Wake-on-LAN:
	Damit Wake-on-LAN funktionieren kann, muss es im BIOS und unter Windows
	aktiviert werden. Eventuell ist auch ein Verbindungskabel von der Netzwerk-
	karte zum Mainboard notwendig. Das Wake-on-LAN Paket wird üblicherweise
	an die Broadcast-Adresse, z.B. 192.168.1.255 geschickt. Bei einem Router ist
	das normalerweise nicht möglich. Daher muss beim Router eine Portregel
	erstellt werden, die den Port 9 zur internen Brodcast-Adresse umleitet.
	(Derzeit bei der Fritz!Box nicht ohne weiteres möglich!)
	
	Mit einer der letzten Firmwares unterstützt die Fritz!Box das Wake-on-LAN
	direkt. Hierzu muss man sich aber in die Administartionsfläche per sicherem
	Webzugriff einloggen.
	
	Konfigurationsbeispiel:
	Folgende Felder sind unter der DynDNS-Einstellung bei einer Fritz!Box 7170 verfügbar:
	(zu finden unter: Erweiterte Einstellungen -> Freigaben -> Dynamic DNS)
		1. Dynamic DNS-Anbieter
		2. Update-URL (nur verfügbar, wenn unter 1 "Benutzerdefiniert" gewählt wurde)
		3. Domain
		4. Benutzername
		5. Kennwort
		6. Kennwortbestätigung
	Es muss folgendes eingetragen werden:
		Punkt 1: "Benutzerdefiniert"
		Punkt 2: "deinedomain.de/deinpfad/RouterTool.php?myip=<ipaddr>&pw=<pass>  (<ipaddr> und <pass> ist ein Feld, das von der Fritz!Box gefüllt wird)
		Punkt 3: "deinedomain.de" (notwendig, wenn Du auch gleichzeitig Fernwartung machen willst, sonst funktioniert sie nicht)
		Punkt 4: kann leer bleiben, da nicht verwendet.
		Punkt 5: "Passwort" sofern hier im Script eines gesetzt ist (optional)
		Punkt 6: "Passwort" (identisch zu Punkt 5)
*/
# ********************************************************************
# Hier können eigene Anpassungen erfolgen
	$SCHREIBPW = "test"; //Passwort, das zum Speichern benötigt wird
	$LESEPW = ""; //Passwort, das zum Anzeigen der gespeicherten Werte benötigt wird
	$datei = "test.txt"; //Dateiname als Speicherort für die IP-Adressen
# ********************************************************************

	$daten = array(); //enthällt alle Daten. Jeder Arrayeintrag ist wieder array
	# gespeicherte Informationen pro Eintrag:
	# Kommentar - Datum/Uhrzeit - IP-Adresse - FTP-Adresse - Webserver Adresse - Wake on LAN IP-Adresse - MAC-Adresse
	$params = 7; //Anzahl der zu speichernden Parameter

# sendet magic packet für Wake on LAN über IP-Adresse $ip, Port $port an MAC-Adresse $mac
	function wake($ip, $mac, $port)
	{
		$mac = str_replace("-", "", $mac); // "-" aus MAC-Adresse entfernen, falls vorhanden
		if(strlen($mac)<12) return false; //MAC-Adresse ist zu kurz, abbrechen
		$mac = chr(hexdec(substr($mac,0,2))).chr(hexdec(substr($mac,2,2))).chr(hexdec(substr($mac,4,2))).chr(hexdec(substr($mac,6,2))).chr(hexdec(substr($mac,8,2))).chr(hexdec(substr($mac,10,2))); //MAC-Adresse in Zeichn konvertieren
		$nic = fsockopen("udp://" . $ip, $port); //UDP-Paket schicken
		if($nic)
		{
			$packet = chr(0xFF).chr(0xFF).chr(0xFF).chr(0xFF).chr(0xFF).chr(0xFF); // 6x FF senden
			$packet .= $mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac.$mac; //16x MAC-Adresse senden
		}
		$ret = fwrite($nic, $packet);
		fclose($nic);
		if($ret) return true; //hat alles geklappt
		return false; //Fehler aufgetreten
	}

# lädt IP_Adressen und weitere Informationen
	function loaddata($file)
	{
		if (file_exists($file)) //existiert die Datei?
		{
			$fp = fopen($file, "r"); //Inhalt der Datei einlesen
			$inhalt = fread ($fp, filesize($file));
			fclose($fp);
			$data=explode("\n",$inhalt); //Daten in array einlesen
			return $data;
		}
	}

# speichert IP_Adressen und weitere Informationen
	function savedata($file,$data,$password)
	{
		if (!((count($_GET) == 1) && isset($_GET['pw'])) && (count($_GET) > 0)) //folgendes nur ausführen, wenn nicht nur dass Passwort als Parameter übergeben wird
		{
			if (($password == "") || ($_GET['pw'] == $password)) //Passwort stimmt (und ist nicht einziger Parameter) oder Passwort ist nicht gesetzt
			{
				if ($fp = fopen($file, "w")) //Informationen abspeichern
				{
					fwrite($fp,implode("\n",$data));
					fclose($fp);
					return true;
				}
				else return false;
			}
			else //Passwort ist falsch
			{
				# Verhindern, dass Seite aus Cache geladen wird, HTML-Kopf anzeigen
				header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
				header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit
				print "<html>\n<head>\n<title>Externe IP-Adresse des DSL-Zugangs zuhause</title>\n</head>\n<body>\n";
				print "<h1>Zugriff verweigert! Werte nicht gespeichert!</h1>\n";
				print "</body>\n"; //HTML-Seite beenden
				exit(); //Script beenden
			}
		}
	}

# übernimmt übergebene Parameter aus der URL
	function getparameters($data)
	{
		global $params;
		if(isset($_GET['n'])) $counter = $_GET['n']; //Nummer des Eintrags übernehmen
		if($counter == "") $counter = 1; //falls kein Parameter übergeben wird auf 1 setzen
		if($_GET['del']) $counter = $_GET['del']; //Gibt an welcher Eintrag gelöscht werden soll
		# Daten nur dannübernehmen, wenn Parameter mit URL übergeben wurden
		for ($i = 0; $i <= ($params-1); $i++ ) //unbelegte Variablen setzen (wichtig fürs abspeichern)
		{
			if(!isset($data[(($counter-1)*$params)+$i])) $data[(($counter-1)*$params)+$i] = "";
		}
		if(isset($_GET['comment'])) //wurde Kommentar zu den aktuellen Einträgen übergeben
		{
			$data[(($counter-1)*$params)+0] = $_GET['comment'];
		}
		if (count($_GET) > 0)	 // aktuelle Zeit, wenn ein Parameter übergeben wurde
		{
			$data[(($counter-1)*$params)+1] = strftime('%d.%m.%Y, %H:%M Uhr',time());
		}
		if (isset($_GET['myip'])) //wurde parameter myip=... übergeben?
		{
			$data[(($counter-1)*$params)+2] = $_GET['myip']; //IP-Adresse aus parameter übernehmen
			if ($data[(($counter-1)*$params)+2] == "") $data[(($counter-1)*$params)+2] = $_SERVER['REMOTE_ADDR']; //falls keine IP übergeben wurde, die Internet-IP ermitteln
		}
#		if($data[(($counter-1)*$params)+3] == "") $data[(($counter-1)*$params)+3] = $data[(($counter-1)*$params)+2]; //Haupt-IP-Adresse übernehmen
		if(isset($_GET['ftp'])) //wurde Parameter ftp übergeben?
		{
			if($_GET['ftp']) $data[(($counter-1)*$params)+3] = $_GET['ftp'];
		}
#		if($data[(($counter-1)*$params)+4] == "") $data[(($counter-1)*$params)+4] = $data[(($counter-1)*$params)+2]; //Haupt-IP-Adresse übernehmen
		if(isset($_GET['web'])) //wurde Parameter web übergeben?
		{
			if($_GET['web']) $data[(($counter-1)*$params)+4] = $_GET['web'];
		}
		if(isset($_GET['wake'])) //Wake on LAN durchführen
		{
			if($_GET['wake']) //MAC-Adresse für Wake on LAN aus parameter übernehmen
			{
				$data[(($counter-1)*$params)+5] = $_GET['wake'];
			}
		}
#		if(($data[(($counter-1)*$params)+6] == "") && $data[(($counter-1)*$params)+5]) $data[(($counter-1)*$params)+6] = $data[(($counter-1)*$params)+2]; //Haupt-IP-Adresse übernehmen
		if(isset($_GET['wakeip'])) //Wake on LAN IP-Adresse
		{
			if($_GET['wakeip']) $data[(($counter-1)*$params)+6] = $_GET['wakeip'];
		}
		ksort($data); //Daten sortieren

		#Einträge löschen
		if(isset($_GET['del']))
		{
			if($deleteentry) $counter = $deleteentry;
			for ($i = ($params-1); $i >= 0; $i-- ) //Array-Einträge löschen
			{
				unset($data[(($counter-1)*$params)+$i]);
			}
		}
		return explode("\n",implode("\n",$data));
	}

# zeigt gespeicherte Daten an
	function showdata($data,$rpass,$wpass)
	{
		global $params;
		# Verhindern, dass Seite aus Cache geladen wird, HTML-Kopf anzeigen
		header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
		header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Datum in der Vergangenheit
		print "<html>\n<head>\n<title>Externe IP-Adresse des DSL-Zugangs zuhause</title>\n<style type='text/css'>\n";
		if (($rpass == "") || ($_GET['pw'] == $rpass)) //Lese-Passwort stimmt oder Passwort ist nicht gesetzt
#		if (($rpass == "") || ($_GET['pw'] == $rpass) || ($_GET['pw'] == $wpass)) //Lese- bzw. Schreib-Passwort stimmt oder Passwort ist nicht gesetzt
		{
			print "th{text-align:left;padding:0 0 0 3em;color:#666;vertical-align:top;width:15em;}\n";
			print "td{font-weight:bold;font-family:monospace;padding:0;}\n";
			print "table{width:100%;}\n";
			print "a{text-decoration: none;color:#000;display:block;}\na:hover{color:#00D;background-color:#DDD;}\n";
			print "small a{color:#CCC;display:inline;}\nsmall a:hover{color:#F00;background-color:transparent;}\n";
			print "\n</style></head>\n<body>\n"; //HTML-Kopf
			if(isset($_GET['del'])) print "<h3>Status: Eintrag gelöscht!</h3><hr \>\n";
			if(isset($_GET['wake']) && ($_GET['wake'] == "")) print "<h3>Status: Wake-on-LAN Paket verschickt!</h3><hr \>\n";
			$i = 1;
			do
			{
				$ipaddress = $data[(($i-1)*$params)+2]; //Haupt-IP-Adresse zwischenspeichern
				$ftpaddress = $ipaddress;
				$webaddress = $ipaddress;
				$woladdress = $ipaddress;
				print "<h2>Eintrag $i: <small><small><small><a href='RouterTool.php?del=$i&pw=$wpass'>LÖSCHEN</a></small></small></small></h2>\n";
				print "<table cellspacing='0'>\n";
				print "<tr><th>Kommentar:</th><td>".$data[(($i-1)*$params)+0]."</td></tr>\n";
				print "<tr><th>Stand von:</th><td>".$data[(($i-1)*$params)+1]."</td></tr>\n";
				print "<tr><th>WAN IP-Adresse:</th><td>".$ipaddress."</td></tr>\n";
				if ($data[(($i-1)*$params)+3] != "") $ftpaddress = $data[(($i-1)*$params)+3]; //Wenn keine FTP-Adresse vorhanden, Haupt-IP-Adresse verwenden
				print "<tr><th>FTP IP-Adresse:</th><td><a href='ftp://".$ftpaddress."' title='Mit FTP verbinden'>ftp://".$ftpaddress."</a></td></tr>\n";
				if ($data[(($i-1)*$params)+4] != "") $webaddress = $data[(($i-1)*$params)+4]; //Wenn keine WEB-Adresse vorhanden, Haupt-IP-Adresse verwenden
				print "<tr><th>Webserver IP-Adresse:</th><td><a href='http://".$webaddress."' title='Mit Webserver verbinden'>http://".$webaddress."</a></td></tr>\n";
				print "<tr><th>Gesicherter Webserver:</th><td><a href='https://".$webaddress."' title='Mit gesichertem Webserver verbinden'>https://".$webaddress."</a></td></tr>\n";
				if ($data[(($i-1)*$params)+6] != "") $woladdress = $data[(($i-1)*$params)+6]; //Wenn keine Wake-on-LAN-Adresse vorhanden, Haupt-IP-Adresse verwenden
				if ($data[(($i-1)*$params)+5] == "") $woladdress = ""; //Wenn keine MAC angegeben ist, macht Wake-on-LAN IP-Adresse keinen Sinn
				print "<tr><th>Wake-on-LAN MAC-Adresse:</th><td><a href='RouterTool.php?wake&n=$i' title='Wake-on-LAN Paket an ".$woladdress." senden'>".$data[(($i-1)*$params)+5]."</a></td></tr>\n";
				print "<tr><th>Wake-on-LAN IP-Adresse:</th><td><a href='RouterTool.php?wake&n=$i' title='Wake-on-LAN Paket an ".$woladdress." senden'>".$woladdress."</a></td></tr>\n";
				print "</table>\n";
				$i++;
			}
			while  (($i*$params)<= count($data));
		}
		else //Passwort ist falsch
		{
			print "\n</style></head>\n<body>\n"; //HTML-Kopf
			print "<h1>Zugriff verweigert!</h1>\n";
		}
		print "\n</body>\n"; //HTML-Seite beenden
	}

# führt Aktion gemäß Parameter in URL aus
	function doaction($data)
	{
		global $params;
		if(isset($_GET['n'])) $counter = $_GET['n']; //Nummer des Eintrags übernehmen
		if($counter == "") $counter = 1; //falls kein Parameter übergeben wird auf 1 setzen	
		if(((isset($_GET['ftp']) && (count($_GET) == 1)) || (isset($_GET['ftp']) && isset($_GET['n']) && (count($_GET) == 2))) && ($_GET['ftp'] == "")) //direkt zu FTP-Adresse umleiten
		{ //nur wenn "ftp" ohne parameter angegeben wird
			header("Location: ftp://".$data[(($counter-1)*$params)+3]); //direkt zur FTP-Adresse umleiten
			exit();
		}
		if(((isset($_GET['web']) && (count($_GET) == 1)) || (isset($_GET['web']) && isset($_GET['n']) && (count($_GET) == 2))) && ($_GET['web'] == "")) //direkt zu Webserver-Adresse umleiten
		{ //nur wenn "web" ohne parameter angegeben wird
			header("Location: http://".$data[(($counter-1)*$params)+4]); //direkt zur Web-Adresse umleiten
			exit();
		}
		if((isset($_GET['wake']) && (count($_GET) == 1)) || (isset($_GET['wake']) && isset($_GET['n']) && (count($_GET) == 2)) && ($_GET['wake'] == "")) //Wake on LAN Paket senden
		{
			wake($data[(($counter-1)*$params)+6], $data[(($counter-1)*$params)+5], 9); //Paket über Port 9 schicken
		}
	}
##### Ab hier beginnt das eigentliche Programm

# Daten einlesen
$daten = loaddata($datei);

# Übergebene Parameter auslesen
$daten = getparameters($daten);

# Daten abspeichern
savedata($datei,$daten,$SCHREIBPW);

# Aktion durchführen
doaction($daten);

# Daten anzeigen
showdata($daten,$LESEPW,$SCHREIBPW);

?>


Gestartet wird das ganze über einen DynDNS Befehl der Fritzbox mit folgendem Zusatz:

http://sub.mydomain.de/RouterTool.php?myip=<ipaddr>&pw=test

Jetzt wäre es ideal, das genau dieses Script mir nur die IP des Internetanschlusses raus gibt (von mir aus auch an eine andere Subdomain, dann kann ich das Script für FTP Zugang oder ähnlichem bestehen lassen)

Kann mir jemand Unterstützung geben?


Gruss
 
Ich kenne mich mit php zwar nicht aus, aber wenn du noch das hier noch mit einbaust, wird das funktionieren: http://www.mywebsolution.de/tipps/13/show_PHP-redirect.html

Über die Get-Parameter kannst du dann ja mit einer if-Anweisung die gewünschte Funktion ausführen. Damit es unverseller einsetztbar ist, kannst du ja alles in eine Klasse packen und die IP als return ausgeben, wenn z.B. kein Get-Parameter angegeben ist.
 
Back
Top