[HowTo] Korrekte Uhrzeit auf Cisco 8961/9951/9971 an Fritzbox

hanjov

Neuer User
Mitglied seit
19 Jan 2009
Beiträge
6
Punkte für Reaktionen
0
Punkte
1
Hallo Freunde,


vor ein paar Tagen wollte ich mein Cisco 8961 endlich nach langer Zeit mit meiner Fritzbox verbinden. Zwar hat die grundlegende Funktion (Registrierung und Telefonate an der Fritzbox) funktioniert, jedoch bin ich ziemlich schnell ich auf das Problem mit der Uhrzeit bei Firmware >= 9.1 gestoßen (vergleiche https://tools.cisco.com/bugsearch/bug/CSCul33490). Also habe ich erstmal die 9.0 versucht, jedoch konnte sich das Telefon hierbei nicht an der Fritzbox registrieren (die Uhrzeit war jedoch tatsächlich korrekt). Das Problem ist, dass NTP von >= 9.1 einfach nicht mehr unterstützt wird und stattdessen die Uhrzeit im Header der SIP-Antworten der Fritzbox erwartet wird. Dies ist auch in diversen anderen Threads hier im Forum beschrieben.


Da ich mich ohnehin nicht wirklich mit der alten Firmware-Version abfinden wollte, habe ich mir eine Lösung überlegt, um das Problem zu beheben. Da ich weder die Fritzbox Firmware, noch die Cisco Firmware verändern kann, musste eine Alternative her. Wie bereits geschrieben erwartet das Telefon die Uhrzeit im SIP-Header. Also ist eine naheliegende Lösung diesen dementsprechend zu manipulieren.


Da ich viele hilfreiche Informationen aus diesem Forum bezogen habe, möchte ich mein Vorgehen gerne mit euch teilen. Jedoch wird das Ganze sehr technisch. Wer keine Erfahrung mit Linux und Routing hat, sollte an dieser Stelle vielleicht aufhören zu lesen - auf der anderen Seite, wer ein Cisco Telefon an einer Fritzbox betreibt, wird sicherlich auch das hier hinbekommen :)


Zuerst benötigen wir einen Linux-Rechner, der für uns die Pakete manipuliert. Ich verwende dazu einen Raspberry Pi mit Raspbian, prinzipiell sollte aber auch jede andere Hardware/Distribution taugen.


Als erstes müssen wir die Routing-Funktionalität des Kernels aktivieren. Dazu muss in /etc/sysctl.conf folgende Zeile ergänzt werden:
Code:
net.ipv4.ip_forward=1

Danach noch
Code:
sysctl -p
ausführen, um die Änderungen zu aktivieren.


Bevor es auf dem Linux Rechner weitergeht, müssen wir das Routing für das Telefon verändert. Für das Telefon funktioniert das je nach DHCP Server z.B. so:
dnsmasq:
Code:
[...]
dhcp-option=pirouter,option:router,192.168.x.y # IP des Linux Rechners
dhcp-option=vendor:Cisco,150,192.168.x.t # IP eures TFTPs
dhcp-host=00:11:22:33:44:55,192.168.x.z,set:pirouter # MAC und IP des Telefons
[...]

dhcpd:
Code:
[...]
option cisco-tftp code 150 = array of ip-address;
shared-network LAN1 {
    [...]
    subnet 192.168.x.0 netmask 255.255.255.0 { # euer Subnetz
        [...]
        option cisco-tftp 192.168.x.t; # IP eures TFTPs
        option routers 192.168.x.1; # Euer default Router
        host phone.tld { # FQDN des Telefons
            fixed-address 192.168.x.z; # IP des Telefons
            hardware ethernet 00:11:22:33:44:55; # MAC des Telefons
            option routers 192.168.x.y; # IP des Linux Rechners
        }
        [...]
    }
}

Falls ihr die Fritzbox als DHCP Server verwendet bleibt euch nur den Router manuel im Telefon zu konfigurieren, aber das habt ihr wahrscheinlich ohnehin schon, da ihr auch den TFTP Server manuel einrichten musstet.


Nun müsst ihr noch in eurem Router eine spezifische Route für euer Telefon über den Linux Rechner einrichten, also z.B. so:
192.168.x.z via 192.168.x.y


Ich selbst verwende die Fritzbox nicht als Router, daher kann ich nicht mit Gewissheit sagen, ob das funktioniert. Die Konfiguration dafür findet ihr aber unter Heimnetz -> Heimnetzübersicht -> Netzwerkeinstellungen -> IPv4 Routen.


Wenn ihr das alles geschafft habt sollte sich das Telefon weiterhin registrieren. Um das zu überprüfen oder auch um einen Fehler zu finden, können wir nun auf dem Linux Rechner
Code:
tcpdump -v udp port 5060
ausführen. Wichtig ist, dass wir Pakete in beide Richtungen sehen (wobei wir nur die eine Richtung manipulieren müssen, aber asymmetrisches Routing ist Mist und verursacht nur Probleme...). Das Ganze sollte in etwa so aussehen:
Code:
phone.tld.sip > fritzbox.tld.sip: SIP, length: 997
    REGISTER sip:192.168.x.f SIP/2.0 # IP der Fritzbox
    [...]
fritzbox.tld.sip > phone.tld.sip: SIP, length: 813
    SIP/2.0 200 OK
    [...]

Die Pakete sehr ihr möglicherweise doppelt. Das liegt daran, dass die Pakete einmal reinkommen und einmal rausgesendet werden.


So, nun haben wir also erfolgreich den Traffic über unseren Linux-Rechner umgeleitet. Jetzt geht es ans Manipulieren. Zuerst müssen wir ein paar Pakete nachinstallieren:
Code:
apt-get install nfqueue-bindings-perl libnetpacket-perl

Als nächstes legt ihr euch eine Datei sip-date.pl an. Ich habe das unter /opt/scripts gemacht, aber da könnt ihr natürlich variieren. Inhalt:
Code:
#!/usr/bin/perl
#
# see http://search.cpan.org/~atrak/NetPacket-0.04/


#use strict;


BEGIN {
    push @INC,"perl";
    push @INC,"build/perl";
    push @INC,"NetPacket-0.04";
};


use nfqueue;


use NetPacket::IP qw(IP_PROTO_UDP);
use NetPacket::UDP;
use Socket qw(AF_INET AF_INET6);


use POSIX qw(strftime);


my $q;


sub cleanup()
{
    print "unbind\n";
    $q->unbind(AF_INET);
    print "close\n";
    $q->close();
}


sub cb()
{
    my ($dummy,$payload) = @_;
    print "Perl callback called!\n";
    print "dummy is $dummy\n" if $dummy;
    if ($payload) {
        print "len: " . $payload->get_length() . "\n";


        my $ip_obj = NetPacket::IP->decode($payload->get_data());
        print $ip_obj, "\n";
        print("$ip_obj->{src_ip} => $ip_obj->{dest_ip} $ip_obj->{proto}\n");
        print "Id: " . $payload->swig_id_get() . "\n";


        if($ip_obj->{proto} == IP_PROTO_UDP) {
            # decode the UDP header
            my $udp_obj = NetPacket::UDP->decode($ip_obj->{data});


            print "UDP src_port: $udp_obj->{src_port}\n";
            print "UDP dst_port: $udp_obj->{dest_port}\n";
            print "UDP flags   : $udp_obj->{flags}\n";
            print "UDP data    : $udp_obj->{data}\n";


            #if ($udp_obj->{flags} & NetPacket::UDP::PSH &&
            #        length($udp_obj->{data})) {
            #    print "data is defined\n";
            #    #$udp_obj->{data} = 'gruik';
            #    $udp_obj->{data} =~ s/love/hate/m;
            #    print "**********\n";
            #    print $udp_obj->{data};
            #    print "**********\n";
            #}
            $datestring = strftime "%a, %d %b %Y %H:%M:%S GMT", gmtime;
            $udp_obj->{data} =~ s!SIP/2.0 200 OK!SIP/2.0 200 OK\r\nDate: $datestring!g;
            print "UDP data new: $udp_obj->{data}\n";


                        # try modifying the packet
                        #$ip_obj->{src_ip} = "1.2.3.4";
                        #$udp_obj->{src_port} = 42;
            #$ip_obj->{dest_ip} = "213.186.33.19";
            $udp_obj->{cksum} = 0;
            $ip_obj->{cksum} = 0;
                        $ip_obj->{data} = $udp_obj->encode($ip_obj);
                        my $modified_payload = $ip_obj->encode();
                        my $ip2 = NetPacket::IP->decode($modified_payload);
                        print("$ip2->{src_ip} => $ip2->{dest_ip} $ip2->{proto}\n");
            my $udp2 = NetPacket::UDP->decode($ip2->{data});


            print "UDP src_port: $udp2->{src_port}\n";
            print "UDP dst_port: $udp2->{dest_port}\n";


                        print "data length: ", length($modified_payload), "\n";


                        my $ret = $payload->set_verdict_modified($nfqueue::NF_ACCEPT,$modified_payload,length($modified_payload));
            print "ret: $ret\n";
            return;
        }


        $payload->set_verdict($nfqueue::NF_ACCEPT);
        return;
    }
    $payload->set_verdict($nfqueue::NF_ACCEPT);
}




$q = new nfqueue::queue();


print "open\n";
$q->open();
print "bind\n";
$q->bind(AF_INET);


$SIG{INT} = "cleanup";


#print "set callback, wrong argument type (should fail)\n";
#$q->set_callback("blah");


print "setting callback\n";
$q->set_callback(\&cb);


print "creating queue\n";
$q->create_queue(0);


print "trying to run\n";
$q->try_run();

Außerdem brauchen wir noch eine Datei sip-date.sh mit folgendem Inhalt:
Code:
#!/bin/bash


PIDFILE="/var/run/sip-date.pid";


/usr/bin/perl /opt/scripts/sip-date.pl 2>&1 > /dev/null &
echo $! > $PIDFILE;


exit 0;

Die zweite Datei kann man verwenden, um das Script als Service zu starten. Wie das geht findet man leicht über Google heraus.


Die beiden Scripte jetzt noch per
Code:
chmod +x sip-date.*
ausführbar machen und dann kann es losgehen.

An dieser Stelle sei noch gesagt, dass es natürlich hilfreich ist, wenn der Linux Rechner auch die richtige Uhrzeit hat, also am Besten vorher noch NTP konfigurieren ;-)

In einem Terminal startet ihr jetzt
Code:
./sip-date.pl
und in einem anderen führt ihr diesen Befehl aus:
Code:
iptables -A FORWARD -s 192.168.x.f/32 -d 192.168.x.z/32 -p udp -m udp --sport 5060 --dport 5060 -j NFQUEUE --queue-num 0
wobei x.f die Fritzbox und x.z das Telefon.


Über
Code:
iptables -vnxL
könnt ihr sehen, ob die Regel aktiv ist und ob Pakete von der Regel erfasst werden. Denkt daran, dass iptables Regeln nach einem Neustart weg sind. Ich verwende iptables-persistent (Google), um die Regeln nach einem Neustart automatisch wiederherzustellen.


Wenn alles richtig eingerichtet ist, solltet ihr nun im Perl-Script Pakete ankommen sehen. Außerdem kann man mit obigen tcpdump Befehl ebenfalls die manipulierten Pakete sehen, die sehen jetzt z.B. so aus:
Code:
fritzbox.tld.sip > phone.tld.sip: SIP, length: 850
    SIP/2.0 200 OK
    Date: Sat, 10 Dec 2016 11:38:38 GMT
    [...]

Wie ihr seht, wird jetzt die Uhrzeit in das Paket eingefügt. Ggf. noch das Telefon einmal durchbooten, dann sollte die Uhrzeit auch dort aktuel sein.


So, das war's. Ich hoffe ich konnte dem einen oder anderen helfen.


Viele Grüße
 
Zuletzt bearbeitet:
Bei meinem 7961 funktioniert zum Glück in der aktuellen Firmware noch NTP.
Aber deine Anleitung (die sehr ausführlich ist) zeigt einmal mehr, wie schade es ist, dass AVM nur eine so rudimentäre SIP Unterstützung für interne Geräte bietet.
Rufumleitungen oder die Signalisieren von Nachrichten auf dem Anrufbeantworter funktionieren ja auch nicht.
 
So, das war's. Ich hoffe ich konnte dem einen oder anderen helfen.

Ja das konntest Du. Vielen herzlichen Dank!

Ich hab ein 9971 recht günstig in der Bucht erstanden und bin nach längerer Suche hier gelandet.

Das Script hat bei mir leider nicht auf Anhieb funktioniert. Ich musste ein paar Zeilen anpassen. Für den Fall, dass es jemandem ähnlich geht hier das diff:

Code:
--- sip-date.pl.org     2019-05-03 21:13:58.168648698 +0200
+++ sip-date.pl     2019-05-03 21:19:03.048169800 +0200
@@ -38,9 +38,8 @@

 sub cb()
 {
-    my ($dummy,$payload) = @_;
+    my ($payload) = @_;
    print "Perl callback called!\n";
-    print "dummy is $dummy\n" if $dummy;
    if ($payload) {
        print "len: " . $payload->get_length() . "\n";

@@ -114,10 +113,6 @@
 $q = new nfqueue::queue();


-print "open\n";
-$q->open();
-print "bind\n";
-$q->bind(AF_INET);


 $SIG{INT} = "cleanup";
@@ -132,7 +127,7 @@


 print "creating queue\n";
-$q->create_queue(0);
+$q->fast_open(0, AF_INET);


 print "trying to run\n";

Die meisten aktuellen Distributionen nutzen systemd. Damit benötigt man die Datei sip-date.sh nicht. Wer das Script per systemd starten möchte, legt einfach eine Datei "/etc/systemd/system/sip-header-rewrite.service" an und kopiert dort folgenden Inhalt rein:
Code:
[Unit]
Description=SIP Header ReWrite
After=network.target

[Service]
Type=simple
ExecStart=/opt/scripts/sip-date.pl
TimeoutSec=5
Restart=always


[Install]
WantedBy=multi-user.target

Mittels
Code:
systemctl enable sip-header-rewrite.service
wird das script dann auch bei jedem Boot-Vorgang automatisch gestartet.

Für Ubuntu(und auch Debian) User wäre noch anzumerken, dass die iptables Regel auch in der Datei /etc/iptables/rules.v4 eingetragen werden kann. Dazu muss allerdings das Paket iptables-persistent installiert sein.
Nach obigen Beispiel einfach die Zeile:
Code:
-A FORWARD -s 192.168.x.f/32 -d 192.168.x.z/32 -p udp -m udp --sport 5060 --dport 5060 -j NFQUEUE --queue-num 0
vor das COMMIT am Ende der Datei eintragen.

Viel Erfolg.
 
Hallo Jarod42,

ich vermute, mit den letzten Raspbian Updates hat sich etwas verändert.
Das Datum ist nicht mehr in der Antwort.

Starte ich die sip-date.pl kommt die Ausgabe:

Code:
root@cisco-gateway:/opt/scripts# ./sip-date.pl
setting callback
creating queue
RuntimeError error during nfq_create_queue() at ./sip-date.pl line 129.

Hast du eine Idee?

Gruß
Ingo
 
um genau zu sein, es fehlt ein Paket

Paket nfqueue-bindings-perl kann nicht gefunden werden.
 
Sollte das Paket mittels "apt install nfqueue-bindings-perl" nicht mehr zur Verfügung stehen, dann kannst du es mittels "cpan" nachinstallieren.

Ich hatte noch keine Zeit mir das genau anzusehen, aber ich vermute, dass das fehlende Paket nur die halbe Wahrheit ist...

Bei mir ist das Paket installiert, und das Perl Script wirft auch in folgender Zeile :
Perl:
$q->fast_open(0, AF_INET);
den Fehler:
RuntimeError error during nfq_create_queue()

Da ich mir ein Asterisk hingestellt hab, brauche ich das Script aktuell nicht mehr. Ich werde aber dennoch mal versuchen, ob ich das Script auf einem Raspberry zum Laufen bekomme.
 
Danke schön für deine schnelle Antwort. Ich denke, Das Paket ist aus dem Support raus. Es gibt wohl keine aktuelle Version.

Meine Übergangslösung ist ein Rollback auf Stretch. Da ist alles vorhanden und läuft.

Weitere Lesson learned: Deutsche Umgebung verträgt sich nicht mit dem Cisco Telefon. Monat (Mar -> Mär) ;-)
 
Hallo zusammen,

ich bekomme in beiden Varianten der sip-date.pl folgenden Fehler:

"RuntimeError error during nfq_create_queue() at ./sip-date.pl line 129" und in der ersten Variante in line 138.

Der tcpdump zeigt den Anmeldeversuch an der FritzBox, der mit 401 Unauthorized abgelehnt wird.
Ändere ich die Konfig auf den ursprünglichen direkten Weg (ohne Gateway) zurück, funktioniert die Registrierung an der FritzBox problemlos.

Hintergrundinformationen: Ich verwende ein Raspbian Stretch mit aktuellem Patch Stand und dem installierten Packet nfqueue-bindings-perl.

Hat jemand eine Idee wo das Problem liegen könnte?
 
ups, sorry, habs jetzt auch gelesen. sorry.
 
Sorry, aber das verstehe ich grade nicht so ganz.
Ohne Umleitung (Phone -> FritzBox) funktioniert die Anmeldung. Mit zwischengeschaltetem Raspi (Phone -> Raspi -> Fritzbox) habe ich Probleme, die daraufhinweisen, dass mit der Anmeldung etwas nicht stimmt (so war meine ursprüngliche Einschätzung, die ich im Snom Wiki Eintrag bestätigt sehe). Weiterhin besteht in beiden Varianten des Skripts bei mir ein bislang nicht nachvollziehbares Problem.
Kann mir bitte jemand konkrete Lösungsansätze oder Möglichkeiten zur weiteren Eingrenzung des Problems liefern?
Vielen Dank im Voraus.
 
@bdz fangen wir mal vom Anfang an.

Du hast einen Pi aufgesetzt.Das Routing aktiviert und die Route eingetragen?

Das Telefon registriert sich und du siehst auf dem Pi den Traffic?

Code:
tcpdump -v udp port 5060

Wenn diese Schritte nicht funktionieren, läuft der Traffic nicht über den Pi.

Ein kleiner Nachtrag:

Der Dump wird dich mit der Menge erschlagen. Ich habe die einzelnen Pakete nicht gelesen. Mir reichte es, dass der Traffic sichtbar war.

Du kannst also "blind" weitermachen.

-- Zusammenführung Doppelpost gemäß Boardregeln by stoney

Du hast die oben erwähneten Pakete installiert.

Code:
apt-get install nfqueue-bindings-perl libnetpacket-perl

Als nächstes legt ihr euch eine Datei sip-date.pl an. Ich habe das unter /opt/scripts gemacht, aber da könnt ihr natürlich variieren. Inhalt:


Perl:
#!/usr/bin/perl
#
# see http://search.cpan.org/~atrak/NetPacket-0.04/


#use strict;

BEGIN {
    push @INC,"perl";
    push @INC,"build/perl";
    push @INC,"NetPacket-0.04";
};

use nfqueue;

use NetPacket::IP qw(IP_PROTO_UDP);
use NetPacket::UDP;
use Socket qw(AF_INET AF_INET6);

use POSIX qw(strftime);

my $q;

sub cleanup()
{
    print "unbind\n";
    $q->unbind(AF_INET);
    print "close\n";
    $q->close();
}

sub cb()
{
    my ($payload) = @_;
    print "Perl callback called!\n";
    if ($payload) {
        print "len: " . $payload->get_length() . "\n";

        my $ip_obj = NetPacket::IP->decode($payload->get_data());
        print $ip_obj, "\n";
        print("$ip_obj->{src_ip} => $ip_obj->{dest_ip} $ip_obj->{proto}\n");
        print "Id: " . $payload->swig_id_get() . "\n";

        if($ip_obj->{proto} == IP_PROTO_UDP) {
            # decode the UDP header
            my $udp_obj = NetPacket::UDP->decode($ip_obj->{data});

            print "UDP src_port: $udp_obj->{src_port}\n";
            print "UDP dst_port: $udp_obj->{dest_port}\n";
            print "UDP flags   : $udp_obj->{flags}\n";
            print "UDP data    : $udp_obj->{data}\n";

            $datestring = strftime "%a, %d %b %Y %H:%M:%S GMT", gmtime;
            $udp_obj->{data} =~ s!SIP/2.0 200 OK!SIP/2.0 200 OK\r\nDate: $datestring!g;
            print "UDP data new: $udp_obj->{data}\n";
            # try modifying the packet
            #$ip_obj->{src_ip} = "1.2.3.4";
            #$udp_obj->{src_port} = 42;
            #$ip_obj->{dest_ip} = "213.186.33.19";
            $udp_obj->{cksum} = 0;
            $ip_obj->{cksum} = 0;
                        $ip_obj->{data} = $udp_obj->encode($ip_obj);
                        my $modified_payload = $ip_obj->encode();
                        my $ip2 = NetPacket::IP->decode($modified_payload);
                        print("$ip2->{src_ip} => $ip2->{dest_ip} $ip2->{proto}\n");
            my $udp2 = NetPacket::UDP->decode($ip2->{data});

            print "UDP src_port: $udp2->{src_port}\n";
            print "UDP dst_port: $udp2->{dest_port}\n";

                        print "data length: ", length($modified_payload), "\n";

                        my $ret = $payload->set_verdict_modified($nfqueue::NF_ACCEPT,$modified_payload,length($modified_payload));
            print "ret: $ret\n";
            return;
        }

        $payload->set_verdict($nfqueue::NF_ACCEPT);
        return;
    }
    $payload->set_verdict($nfqueue::NF_ACCEPT);
}

$q = new nfqueue::queue();

$SIG{INT} = "cleanup";

#print "set callback, wrong argument type (should fail)\n";
#$q->set_callback("blah");

print "setting callback\n";
$q->set_callback(\&cb);

print "creating queue\n";
$q->fast_open(0, AF_INET);

print "trying to run\n";
$q->try_run();

Die Datei jetzt noch per

Code:
chmod +x sip-date.*

ausführbar machen und dann kann es losgehen.


An dieser Stelle sei noch gesagt, dass es natürlich hilfreich ist, wenn der Linux Rechner auch die richtige Uhrzeit hat, also am Besten vorher noch NTP konfigurieren ;-)

In einem Terminal startet ihr jetzt
Code:
./sip-date.pl
und in einem anderen führt ihr diesen Befehl aus:
Code:
iptables -A FORWARD -s 192.168.x.f/32 -d 192.168.x.z/32 -p udp -m udp --sport 5060 --dport 5060 -j NFQUEUE --queue-num 0
wobei x.f die Fritzbox und x.z das Telefon.


Über
Code:
iptables -vnxL
könnt ihr sehen, ob die Regel aktiv ist und ob Pakete von der Regel erfasst werden. Denkt daran, dass iptables Regeln nach einem Neustart weg sind. Ich verwende iptables-persistent (Google), um die Regeln nach einem Neustart automatisch wiederherzustellen.


Wenn alles richtig eingerichtet ist, solltet ihr nun im Perl-Script Pakete ankommen sehen. Außerdem kann man mit obigen tcpdump Befehl ebenfalls die manipulierten Pakete sehen, die sehen jetzt z.B. so aus:
Code:
fritzbox.tld.sip > phone.tld.sip: SIP, length: 850
    SIP/2.0 200 OK
    Date: Sat, 10 Dec 2016 11:38:38 GMT
    [...]

Wie ihr seht, wird jetzt die Uhrzeit in das Paket eingefügt. Ggf. noch das Telefon einmal durchbooten, dann sollte die Uhrzeit auch dort aktuel sein.


So, das war's. Ich hoffe ich konnte dem einen oder anderen helfen.


Viele Grüße


Die meisten aktuellen Distributionen nutzen systemd. Damit benötigt man die Datei sip-date.sh nicht. Wer das Script per systemd starten möchte, legt einfach eine Datei "/etc/systemd/system/sip-header-rewrite.service" an und kopiert dort folgenden Inhalt rein:
Code:
[Unit]
Description=SIP Header ReWrite
After=network.target

[Service]
Type=simple
ExecStart=/opt/scripts/sip-date.pl
TimeoutSec=5
Restart=always


[Install]
WantedBy=multi-user.target

Mittels
Code:
systemctl enable sip-header-rewrite.service
wird das script dann auch bei jedem Boot-Vorgang automatisch gestartet.

Für Ubuntu(und auch Debian) User wäre noch anzumerken, dass die iptables Regel auch in der Datei /etc/iptables/rules.v4 eingetragen werden kann. Dazu muss allerdings das Paket iptables-persistent installiert sein.
Nach obigen Beispiel einfach die Zeile:
Code:
-A FORWARD -s 192.168.x.f/32 -d 192.168.x.z/32 -p udp -m udp --sport 5060 --dport 5060 -j NFQUEUE --queue-num 0
vor das COMMIT am Ende der Datei eintragen.

Viel Erfolg.
 
Zuletzt bearbeitet von einem Moderator:
@seelenreiter Ja, ich habe einen Pi aufgesetzt, das Routing aktiviert und als Standardgateway im Telefon den Pi eingetragen. Die notwendigen Pakete sind auf dem Pi installiert und wurden auch noch mal verifiziert.
Ich sehe auch den Traffic des Telefons auf dem Pi während der Registrierung (was jetzt scheinbar fehlerfrei funktioniert).

Ich habe das Skript zur Sicherheit noch mal aus deinem Post kopiert und neu erstellt, sowie ausführbar gemacht.

Beim ausführen erhalte ich folgende Meldungen:

Code:
setting callback
creating queue
RuntimeError error during nfq_unbind_pf() at ./sip-date.pl line 95.

Es handelt sich dabei um die folgende Zeile aus dem Skript:

Code:
$q->fast_open(0, AF_INET);

Woran kann es liegen, dass ich diesen Fehler erhalte?
 
Klingt nach einem Softwareproblem auf dem Gateway.

Das Script ist das, was bei mir läuft.
Die IP-Netze wirst du ja richtig gesetzt haben.

In meinem Fall hat die

Fritzbox die 10.0.0.1 (/16)
Gateway 10.0.10.5 und 10.11.0.1
Telefon 10.11.0.11

In der Fritzbox noch die Route 10.11.0.0/16 auf 10.0.10.5

Code:
pi@pi-gateway:~# tcpdump -v udp port 5060

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
   
[...]

16:12:20.434355 IP (tos 0x60, ttl 63, id 56225, offset 0, flags [none], proto UDP (17), length 1196)
    10.11.0.1.sip > 10.0.0.1.sip: SIP, length: 1168
    REGISTER sip:10.0.0.1 SIP/2.0
[...]

16:12:20.462138 IP (tos 0x0, ttl 63, id 46268, offset 0, flags [none], proto UDP (17), length 871)
    10.0.0.1.sip > 10.11.0.11.sip: SIP, length: 843
    SIP/2.0 200 OK
    Date: Sun, 20 Dec 2020 15:12:20 GMT
[...]

Und ja, es ist normal, dass vorher ein paar Mal Unautorized und später ein paar Mal Not found kommen.

Code:
16:37:03.586124 IP (tos 0x0, ttl 64, id 12679, offset 0, flags [none], proto UDP (17), length 426)
    10.0.0.1.sip > 10.11.0.11.sip: SIP, length: 398
    SIP/2.0 401 Unauthorized
[...]

16:12:20.960247 IP (tos 0x0, ttl 63, id 46347, offset 0, flags [none], proto UDP (17), length 359)
    10.0.0.1.sip > 10.11.0.11.sip: SIP, length: 331
    SIP/2.0 404 Not Found
[...]

Eben
 
Hallo zusammen,
ich habe ebenfalls dieses "wundervolle" NTP-Problem mit einem 8961, welches auch noch von der neueren Hardware-Revision ist und somit ein Downgrade auf 9.0.x nicht mehr möglich ist. Aktuell würde es mir reichen, das Datum/Uhrzeit einmalig manuell per SSH-Console zu setzen. Allerdings scheint das Phone keinen der gängigen "date"-Befehle anzunehmen. Ich bekomme immer nur die derzeit falsche Uhrzeit angezeigt. Weiß hier jemand weiter?
Vielleicht noch zur Info, ich komme aktuell nur in den "DEBUG"-Modus, beim User "default" geht mir sofort das SSH-Fenster zu.
EDIT: So wie es aussieht erlaubt Cisco aus Sicherheitsgründen nur noch den "DEBUG"-Modus. Und kann es sein, dass der "date"-Befehl nur anzeigt und nicht wie fälschlicherweise in der Hilfe angegeben auch ändern kann? Sprich die Uhrzeit kann man gar nicht manuell ändern???
Danke!

Ciao Stefan :)
 
Zuletzt bearbeitet:
Hallo zusammen,
auch ich würde gerne .... stehe aber als Linux Anfänger bisher an. Das CP-8961 funktioniert bereits an der Fritzbox, ausser der korrekten Zeit.

apt-get install nfqueue-bindings-perl: gibt es da einen Ersatz, auch cpan findet das Paket nicht mehr (für aktuelles Raspian mit Pi-Hole).

Routing:
Mein Router ist OPNsense und alle IP sind fest. Was muss ich das genau wo machen? Das Gateway des 8961 auf den Pi setzen hat nicht ausgereicht ;-(. tcpdump bleibt still.

Gruss und besten Dank
Pete
 
Nun müsst ihr noch in eurem Router eine spezifische Route für euer Telefon über den Linux Rechner einrichten, also z.B. so:
192.168.x.z via 192.168.x.y


Ich selbst verwende die Fritzbox nicht als Router, daher kann ich nicht mit Gewissheit sagen, ob das funktioniert. Die Konfiguration dafür findet ihr aber unter Heimnetz -> Heimnetzübersicht -> Netzwerkeinstellungen -> IPv4 Routen.
Funktioniert das eigentlich mit der Fritzbox?
Und falls nicht, wie dann? Bei mir ist die Fritzbox der Router.
 
[Edit Novize: Überflüssiges Fullquote des Beitrag direkt darüber gelöscht - siehe Forumsregeln]
Ja, das geht mit der Fritzbox.
dort kannst du eine Route für ein "anderes" Netzwerk auf die IP der Linux Büchse (Raspberry) eintragen.

Wer das "andere" Netz anspricht, schickt es an die Fritzbox und die weiß dann, dass sie das dann an das Gateway weiterleiten muss.
 
Zuletzt bearbeitet von einem Moderator:
Die 192.168.x.y sind private IP-Adressen und dürfen auch im Forum komplett und ohne "Tarnbuchstaben" angegeben werden.
Meine FRITZ!Box hat die 192.168.178.1, der PiHole-RasPi bei mir hört auf die 192.168.178.19.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.