Ermitteln der externen IP-Adresse der Fritz!Box OHNE UPnP

Wenn alles geht, dann liegt die doch schon auf Platte.

Damit hast du die schon geholt:
Code:
wget -t 1 http://$FRITZBOX/home/home.lua?sid=$SID 2>/dev/null

Ein cat home.lua\?sid\=$SID | grep "IP-Adresse" ... sollte sie zu Tage foerdern.


voipd.
 
Danke, jetzt habe ich ein grundsätzliches Ergebnis mit

Code:
cat home.lua\?sid\=$SID | grep "IP-Adresse:" | sed 's/.*IP-Adresse: //' | cut -f1 -d"<"

Jetzt geht es ans Finetuning, ob das auch zu schaffen ist, ohne, dass man in eine Datei schreibt.
 
Stecke es doch in eine Variable. Das wurde auch schon ein paar Zeilen dadrueber im Script gemacht. ...

Code:
IPADRESSE=`wget -t 1 http://$FRITZBOX/home/home.lua?sid=$SID | grep "IP-Adresse:" | sed 's/.*IP-Adresse: //' | cut -f1 -d"<" `
echo $IPADRESSE

BTW: Leider gibt es noch keine API zum abfragen der IP, etc. AVM arbeitet denkt aber daran.

voipd.
 
Hat jemand noch PHP Code Schnippsel, der noch Funktioniert für die externe IPv4 Adresse? Über UPnP auf Port 49000 wird es ja nichts mehr, durch ganzen Einschränkungen von AVM. Am liebsten wäre mir eine Lösung ohne externe Seiten abfragen und ohne Login in die FB.

Mit Login bräuchte man z.B. nur ["connection0:status/ip"] aus http://fritz.box/internet/inetstat_monitor.lua auslesen.

Mit IPv6 ist es ja kein Problem die kann man vom Hostnamen abfragen oder mit ifconfig.
 
Zuletzt bearbeitet von einem Moderator:
Hallöle.
Vielleicht hilft dir ja auch get_ip (freetz, hier im Forum suchen).

Auf einem (im Internet) erreichbaren Server der PHP kann, tuts auch ein Auslesen der Servervariablen.
PHP:
<?php
include('header.php');
echo "<br /><br /><hr />";
foreach($_SERVER as $quelle => $inhalt){
echo "<h3>".$quelle." hat den Wert: ".$inhalt."</h3>";
}
if($_SERVER[argc]){
$argv=$_SERVER["argv"];
echo "<h3>argv hat den Wert: ".$argv."</h3>";
}
include("footer.php");
?>
Die entsprechende Variable hat den Namen: REMOTE_ADDR

Es sieht so aus als wenn ihr eine mehr oder weniger komplizierte Skriptlösung sucht.
Trotzdem traue ich mich mal eine einfache Lösung (Firefox/Plugin) vorzuschlagen.
Ich weiss aber nicht genau ob die UPNP-Statusabfrage dafür aktiviert sein sollte.
EDIT: Vox!Box benutzt diese URL:
Code:
http://fritz.box:49000/upnp/control/WANIPConn1
...also doch UPNP-Statusabfrage.

Firefox starten, in der Menüleiste "Extras" auf "Addons" klicken.
Oben Rechts in der Suchleiste "fritz" eintippen und "Vox!Box 1.2.0" sich mal ganz genau angucken (klick auf "mehr").
(Von AVM gibt es übrigens ein ganz ähnliches Addon)
Nach der Installation seh ich meine öffentliche IP-Nummer unten rechts in der (aktivierten) Addonleiste.
Wenn ich dadrauf doppelklicke verbindet sich die Fritz!Box neu und es gibt eine neue öffentliche IP-Nummer.
(Das ist praktisch, wenn man ständig gescannt, oder der SSH-Server angegriffen wird)

Grüße
 
Zuletzt bearbeitet:
Mit Login bräuchte man z.B. nur ["connection0:status/ip"] aus http://fritz.box/internet/inetstat_monitor.lua auslesen.

Meinst du sowas hier:
PHP:
$IP = 0; 
//IP-Adresse
$ch = curl_init("http://$fritzbox/cgi-bin/webcm"); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "sid={$SID}&getpage=../html/query.txt&var:n[0]=connection0:status/ip"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_exec($ch); 
curl_close($ch);   

$IP = $ch;

oder sowas hier: externe ip abfrage per vbs mit wget unter windows

;)
 
Ich wollte halt auf dem NAS ein Script schreiben welches halt externe IPv4 Adresse abfragt, damit wollte ich dann den DNS Server anpassen auf dem NAS oder für das Schlundtech XML Gateway um quasi einen eigenen DynDNS zuhaben.

Dabei wollt ich nicht unbedingt im Minutentakt externe Seiten mit Anfragen voll zu spam´en wie meine IP ist oder Ping´s durchführen. Auch wollte ich dabei auf Freetz und Telnet auf der FB verzichten. Die SOAP Anfragen auf UPnP wurden ja aus Sicherheitsgründen eingeschränkt. Das von Pikachu sieht schon in richtige Richtung aus, hätte es wohl eher komplizierter gemacht mit file_get_contents und ereg_replace. Beim Login würde aber wohl das FB Log voll werden durch jede Anfrage.

Wäre wohl einfacher, wenn ich das NAS im Netzwerk in der FB als DynDNS eingebe, damit die FB wohl selbst die IPv4 Adresse angibt, und nur dann wenn auch eine neue Adresse ist.
 
Zuletzt bearbeitet von einem Moderator:
@HabNeFritzbox: Versuch doch einfach mal get_ip irgendwie ohne freetz auf die box zu kriegen (anpassen).
Oder klau dir den Code da raus (rot markiert).
Damit sollte sich der gorgonische Knoten auf unkomplizierte, magische Weise von selber lösen.
Code:
#!/bin/sh

[ -r /mod/etc/conf/mod.cfg ] && . /mod/etc/conf/mod.cfg

# Global result
IP=""

helpmsg() {
cat << EOF
get_ip - determine external IP address

Usage: $0 [option]
    -a, --all      - use all methods (order: stun, route, dsld, webcm) [recommended]
    -d, --dsld     - use showdsldstat (since firmware 04.86)
    -r, --route    - use routing table
    -s, --stun     - use STUN server (stun.1und1.de)
    -w, --webcm    - use webcm CGI handler / ctlmgr_ctl
    -?, --help     - print this help message

Current default method: $MOD_GET_IP_METHOD

Note: If environment variable IPADDR is set and contains a public IP (not from
a private or link-local network), its value will be returned.

EOF
}

# Detect private (RFC 1918) or link-local (RFC 5735) IPs
# Returns 0 for public IP, 1 for private IP, 2 if IP == ""
ip_public()
{
        [ "$1" ] || return 2
        local ip=$1
        # 10.0.0.0/8 (private), 192.168.0.0/16 (private), 169.254.0.0/16 (link-local)
        (
                [ "$ip" != "${ip#10.}" ] ||
                [ "$ip" != "${ip#192.168.}" ] ||
                [ "$ip" != "${ip#169.254.}" ]
        ) && return 1
        # 172.16.0.0/12 (private)
        [ "$ip" == "${ip#172.}" ] && return 0
        ip=$(echo $ip | cut -d '.' -f 2)
        [ $ip -ge 16  ] && [ $ip -le 31 ] && return 1 || return 0
}

via_dsld() {
        # Firmware ca. 04.68 and newer should be safe, but some boxes had it since 04.31
        IP="$(/sbin/showdsldstat 2>/dev/null | sed -nr 's/0: ip ([0-9.]+).*/\1/p')"
        ip_public "$IP" || return 1
}

# AVM's home-brew NAT does not expose the external IP on network interface
# "dsl", but sets a route to it. This method should work on most DSL boxes,
# with two known exceptions:
#   a) DNS servers are configured manually to hosts with public IP address.
#      In this case multiple candidate IPs would be found. Thus we return an
#      error rather than trying to guess which IP might be correct.
#   b) If the box does not connect to DSL via PPPoE but uses the DSL modem as a
#      bridge to e.g. a public /21 network, the external IP is not listed in
#      the routing table at all, but the /21 network instead.
# There might be more exceptions in case of routing table manipulation (maybe
# for VPNs or if for any reason a single external host IP is explicitly added
# to the routing table).
via_route() {
        local candidate_count=0
        for ip in $(route -n | sed -nr 's/^([1-9][0-9]*(\.[0-9]+){3}) +0(\.0){3} +255(\.255){3} +.* dsl$/\1/p'); do
                ip_public "$ip" && IP="$ip" && candidate_count=$((candidate_count + 1))
        done
        [ $candidate_count -eq 1 ] && return 0
        unset IP
        return 1
}

# On IP clients or UMTS, we are mostly behind a NAT and the only way to
# determine the external IP is to get the information from an external
# server. The most efficient method is STUN (stun-ip applet will try 3x).
via_stun() {
        IP=$(stun-ip stun.1und1.de)
        [ $? -eq 0 ] && [ "$IP" ] && return 0
        return 1
}

via_webcm() {
        local queryfile="/usr/www/all/html/query.txt"
        local querystring=""
        if which ctlmgr_ctl >/dev/null; then
                # Firmware ca. 04.76 and newer
                IP=$([B][COLOR="#B22222"]ctlmgr_ctl r connection0 pppoe:status/ip[/COLOR][/B])
        else
                if [ "$(sed -n '/var:n\[/p' $queryfile)" ]; then
                        # Firmware ca. 04.84 and newer (should never be used, see above)
                        querystring="[B][COLOR="#B22222"]var:n[0]=connection0:pppoe:status/ip[/COLOR][/B]"
                else
                        # Older firmware
                        querystring="[COLOR="#B22222"][B]var:cnt=1&var:n0=connection0:pppoe:status/ip[/B][/COLOR]"
                fi
                IP="$(/usr/www/html/cgi-bin/webcm "getpage=${queryfile}&${querystring}")"
        fi
        # ctlmgr_ctl return values [box=val]: 7170=176, 7270=177, 7141=172
        # Caveat: must use "-o" instead of "||", otherwise "$?" would be reset
        [ $? -eq 0 -o $? -ge 170 ] && ip_public "$IP" && return 0 || return 1
}

# If multid (or whoever) has already determined the external IP, use it
ip_public "$IPADDR" && echo "$IPADDR" && exit 0

# Set user-defined method (e.g. via web UI) if no argument is given
[ $# -eq 0 ] && method="$MOD_GET_IP_METHOD" || method="$1"

case $method in
        -a|--all|""|-e|--extquery|-o|--ostat)
                # for compatibility reason only, may be removed later
                [ "$method" ] && [ "$method" != "-a" ] && [ "$method" != "--all" ] &&
                        echo "warning: method $method is obsolete, using --all instead" >&2
                # Why this order?
                #   1.) STUN should always work and is fast
                #   2.) route is fast, works in all firmwares, problematic routing configs are rare
                #   3.) dsld is faster than ctlmgr/webcm, but not always available
                #   4.) ctlmgr/webcm is slow, but should work in all firmwares on DSL boxes
                for mode in stun route dsld webcm; do
                        via_$mode
                        [ $? -eq 0 ] && break
                done
                ;;
        -d|--dsld)
                via_dsld
                ;;
        -r|--route)
                via_route
                ;;
        -s|--stun)
                via_stun
                ;;
        -w|--webcm)
                via_webcm
                ;;
        -?|-h|--help)
                helpmsg
                exit 0
                ;;
        *)
                helpmsg >&2
                exit 1
                ;;
esac

[ $? -ne 0 ] && echo "get_ip error" >&2 && exit 1
echo "$IP"
Steht mal wieder kein Author im Quelltext (weggestripped?), ich vermute es war Oliver (olistudent)

get_ip liefert mir auch auf reinen IP-Boxen ohne DSL, Telefon und WLAN die Public-IP.
Voraussetzung: multid muss (leider) laufen
 
Zuletzt bearbeitet:
Kostenlos!

Statistik des Forums

Themen
248,882
Beiträge
2,303,897
Mitglieder
378,557
Neuestes Mitglied
ageaage