Asterisk verwendet die falschen Variablen aus sip.conf

Asterisk verwendet die falschen Variablen aus sip.conf

Ich habe dieses Tutorial absolviert, um mit Asterisk sichere Anrufe zu tätigen.

Tutorial zu sicherem Telefonieren | Asterisk-Projekt-Wiki

Ich verwende Asterisk Version 13.19.2 auf Ubuntu Version 16 (Debian) und sobald ich TLS und SRTP hinzugefügt habe, traten Probleme auf.

Lesen Sie dies nur, wenn Sie Asterisk installieren möchten!Dies sind nur meine Notizen für den Fall, dass Sie Asterisk mit TLS- und SRTP-Unterstützung installieren möchten, um sichere Anrufe zu tätigen.Die eigentliche Frage steht ganz unten!


  1. Installieren Sie Asterisk 13.19.2 mit libsrtp und SRTP:

{

# (1) make sure everything is up to date again
apt-get update
apt-get upgrade

# (2) Install dependencies that will be needed in order to install asterisk pjproject etc...
apt-get install aptitude -y
aptitude install build-essential -y
aptitude install git -y
aptitude install libssl-dev -y
aptitude install zlib1g-dev -y
aptitude install openssl  -y
aptitude install libxml2-dev -y
aptitude install libncurses5-dev -y
aptitude install uuid-dev -y
aptitude install sqlite3 -y
aptitude install libsqlite3-dev -y
aptitude install pkg-config -y
aptitude install libjansson-dev -y

# (3) make sure everything is up to date again
apt-get update
apt-get upgrade

# (4) Install libsrtp  (library used to encrypt rtp)
cd /root    
wget https://github.com/cisco/libsrtp/archive/v1.6.0.tar.gz
tar -xzf v1.6.0.tar.gz
cd libsrtp-1.6.0

./configure CFLAGS=-fPIC --prefix=/usr
make
make runtest
make install
cd ..

# (5) install pjproject 

git clone https://github.com/asterisk/pjproject pjproject
cd pjproject
 ./configure --prefix=/usr --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr --with-external-srtp
make dep
make

make install
cd ..


# (6) Install Asterisk  WITH SRTP AND PJPROJECT

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
tar xvf asterisk-13-current.tar.gz
cd  asterisk-13.19.2
./configure --with-pjproject --with-ssl --with-srtp

make
make install
make samples
make config
  1. Generieren Sie die Schlüssel (Zertifikate). Sie können diese auch bei einer Zertifizierungsstelle erwerben.

    # GENERATE KEYS

    # make a place for our keys mkdir /etc/asterisk/keys

    cd /root/asterisk-13.19.2/contrib/scripts

    ./ast_tls_cert -C my_company.com -O "my_company" -d /etc/asterisk/keys

    # TODO later generate keys for clients (ip phones). This part is explained on first tutorial link and is not relevant to this question

  2. Erstellen Sie sip.conf und extensions.conf

sip.conf:

[general]
  tcpenable=yes
  udpenable=yes
  udpbindaddr=0.0.0.0
  tcpbindaddr=0.0.0.0

  ; allow tls !
  tlsenable=yes
  tlsbindaddr=0.0.0.0:5868 ; <------------------------ note I am changing the default port 6061 to 5868
  tlscertfile=/etc/asterisk/keys/asterisk.pem ; key generated on step 2
  tlscafile=/etc/asterisk/keys/ca.crt ; certificate generated on step 2
  tlscipher=ALL
  tlsclientmethod=tlsv1
  encryption=yes
  tlsdontverifyserver=yes ; trust ublux more than godaddy!

  videosupport=yes
  nat=force_rport,comedia


; shared configuration used for ip phones
[base-config](!)
  type=peer
  ;type=friend
  disallow=all
  allow=ulaw,h264,vp8
  context=common ;<------------------ context used on extensions.conf
  dtmfmode=auto
  insecure=port,invite
  canreinvite=no
  host=dynamic
  directmedia=no
  registertrying=yes
  qualify=yes; monitof peer in order to know if its connected
  transport=tls ; Only allow secure transport!
  encryption=yes
  icesupport=yes
  dtlsenabled=yes
  dtlsverify=no

Peers auf sip.conf

; peer 1
[101](base-config)
  secret=password123
  setvar=ID=Tono 
  setvar=Foo=test101 

; peer 2
[102](base-config)
  secret=password123
  setvar=ID=Monir
  setvar=Foo=test102 

Erweiterungen.conf

[general]
  static=yes
  writeprotect=no

[common]    
  exten => 101,1,NoOp(Calling 101)
  same => n,NoOp(Foo = ${Foo} )
  same => n,Dial(SIP/101)
  same => n,Hangup()

  exten => 102,1,NoOp(Calling 102)
  same => n,NoOp(Foo = ${Foo} )
  same => n,Dial(SIP/102)
  same => n,Hangup()

Wie dem auch sei, hier ist die Frage:

Nach der Durchführung dieser Schritte kann ich Anrufe tätigen, Anrufe empfangenaber etwas sehr Seltsames passiert! Asterisk verwendet die falschen Variablen. Wenn ich beispielsweise vom Telefon aus anrufe, wählt 101Asterisk 102die Variablen vom Peer aus 102!Beachten Sie, dass dies nur passiert, wenn die beiden Telefone dieselbe IP-Adresse haben, da sie sich hinter einem NAT befinden.

Hier ist der Beweis:

ubuntu*CLI> sip show peers
Name/username             Host                                    Dyn 
Forcerport Comedia    ACL Port     Status      Description
101                   170.55.7.131                             D  Yes        Yes            50178    Unmonitored
102                   170.55.7.131                             D  Yes        Yes            50137    Unmonitored
103                   170.55.7.132                             D  Yes        Yes            50212    Unmonitored

Die Peers 101 und 102 zeigen dieselbe IP-Adresse, da sie sich hinter demselben Router befinden. Mit anderen Worten: 170.55.7.131 ist eine öffentliche IP. Wenn sie eine andere öffentliche IP-Adresse hätten, passiert dies nicht. Mit anderen Worten: Dies passiert aus irgendeinem seltsamen Grund nicht zwischen den Nebenstellen 101 und 103.

Wenn ich von 101 nach 102 anrufe, zeigt das Asterisk-Protokoll Folgendes an: (korrekt)

Executing [102@common:1] NoOp("SIP/101-00000095", "Calling 102") in new stack
Executing [102@common:2] NoOp("SIP/101-00000095", "Foo = test101 ") in new stack
Executing [102@common:3] Dial("SIP/101-00000095", "SIP/102") in new stack
Using SIP VIDEO CoS mark 6
 ....

Wenn ich von 102 nach 101 anrufe, zeigt das Asterisk-Protokoll Folgendes an!!: (falsch)

Executing [101@common:1] NoOp("SIP/101-00000097", "Calling 101") in new stack
Executing [101@common:2] NoOp("SIP/101-00000097", "Foo = test101 ") in new stack
Executing [101@common:3] Dial("SIP/101-00000097", "SIP/101") in new stack

warum ist Foo=, test101es sollte gleich test102!!! sein, auch die Kanalvariable 101-00000097enthält, 101es sollte 102-00000097daran liegen, dass das Telefon 102den Anruf initiiert hat!

Wenn ich den Asterisk-Dienst neu starte und denselben Anruf von 102 an 101 tätige, zeigt Asterisk Folgendes an:

Executing [101@common:1] NoOp("SIP/102-00000002", "Calling 101") in new stack
Executing [101@common:2] NoOp("SIP/102-00000002", "Foo = test102 ") in new stack
Executing [101@common:3] Dial("SIP/102-00000002", "SIP/101") in new stack

Jetzt ist es richtig. Ordnet Asterisk die Variablen der IP-Adresse zu?????


Temporäre Lösungen, die dieses Problem beheben:

  1. Aus irgendeinem Grund passiert das nicht, wenn ich das Telefon an einem anderen Ort aufstelle, wo es eine andere IP-Adresse hat. Dieses Problem tritt nur auf, wenn sich beide Telefone im selben Netzwerk befinden und dieselbe öffentliche IP-Adresse haben. Das ergibt für mich keinen Sinn, da das NAT unterschiedliche interne Ports zuweist.

  2. Wenn ich die Sicherheit (TLS) entferne und UDP oder TCP als Transportmethoden verwende, tritt dieses Problem nicht mehr auf.

Antwort1

Nach einem ganzen Tag habe ich endlich die Lösung gefunden. Das passiert, wenn man die Konfiguration aus dem Internet kopiert!

Das Problem war, dass ich in meiner sip.conf

insecure=port,invite

eine Google-Suche nach insecure=port ergibt:

insecure=port ; Erlaubt die Zuordnung des Peers per IP-Adresse ohne entsprechende Portnummer

Das erklärt, warum der Port ignoriert wurde. Die Lösung bestand also darin, zwei Änderungen an meiner sip.conf vorzunehmen:

  1. Gewechselt insecure=port,invitezuinsecure=invite

  2. Gewechselt type=peerzutype=friend

verwandte Informationen