Ipv4 + IPv6 in einem Formular verwenden [gelöst]

Bash, Shell, PHP, Python, Perl, CGI
yourdom
Posts: 8
Joined: 2014-10-22 22:11

Ipv4 + IPv6 in einem Formular verwenden [gelöst]

Post by yourdom » 2014-10-22 22:39

Hallo liebe Forengemeinde,

ich quäle mich jetzt schon seit Tagen durch die Ergebnisse von Google bin irgendwie immer nur teilfündig.

Zur Umgebung:
Ich bastel gerade ein DynDNS-Script, was an sich mit IPv4 problemlos via Update-URL funktioniert.
Die Zonenupdates im DNS usw. funktionieren so wie es soll. Debian Wheezy + Bind9 + Apache mit PHP5.

Jedoch bei Benutzern, welche IPv4 und IPv6 benötigen, wird es irgendwie dann doch komplizierter.
Feuerwehr Server und diverse User.

In meinem Loginsystem, welches auf PHP mit AJAX basiert, kann ich entweder nur IPv4 oder IPv6 auslesen um es in den DNS zu hinterlegen.

Die Ermittlung der IP erfolgt über folgende URL:
https://ipv4.meinedomain.de/ipcheck.php?... für IPv4
https://ipv6.meinedomain.de/ipcheck.php?... für IPv6

Zum Problem:
Wenn man im Loginbereich einen neuen DynDNS-Host anlegen möchte, wird nur die IPv4 als A Zone in den DNS eingetragen, da ich bis jetzt am Auslesen der IPv6 gescheiter bin. Die Domain des Loginbereichs ist über eine IPv4-Adresse in den DNS eingetragen, sodass PHP die IPv4 ausliest.

Jedoch möchte ich dass man beim Anlegen eines DynDNS-Hosts auch gleich die AAAA-Records für die IPv6 mit anlegen kann, ohne die IPv6 von Hand eingeben zu müssen. Sofern eine IPv6 vorhanden ist.

Jetzt habe ich bei http://www.wieistmeineip.de gesehen, dass dort eine gleichzeitige Abfrage der IPv4 und IPv6 möglich ist.
Nur leider kann man bei Javascript / AJAX keine externe URL ausserhalb der aktuellen Domain aufrufen, was mein Problem sonst gelöst hätte.

Weiß jemand von Euch vielleicht einen anderen Weg dies zu realisieren?
In den Google-Ergebnissen heißt es immer, das geht nicht für beide IP-Arten, aber wieistmeineip.de hat es doch auch geschafft? :-o

Bin für jeden Ansatz dankbar.

EDIT 25.10.14: Lösung im letzten Beitrag, Umsetzung via CORS-Request
Last edited by yourdom on 2014-10-25 05:07, edited 1 time in total.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Ipv4 + IPv6 via PHP auslesen

Post by Joe User » 2014-10-22 23:31

Quick and dirty:

Code: Select all

dns_get_record("$_SERVER['REMOTE_HOST']", DNS_A + DNS_AAAA);

Validierung und Co musst Du natürlich nach Bedarf hinzufügen.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

yourdom
Posts: 8
Joined: 2014-10-22 22:11

Re: Ipv4 + IPv6 via PHP auslesen

Post by yourdom » 2014-10-23 00:31

Joe User wrote:Quick and dirty:

Code: Select all

dns_get_record("$_SERVER['REMOTE_HOST']", DNS_A + DNS_AAAA);

Validierung und Co musst Du natürlich nach Bedarf hinzufügen.


Hallo Joe User,

danke für deine Antwort.

Leider bleibt die Ausgabe leer.
Ich habe dann zum Test einmal dns_get_record("meinedomain.de", DNS_A + DNS_AAAA) verwendet, dann ließt er korrekt die DNS meiner Domain und gibt mir einen Array zurück. Funktioniert diese Funktion nicht bei IP-Adressen vom DSL-Anschluss?

Danke.

EDIT: Die REMOTE_HOST läuft ja nur bei entsprechender Apache Konfiguration. Habe das ganze nochmal geändert.

Code: Select all

<?
$ip = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$result = dns_get_record($ip, DNS_A + DNS_AAAA);
print_r($result);
?>


Habe ein wenig hin und her getestet und mir ist aufgefallen, das der Hostname "hinter" einer IP bei der T-Com unterschiedlich ist zwischen IPv4 und IPv6. Also besteht so gesehen keine Möglichkeit über eine PTR-Abfrage o. Ä..

Naja, die Nacht ist noch jung und Urlaub ist noch genug übrig... :-D Mal schauen, es in AJAX nicht noch irgendeine Möglichkeit gibt...
... Sollte ich was finden, schreibe ich es natürlich für die Nachwelt hier rein. ;-)
Last edited by yourdom on 2014-10-23 00:55, edited 2 times in total.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Ipv4 + IPv6 in einem Formular verwenden

Post by Joe User » 2014-10-23 02:13

Mit Javascript bekommst Du nur die IP(s) des Clients nicht des Internetanschlusses. Clients hinter Routern/Modems/Firewalls/Proxies haben nahezu nie die IP(s) welche Du für Dein Projekt benötigst.

Bei mir würdest Du zum Beispiel eine IP aus dem privaten 10/8er IPv4-Netz oder eine IP aus dem privaten fe80/16er IPv6-Netz per Javascript bekommen, nicht aber meine öffentlichen IPs.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

yourdom
Posts: 8
Joined: 2014-10-22 22:11

Re: Ipv4 + IPv6 in einem Formular verwenden

Post by yourdom » 2014-10-23 19:01

Joe User wrote:Mit Javascript bekommst Du nur die IP(s) des Clients nicht des Internetanschlusses. Clients hinter Routern/Modems/Firewalls/Proxies haben nahezu nie die IP(s) welche Du für Dein Projekt benötigst.

Bei mir würdest Du zum Beispiel eine IP aus dem privaten 10/8er IPv4-Netz oder eine IP aus dem privaten fe80/16er IPv6-Netz per Javascript bekommen, nicht aber meine öffentlichen IPs.


Ich glaube ich hatte das falsch erklärt. Über Javascript hätte ich eine externe URL zur Ermittling der IPv6 aufgerufen und diese dann nur via Javascript in das vorgesehene Feld zu schreiben.

Es offenbart aber schon das nächste Problem. Sollte man eine Speedport Router haben, bekommt man via PHP nur die IPv6 des Routers angezeigt und die wenigsten Router unterstützen Portweiterleitungen via IPv6 und blocken eingehende Verbindungen auf IPv6-Ebene.

Irgendwie artet das in einem Chaos aus....

yourdom
Posts: 8
Joined: 2014-10-22 22:11

Re: Ipv4 + IPv6 in einem Formular verwenden

Post by yourdom » 2014-10-23 22:48

Aus einem Chaos wird Erleuchtung....

Ich habe mit verschieden Technikern von Telekom und auch Vodafone telefoniert.
Die Nutzung von IPv6 scheitert meist an den Routern der Provider, da diese den PC's und Servern im LAN öffentliche IPv6 zuweisen,
jedoch meistens nicht auf Basis von IPv6 konfigurierbar sind und alle Requests an eine IPv6-Adresse zu einem Server hinter dem Router nicht durchgelassen werden.

Nicht jeder hat eine Fritzbox, sodass in dem Script also die Verwendung von IPv6 nur mit ausdrücklichem Hinweis gegenüber dem Benutzer erfolgen sollte.


EDIT: Fehlinformationen entfernt.
Last edited by yourdom on 2014-10-23 23:18, edited 1 time in total.

yourdom
Posts: 8
Joined: 2014-10-22 22:11

Re: Ipv4 + IPv6 in einem Formular verwenden (PHP & AJAX)

Post by yourdom » 2014-10-23 23:34

Joe User wrote:Bei mir würdest Du zum Beispiel eine IP aus dem privaten 10/8er IPv4-Netz oder eine IP aus dem privaten fe80/16er IPv6-Netz per Javascript bekommen, nicht aber meine öffentlichen IPs.


Die Abfrage sollte ja eigendlich auch nicht auf dem Benutzersystem selbst erfolgen, sondern nur der Aufruf zweier URL's, welche die IP-Adressen via PHP auslesen und dann via Javascript in die entsprechenden Formularfelder eintragen. Dazu bin ich bei Google auf das Thema "Cross Domain Request" mit AJAX und JSON gestoßen, wozu ich mich aber nochmals genauer einlesen muss, da dies scheinbar nur bei bestimmten Faktoren funktioniert und auch die Lösung für den Startpost dieses Threads wäre.

Während ich mit den Technikern telefoniert habe, haben die mir auch gesagt, dass die IPv4 und IPv6-Adressen jeweils verschiedene "Hostnamen" in den Reverse DNS haben, sofern solch ein Eintrag vorhanden ist. Bei den beiden Providern, mit denen ich telefoniert habe, funktioniert das Auslesen der DNS Daten nicht. Die IPv4 und IPv6-Adressen sind zwar einem Kunden zusammen im DualStack zugeteilt, jedoch variabel zu einander. Das bedeutet, dass der nächste Kunde, der die IPv4 zugewiesen bekommt nicht unbedingt auch die gleichen IPv6-Adressen bekommt und dadurch ein gemeinsamer RDNS wegfällt und eine Abfrage nur über beide Protokolle nötig ist.

Ich betrachte das Problem dieses Threads erstmal als erledigt und die Lösung ist AJAX Cross Domain Request via JSON.
Beispiel Quelltext folgt...

yourdom
Posts: 8
Joined: 2014-10-22 22:11

Re: Ipv4 + IPv6 in einem Formular verwenden

Post by yourdom » 2014-10-25 05:05

Hier nun einmal die Lösung, da es vielleicht für jemanden noch brauchbar ist:
(Auch wenn es ein wenig umständlich ist und evtl. einfacher gehen mag...)

Grundvoraussetzung für dieses Vorgehen sind zwei verschiedene DNS-Einträge im Nameserver und das "Apache2 Modul headers".

Zur Übersichtlichkeit haben wir die Domain example.com als unsere Domain, welche zusätzlich über folgende DNS-Records verfügt:

Code: Select all

ipv4.example.com IN A xxx.xxx.xxx.xxx (IPv4-Adresse des Servers)
ipv6.example.com IN AAAA xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx (IPv6-Adresse des Servers)

Die beiden Subdomains nur einmal als
Auf dem Server Zeigen diese beiden Domains auf den Ordner "/var/www/ipinfo" und darin befindet sich eine Datei:

ipcheck.php

Code: Select all

<? 
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
echo "<ip>".$_SERVER['REMOTE_ADDR']."</ip>";
?>


Diese Datei dient zum Auslesen der IP-Adressen und verfälsch den HTTP Header dahingehend, damit der Requst nicht an den Sicherheitsregeln abbricht. Dazu wird das Apache Modul headers benötigt.
Die Domain example.com zeigt auf das Verzeichnis "/var/www", in welchem unsere Projektseite liegt.
Zu erwähnen sind dort nur zwei Dateien:

ipcheck.js (Abgewandelt von http://www.html5rocks.com/en/tutorials/cors/)

Code: Select all

// Create the XHR object.
function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    // XHR for Chrome/Firefox/Opera/Safari.
    xhr.open(method, url, true);
  } else if (typeof XDomainRequest != "undefined") {
    // XDomainRequest for IE.
    xhr = new XDomainRequest();
    xhr.open(method, url);
  } else {
    // CORS not supported.
    xhr = null;
  }
  return xhr;
}

function getIPaddi(text) {
  return text.match('<ip>(.*)?</ip>')[1];
}
function checkipv6() {
  var url = 'http://ipv4.example.com/ipcheck.php';
  var xhr = createCORSRequest('GET', url);
  xhr.onload = function() {
    var text = xhr.responseText;
    var ipv4 = getIPaddi(text);
    document.getElementById('ipv4adresse').value = ipv4;
  };
  xhr.send();
}
function checkipv6() {
  var url = 'http://ipv6.example.com/ipcheck.php';
  var xhr = createCORSRequest('GET', url);
  xhr.onload = function() {
    var text = xhr.responseText;
    var ipv6 = getIPaddi(text);
   document.getElementById('ipv6adresse').value = ipv6;
  };
  xhr.send();
}


und die Seite auf der die Daten benötigt werden:
form.php (Nur als Beispiel)

Code: Select all

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script src="test.js" type="text/javascript"></script>
<script type="text/javascript">
function felderleer() {
   document.getElementById('ipv4adresse').value = '';
   document.getElementById('ipv6adresse').value = '';
}
</script>
<title>IP Auslesetest</title>
</head>
<body>
<form name="ipread_form" action="" method="post">
<p>IPv4-Adresse:<br>
<input name="ipv4adresse" type="text" id="ipv4adresse" size="15" maxlength="15" readonly="true" /></p>
<p>Tempor&auml;re IPv6-Adresse:<br>
<input name="ipv6adresse" type="text" id="ipv6adresse" size="39" maxlength="39" readonly="true" /></p>

<p><a href="#" onclick="checkipv4();">IPv4 einlesen</a></p>
<p><a href="#" onclick="checkipv6();">IPv6 einlesen</a></p>
<p><a href="#" onclick="checkipv4(); checkipv6();">IPv4 + IPv6 zusammen einlesen</a></p>
<p><a href="#" onclick="felderleer();">Felder leeren</a></p>
</form>
</body>
</html>


Fehlerhandling und Validierung sind in anderen Dateien gelöst. In diesem Thread ging es ja erstmal nur um die Abfrage der IP-Adressen innerhalb eines Formulars. Auch wenn es jetzt nicht via JSON sondern via CORS umgesetzt wurde.