Curl bei Port-Weiterleitung (Router)?

Hallo, ich habe hier wahrscheinlich eine Expertenfrage.

Folgendes Skript schaltet die Bewegungserkennung meiner Überwachungskamera. Ich möchte es so anpassen, dass es eine Port-Weiterleitung über einen Router in ein anders Subnetz übersteht. Logisch ist, dass ich statt der IP des Gerätes nun die externe IP des Routers verwende. Aber wie mache ich das mit dem Port?

Wenn ich $ip = „192.168.178.21:12345“; verwende, dann erhalte ich folgende Fehlermeldung:

Error: File Not Found
getfile: Cannot open URL(/etc_ro/web/setform/setSystemMotion,No such file or directory)

Wo kommt denn der Pfad /etc_ro/web/setform/ her? :confused:

Hier das bislang funktionierende Skript (mit neuer IP):

<?

// *** Daten der Kamera ***

$user = "name";
$pw = "passwort";
$ip = "192.168.178.21";


// *** ab hier nichts mehr ändern ***

if($_IPS['VALUE']) $switch = 1;
else $switch = 0;

if ($switch == 1) $schalt = "ein";
else $schalt = "aus";

IPSUtils_Include ("IPSLogger.inc.php", "IPSLibrary::app::core::IPSLogger");
IPSLogger_Dbg ("Kamera", "Überwachung ".$schalt."geschaltet");


$sURL = $ip."/setSystemMotion";
$sMessage = "MotionDetectionEnable=".$switch."&ConfigSystemMotion=Save";

$ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $sURL);
	 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
	 curl_setopt($ch, CURLOPT_USERPWD, $user.":".$pw);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_HEADER, 0);
  	 curl_setopt($ch, CURLOPT_REFERER, 'http://'.$ip.'/motion.htm');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $sMessage);

    $sResult = curl_exec($ch);
    if (curl_errno($ch)) print curl_error($ch);
    else
   	 {
        curl_close($ch);
        return $sResult;
	    }

?>

Ich hab schon mit der Option curl_setopt($ch, CURLOPT_PORT, 12345); gespielt, leider erfolglos.

Hat jemand einen heißen Tipp?

Dank und Grüße
galleto

192.168.178.1 ist die interne IP (einer Fritzbox?). Es werden dabei keine Portweiterleitungen umgesetzt. Wahrscheinlich versucht die FB, die URL selber auszuliefern und der interne Webserver versucht das File in seinem Baum zu finden.

Portweiterleitungen und NAT gehen -gewöhnlich- nur vom externen(WAN) zum internen (LAN) Interface, aber nicht zwischen zwei gerouteten internen LAN-Netzen

Tommi

Du hast völlig recht, falsch gewähltes IP-Beispiel. Hab es oben angepasst. Es muss 192.168.178.21 lauten.

Ich komme mit meiner Curl-Anfrage aus 192.168.188.0 und versuche die Kamera (192.168.198.33) zu erreichen. Beide Netze hängen im 192.168.178.0 zusammen.

Das sollte also funktionieren. Die Frage ist nur: Wie geht das mit Curl?

Grüße
galleto

Ich denke, das hat mit CURL weniger zu tun als mit dem Transportweg und wer am Ende antwortet. Die Frage ist deshalb, ob die Netze über das LAN oder das WAN-Interface verbunden sind.

Du kommst aus dem Netz der FB1 und willst zur Kamera, die an FB 2 im LAN hängt. Wenn sich beide über das jeweilige LAN interface unterhalten, solltest Du die Kamera auch direkt erreichen, wenn beide FB eine Route für das andere Netz haben, also auf FB1 (192.168.178.1) mit dem Netz 192.168.188.0 die Route für 192.168.198.0/24 Gateway 192.168.178.2 (FB2) setzten und umgekehrt. Dann im Script die IP der Kamera angeben.

Wenn FB2 über das WAN Interface im LAN hängt, ist NAT aktiv wenn sie als Router und nicht als Client konfiguriert ist. Dann im CURL die IP der FB2 eintragen. Andernfalls ist das wieder eine Direktverbindung ohne NAT. Du trägst nun wieder die KameraIP in das Script ein und auf der FB1 muss dann die Route auf das externe Interface der FB2 gelegt werden.

Tommi

Glaub mir, es ist ein Curl-Problem.

Die Router sind per WAN verbunden und machen NAT. Deshalb muss ich die Kamera über den davor stehenden Router ansprechen und per Portweiterleitung erreichen.

Daher die Frage: Wie gebe ich Curl einen Port mit?

Grüße
galleto

Evtl. so:

curl_setopt($ch, CURLOPT_PORT, '12345');

siehe auch letzte Antwort:
PHP Curl with port number issue - Stack Overflow

Danke! Aber…

:smiley:

Egal, nochmal:

  1. Ohne diese Option oder $ip = „192.168.178.21:12345“; geht es gar nicht. (Timeout)

  2. Nur mit der o.g. Option kommt „The request is forbidden.“ - Ein Hinweis auf der/die/das Referer im Skript:

 curl_setopt($ch, CURLOPT_REFERER, 'http://'.$ip.'/motion.htm');
  1. Denn nutze ich auch beim Referer $ip = „192.168.178.21:12345“;, dann geht es weiter, aber…

Problem liegt wohl primär beim Referer. Der ist durch eine neuere Firmware erzwungen worden. Leider verstehe ich dieses „Referer-Konstrukt“ nicht mal ansatzweise. :rolleyes:

Dank und Grüße
galleto

OK, ich bin raus.

Danke trotzdem, tommi!

Mit dem Problem, dass „/setSystemMotion“ unerklärlich zu „/etc_ro/web/setform/setSystemMotion“ umgeleitet wird, bin ich nicht allein: HTTP/1.1 Post to D-Link Camera - Stack Overflow

Verwunderlich ist nur, dass es im selben Subnetz funktioniert. Nur bei der Port-Weiterleitung tritt das Problem auf.

Curl-Experten vortreten bitte. :wink:

Grüße
galleto

Problem gelöst. :smiley:

Grüße
galleto