Wenn der posi schonmal ein HOWTO schreibt, kann das nicht so trivial. Diesmal geht es darum, sich mit seinem Asterisk-Server in seinen Sipgate-Account einzuwählen. Besonderheit hierbei ist, dass der Server hinter einer Firewall mit NAT steht. Bekannter Weise, ist die SIP und NAT eher fragwürdig.
Um das Szenario nicht unnötig fummelig zu gestalten und auf die eingeschränkten Möglichkeiten von Routern für Heimanwender angewiesen zu sein, greife generell auf Iptables zurück. Nicht gerade schnell, kann aber alles. Wie Asterisk installiert wird, könnt ihr im Buch Asterisk 1.4 nachlesen. Kommen wir zur eigentlichen Asterisk-Konfiguration.
Folgendes muss in der sip.conf stehen:
[general] context=general realm=posinet.de disallow=all allow=alaw,ulaw allowguest=no bindport=5060 register => <sipgate-id>:<password>@sipgate.de/<sipgate-id> localnet=192.168.0.0/255.255.0.0 canreinvite=no externhost=exemple.dyndns.org externrefresh=300 nat=no defaultexpiry=586 language=de jbenable = yes jbforce = yes jbmaxsize = 200 ;sipgate [sipgate.de] type=friend secret=<password> insecure=invite username=<sipgate-id> fromuser=<sipgate-id> context=sipgate fromdomain=sipgate.de host=sipgate.de qualify=yes dtmfmode=rfc2833 outboundproxy=sipgate.de
Diese Konfiguration weicht von der von Sipgate vorgeschlagenen Konfiguration vor allem in folgenden Punkten ab:
- externhost=exemple.dyndns.org ;Da ihr hinter einer Firewall sitzt, müsst ihr eure öffentlich IP ermitteln, sonst registriert Sipdate die lokale IP des Servers als Client. Das ist natürlich grober Unsinn. Am einfachsten lässt sich das mis einem Namen bei einem DynDNS-Provider bewerkstelligen.
- defaultexpiry=586 ;Eigentlich solltte diese Angabe überflüssig sein. Ich bekam allerdings ohne defaultexpiry bei der Reregistration einen Timeout. Den Wert 586 hab ich aus dem Debug-Log gefischt. Er scheint praktikabel zu sein.
- nat=no ;Wie jetzt? Genau deshalb Iptables. Dann kann ich den Router so konfigurieren, dass das NAT keinem auffällt und hässliche Effekte mit sich bringt.
Damit es auch klingelt, noch die extension.conf anpassen:
[sipgate] exten => <sipgate-id>,1,Dial(<Nebenstelle) exten => <sipgate-id>,n,Hangup() ;zum Anrufen exten => _X.,1,Set(CALLERID(num)=<sipgate-id>) exten => _X.,2,Dial(SIP/sipgate/${EXTEN},30,trg) exten => _X.,3,Hangup()
So, nun kommen wir zum spannenden Teil der Aufgabe. Sip ist eigentlich nur das Management-Protokoll, die eigentlichen Sprachedaten werden per RTP übertragen. Um nicht alle Ports dieser Welt freigeben zu müssen, sollte man die Quellports, die Asterisk nutzen kann, in der rtp.conf mit rtpstart=9000 und rtpend=9020 eingrenzen. Nun können wie Firewall-Regeln angelegt werden.
# SIP und RTP freigeben iptables -A FORWARD -p udp --dport 5060 -j ACCEPT iptables -A FORWARD -p udp --dport 9000:9020 -j ACCEPT iptables -A FORWARD -p udp -s $IP_DES_ASTERISK --sport 9000:9020 -j ACCEPT #Portweiterleitung zum Asterisk iptables -t nat -A PREROUTING -p udp -dport 5060 -j DNAT --to-destination $IP_DES_ASTERISK iptables -t nat -A PREROUTING -p udp -dport 9000:9020 -j DNAT --to-destination $IP_DES_ASTERISK
Jetzt kommt der Teil, der mit Router für den Heimgebrauch unmöglich oder nur über Umwege erreichbar ist. Um zu verhinder, das Iptables die Quellpots beim Masquerade umschreibt, was den per SIP ausgehandelten Ports widersprechen würde, müssen die Pakete mit SNAT explizit umgeschrieben. Wichtig ist, dass diese Regeln vor der Masquerade-Regel stehen. Denn bei Iptables gilt, dass die erste passende Regel einer Filterkette zieht. Folgende Regel müssen noch angelegt werden:
iptable -t nat -A POSTROUTING -p udp -s $IP_DES_ASTERISK -sport 5060 -j DNAT --to-source $PUBLIC_IP iptable -t nat -A POSTROUTING -p udp -s $IP_DES_ASTERISK -sport 9000:9020 -j DNAT --to-source $PUBLIC_IP
Damit sollte euer Asterisk auch schon mit Sipgate laufen.
Comments powered by CComment