5504 links
  • GuiGui's Show

  • Home
  • Login
  • RSS Feed
  • Tag cloud
  • Picture wall
  • Daily
Links per page: 20 50 100
page 1 / 1
9 results for Asterisk
  • Socle Interministériel de Logiciels Libres - Liens en vrac de sebsauvage - GuiGui's Show - ~ sweet ~

    Ce qui me fait dire que c'est de l'intox, c'est que je le vois revenir avec l'argument du : "si ça se paye pas, ça tue le business". C'est tendancieux et généralement faux, non ?
    Malgré de bonnes solutions libres (et souvent gratuites), je ne vois pas de domaine ou le business ne peux plus jouer le game. Au contraire même peut-être. (c'est un ressenti j'ai pas fait d'étude de marché lol).

    Je ne discuterai pas des non arguments "pas sûr, pas pro", etc. : ils ont été démontés trouzemille fois.
    Considérer que libre = gratuit, c'est partir sur de mauvaises bases, de toute façon. J'essaye de financer mes logiciels libres, même si c'est souvent impossible pour les petits logiciels qui n'ont pas de mécanismes de collecte de fonds et pour les logiciels piliers / cachés (FreeBSD / PF pour PFSense, par exemple. Le fait de payer une prestation + licence PFSense ne fait pas automatiquement remonter du pognon à FreeBSD -> il faut demander / faire pression sur la société commerciale éditrice de PFSense pour qu'elle le fasse systématiquement). J'essaye que mon employeur en fasse autant : BIRD, Proxmox, OpenVPN, PFSense, Asterisk, etc. tu peux acheter du support ou des licences à la société commerciale éditrice. Donc, oui, le libre, ça rogne potentiellement des parts de marchés aux autres solutions, mais comme autre tout produit ou service, libre ou non, quoi, ça n'empêche pas le business. Ça vit de modèles économiques différents (don, vente de support / prestations intellectuelles, mutualisation par la demande, licences, fonctionnalités supplémentaires, etc.). Donc, là encore, ce n'est pas le sujet, et encore moins pour les salariés puisque l'argent ne sortira pas de leur poche.


    ça n'a pas tardé avant d'avoir des demandes auprès des managers... sans réponses. (alors qu'on nous casse les couilles toute l'année pour "se former"). Faut se former mais faut pas que ça coûte, surtout en temps, la ressource qui vaut plus cher que ton petit cul de travailleur. Bref, nos managers ne se mettent pas au niveau qu'il nous impose (comment les respecter à terme ?)...

    J'ai aussi entendu ça : "il faut se former afin de continuer à produire de la valeur qui sera captée par l'employeur, mais ça serait bien de ne pas s'absenter pour autant parce que sinon la société commerciale perd du fric". Tu le sens, le bel avenir des MOOC et autres formations continues à distance que tu pourras faire en dehors du temps de travail ? :))))


    Je rejoins le râlage de seb (ou de Framasoft, April, LQDN, ...) sur la priorité : que les pouvoirs publics ne soient pas sur ce registre affectif, certains fonctionnaires ont une responsabilité pour proposer de nouvelles solutions et ils doivent avoir les moyens en conséquences ! Le discours officiel est aussi une priorité : valoriser équitablement les solutions et LAISSER UNE MARGE aux utilisateurs.

    Personnellement, je préfère m'attaquer aux serveurs de la fonction publique et à leurs logiciels : il y a énormément plus de données personnelles et d'intelligence de ce côté-là que sur le PC de Ginette qui, soit se connecte aux logiciels distants, soit saisit des documents qui seront par nature publics (compte-rendu du Conseil d'Administration, acte de nomination, etc.). En situation de sous-effectif voulu (on dégrade le service en privant de ressources ceux qui le font tourner -> le citoyen râle -> on impose l'externalisation en expliquant que ça va résoudre tous les problèmes), ça me semble plus pertinent de prioriser cet aspect-là. Laisser une marge, ça consiste aussi à ne pas râler en permanence, à ne pas vouloir imposer le libre dans le public (ce qui était la position de l'April sur la loi pour une République numérique), et à accepter qu'un utilisateur te dise "je ne veux pas de ta merde, même si c'est dans le référentiel bidule du ministère machin".

    Fri May 8 13:30:47 2020 - permalink -
    - https://dukeart.netlib.re/shaarli/?2W2i7Q
  • Le lulz de la VOIP - Tome 8 : softphones et VPN partiel / split tunnel

    Résumé : les logiciels de téléphonie indiquent souvent une mauvaise adresse IP à leur interlocuteur, surtout quand ils sont utilisés avec un VPN partiel / split tunnel / VPN sans route par défaut. Les VPN peuvent bricoler les paquets SIP contre la volonté de l'administrateur systèmes et réseaux. La fonctionnalité d'apprentissage RTP du commutateur téléphonique Asterisk est plutôt chatouilleuse aux interférences. Certaines versions de logiciels de téléphonie résistent plus ou moins bien aux magouilles d'un VPN. Pour toutes ces raisons, si tu dois fournir de la téléphonie d'entreprise à des personnels en télétravail et que ça foire de manière aléatoire, ajoute les lignes nat=force_rport,comedia et directmedia=no dans la définition de chaque ligne SIP dans le fichier sip.conf d'Asterisk ou dans les paramètres (paramètres avancés pour « directmedia ») d'une ligne SIP dans XiVo. La première réécrit l'adresse IP contenue dans le paquet SIP/SDP avec l'adresse IP source de ce paquet, garantissant ainsi que l'IP est la bonne. La deuxième fait circuler les flux audio via le commutateur téléphonique plutôt qu'en pair-à-pair, ce qui évite les ratés de l'apprentissage RTP, les bidouilles d'un VPN et la sensibilité des softphones.


    Présentation

    Rappel sur le fonctionnement de la téléphonie sur Internet. D'un côté, il y a la signalisation (je veux appeler untel, il a décroché, il met en attente, il reprend l'appel, etc.) avec le protocole SIP. Cet échange se fait via un commutateur téléphonique. La voix transite via le protocole RTP (et son protocole de contrôle RTCP). Il y a un flux audio par interlocuteur. Les flux audio sont échangés en pair-à-pair, sans passer par le commutateur téléphonique. L'adresse IP, le port UDP ("envoie ton flux RTP ici") et les codecs à utiliser sont négociés via le protocole SDP lui-même relayé par SIP, donc via le commutateur.

    J'ai déjà exposé notre architecture de téléphonie. Notre commutateur téléphonique est donc un Asterisk empaqueté dans produit avec interface web, API, etc. nommé XiVo. On dira qu'il a l'adresse IP 192.0.2.1 avec une seule route par défaut vers le routeur global de notre organisation. Nous avons des téléphones IP de la marque SNOM. Ils sont dans le réseau 198.51.100.0/24. Il y a donc du routage / du niveau 3 entre nos téléphones et le commutateur téléphonique. Nous avons également quelques rares softphones / logiciels de téléphonie Linphone (choisi car un des seuls logiciels libres encore maintenus + interface agréable depuis la version 4.X). On utilise ça depuis des années sans problème.

    Depuis environ six mois, nous avons quelques logiciels de téléphonie utilisés depuis l'extérieur (mise en place progressive du télétravail) à travers un VPN, car notre XiVo n'est pas joignable depuis l'extérieur (filtrage volontaire). Il s'agit d'un VPN partiel / split tunnel : il ne donne pas accès à Internet, seulement aux réseaux internes de l'organisation. Il n'installe donc pas une route par défaut sur le client, mais une route pour chacun de nos réseaux internes. Tous les clients sont dans un même réseau, disons 203.0.113.0/24. Notre VPN ne fait ni filtrage ni NAT. Donc, le commutateur téléphonique voit l'IP VPN d'un client. Exemple : « Registered SIP 'bczhcigi' at 203.0.113.42:62633 ». 203.0.113.42 est bien l'IP que le client VPN a sur son interface réseau VPN. Nos clients VPN peuvent se parler entre eux : un netcat TCP et UDP entre deux clients VPN fonctionne. Notre VPN est un Cisco ASA. Ces personnels en télétravail ne nous ont pas signalé de problème.

    Avec le Covid-19, il a fallu généraliser le télétravail, donc fournir une ligne de téléphone et un logiciel de téléphonie à chaque personnel. Et là ça ne fonctionne plus. Enfin, si, mais pas pour tout le monde ni tout le temps ! On est donc sur un problème aléatoire, les plus chiants à diagnostiquer…


    Notes générales

    • Ci-dessous, je vais essentiellement parler du logiciel de téléphonie Linphone, car c'est celui qu'on a sélectionné en amont des problèmes que je vais décrire, mais nous avons aussi essayé Jitsi, Zoiper, Blink, microSIP et d'autres, et les problèmes décrits ci-dessous se produisent aussi avec ces logiciels ;

    • Pour conduire nos diagnostics, nous avons désactivé les éventuels pare-feux sur les ordinateurs de télétravail, que ce soit Netfilter Linux ou le pare-feu winwin.


    Problème numéro 1

    Entre un poste téléphonique SNOM du bureau (ou un numéro externe 0[1-9]) et un Linphone à domicile, l'appel a lieu mais la personne à domicile entend rien. Entre deux Linphones, chacun dans un domicile différent, personne s'entend.

    Ça, c'est le signe classique d'un filtrage ou d'un NAT. Mais, comme écrit ci-dessus, notre VPN ne NAT pas et il ne filtre pas. Il n'y a pas d'autres filtrages en interne. Il n'y a pas de filtrage aux extrémités puisqu'on a désactivé les pare-feux.

    Si l'on effectue une capture réseau avec tcpdump (sur le commutateur téléphonique) et wireshark (sur l'ordinateur de télétravail), on constate que, dans la négociation SDP, Linphone ne communique pas l'adresse IP de l'interface réseau VPN (vpn0, disons), mais celle de l'interface eth0 (ou wlan0), c'est-à-dire celle sur le réseau local du domicile du personnel (genre 192.168.0.X). Forcément, l'interlocuteur ne peut pas émettre un flux audio vers cette destination.

    Parfois, Linphone communique la """"bonne"""" adresse IP, celle de l'interface réseau VPN, et dans ce cas-là, tout fonctionne. Cela peut, en partie, expliquer pourquoi nos personnels en télétravail depuis six mois ont rien signalé.

    On pourrait penser qu'il suffit de lancer Linphone après avoir établi le VPN, mais non, car, parfois, Linphone échoue même quand il a été démarré après l'établissement du VPN. De plus, on ne peut pas attendre de nos personnels qu'ils se préoccupent de lancer tel logiciel après tel autre.

    On peut configurer Linphone pour forcer la communication de l'adresse IP de l'interface réseau VPN. C'est l'option « nat gateway ». Les appels fonctionnent alors dans 100 % des cas. Mais cette option a disparu dans la version 4.X, celle que l'on utilise (parce que son interface est agréable). De toute façon, tous les logiciels qui permettent de configurer l'adresse IP (microSIP, Linphone, etc.) ne conviennent pas : sur notre VPN, nous distribuons des IPs de manière dynamique : à chaque connexion, l'adresse IP du client VPN change. On ne peut pas demander à nos personnels de configurer leur téléphone à chaque fois.

    On notera que, dans le cadre de webRTC, les navigateurs web sont mieux équipés que les logiciels de téléphonie ! Dans la config' avancée de Firefox, la clé « media.peerconnection.ice.force_interface » permet de sélectionner l'interface à utiliser, par exemple. Donc ça fonctionnerait impec avec les IP dynamiques de notre VPN. Ça a aussi ses inconvénients : quelqu'un qui voudrait faire de la téléphonie professionnelle (supposons avec VPN) et personnelle (sans VPN) devrait en changer la valeur en permanence…

    On peut utiliser ICE, une méthode qui consiste à échanger tous les couples IP+port possibles lors de la négociation SDP et à les tester un par un. J'ai activé ICE dans Linphone et sur le commutateur (même si ça a aucun sens puisqu'il a une seule adresse IP) : ça ne fonctionne pas. D'après mes connaissances, c'est très curieux, mais c'est ainsi.

    On peut utiliser STUN, un serveur qui se contente de répondre "voici l'adresse IP source du paquet IP avec lequel tu viens de me causer". On ne peut pas utiliser l'un des serveurs STUN public, car il retournerait l'adresse IP publique de la box Internet du personnel. En revanche, si l'on installe un serveur STUN en interne, la communication avec ce serveur sera contrainte, par le routage, de passer par le VPN. Donc l'adresse IP retournée sera toujours celle de l'interface réseau VPN.

    Je ne veux pas trop toucher à notre commutateur téléphonique afin de rien casser (surtout qu'avec le confinement, on ne reviendra pas au bureau avant longtemps, donc on ne saura pas que l'on a cassé l'existant). De plus, nous avons un contrat d'assistance (support) et de maintenance pour notre commutateur et on n'a pas envie de l'invalider avec des modifications trop conséquentes. Pour installer un serveur STUN, j'ai utilisé le logiciel coturn. Avec Debian GNU/Linux, un simple sudo apt-get install coturn ; sudo systemctl start coturn suffit.

    STUN fonctionne parfaitement. Mais il y a des limites.

    • Parfois, ça cesse de fonctionner. Linphone émet bien une requête STUN, obtient bien une réponse dans les temps… mais ne l'utilise pas lors de la négociation SDP. Il faut le redémarrer, plusieurs fois, et encore, ça ne suffit pas toujours. Il semblerait que la prise en charge de STUN par Linphone échoue quand une adresse IPv6 est configurée sur l'une des interfaces de la machine, mais c'est une hypothèse ;

    • Tous les logiciels de téléphonie ne permettent pas de configurer explicitement un serveur STUN (Jitsi, par exemple), donc la pérennité de cette solution est remise en question (qui dit que Linphone ne va pas retirer cette possibilité ?) et l'on dépend d'un logiciel ;

    • Ce n'est pas configurable partout car l'usage exclusif de STUN est déconseillé ;

    • Un serveur STUN est une brique de plus à superviser et à maintenir afin d'assurer le service de téléphonie.

    Une meilleure solution est de demander au commutateur téléphonique, Asterisk, de réécrire l'adresse IP contenue dans les messages SDP avec l'adresse IP source des paquets IP (on est sûr qu'il s'agit de celle de l'interface réseau VPN car elle a été choisie par le système d'exploitation en fonction de l'interface de sortie).

    Avec Asterisk, cela se fait en ajoutant une ligne nat=force_rport,comedia pour chaque ligne téléphonique de télétravail dans le fichier sip.conf. Dans XiVo, cela se fait dans l'onglet « Général » de chaque ligne de télétravail (note : XiVo recharge automatiquement la configuration d'Asterisk quand on modifie une ligne ;) ). On peut aussi appliquer cette option sur l'ensemble du parc, mais je ne le fais pas pour les raisons sus-mentionnées : ne pas casser l'existant et ne pas invalider notre contrat d'assistance / maintenance.


    Problème numéro 2

    Des personnels continuent de ne pas entendre leur interlocuteur. wireshark / tcpdump montre des messages SDP parfaitement valables qui contiennent la """"bonne IP"""" de l'interlocuteur (celle sur l'interface réseau VPN, donc). Si l'on regarde, il y a le début de l'appel (SIP INVITE, SIP TRYING, SIP RINGING, SIP ACK, etc.) puis un premier message SDP est émit par le commutateur téléphonique contenant son adresse IP, donc Linphone émet un flux audio RTP à destination du commutateur puis il reçoit le SDP émis par l'interlocuteur (et réécrite par le commutateur, voir chapitre précédent). Il cesse alors d'émettre le flux RTP. Pourquoi Linphone ne respecte-t-il pas la dernière négociation SDP ?

    Je précise que changer la destination des flux RTP en cours de route est parfaitement normal. C'est comme ça que fonctionne la mise en attente ou le fait de se rendre muet : en renégociant en SDP.

    Activons le journal de Linphone. Menu -> « Préférences » -> « Avancé » -> « Logs activés ». Le dossier qui contiendra le journal peut également être consulté / changé.

    Lisons ce journal. Linphone reçoit bien le dernier SDP, l'analyse et le consigne : « Change audio stream destination: RTP=203.0.113.1:7078 RTCP=203.0.113.1:7079 ». L'adresse IP est la """"bonne"""". Pourquoi Linphone l'ignore-t-il ? Je n'aurai pas la réponse.



    Dans le journal du commutateur, Asterisk, je remarque qu'à chaque fois que le problème constaté côté Linphone survient, l'apprentissage RTP ne va pas à son terme. L'apprentissage RTP ou RTP learning ou RTP autolearning est une tambouille interne d'Asterisk qui fait un peu de la magie dans le but d'identifier la """"bonne"""" IP à utiliser.

    Quand tout fonctionne bien, le journal consigne une ligne « Strict RTP learning after remote address set to 203.0.113.1:7078 » pour chaque IP de chaque interlocuteur puis une unique ligne « Strict RTP learning complete - Locking on source address 203.0.113.1:7078 » pour chaque interlocuteur.

    Quand l'un des interlocuteurs ne s'entend pas et qu'un Linphone n'émet plus de flux RTP en contradiction avec le dernier SDP, je remarque que, soit il n'y a pas de « Strict RTP learning complete […] », juste des « Strict RTP learning after remote address set […] » pour chaque interlocuteur, soit il y a un seul « Complete », pour un seul des interlocuteurs.

    Pourquoi l'apprentissage RTP d'Asterisk échoue-t-il ? Comment le désactiver afin d'être sûr qu'il est bien l'origine du problème ? Aucune idée.



    Quand les deux interlocuteurs s'entendent, il est possible qui cela coupe après 32 ou 36 secondes de communication. Cela dépend de qui téléphone. Si A téléphone à B, ça peut couper alors que ça ne coupera pas si c'est B qui téléphone à A. Ce point est constant : c'est toujours dans le même sens que cela foire. Cela semble dépendre de la version de Linphone. Si une 4.1.1 téléphone à une 3.11 / 3.12, alors ça coupera. Pas l'inverse.

    Avec wireshark, on voit un message SIP BYE avec un entête « X-Asterisk-HangupCause: no user responding » destiné au Linphone 3.X. Dans le journal d'Asterisk, on lit « Packet timed out after 32000ms with no response ».

    Ajouter session-timers=refuse dans la définition d'une ligne téléphonique dans sip.conf ou dans l'onglet « Avancé » des paramètres d'une ligne téléphonique dans XiVo, n'aide pas.



    Qui peut bien être responsable de tout ce qui précède ? Le seul qu'on n'a pas encore remis en cause est le VPN ASA.

    Dès le début du diagnostic, nous avons désactivé son ALG (« no inspect sip ») et constaté que les timeouts UDP et SIP étaient déjà de plusieurs minutes. Pour savoir ce qu'est un ALG et les emmerdes pratiques que cela pose parfois, je te renvoie vers cet article : Le lulz de la VOIP - Tome 3 : Numericable.

    Dans un coin, j'ai un PFSense (routeur, pare-feu, VPN, etc. en logiciel libre pour lequel on peut acheter des appliances, de la prestation d'intégration, de l'assistance, etc.) de test avec un OpenVPN de test déjà configuré. Niveau 3 (TUN). Tous les clients dans un même réseau /24. Aucun filtrage. Pas de NAT. Il a donc la même architecture que notre VPN ASA.

    Je décide de tester. Ça fonctionne moyen. D'un côté, certains couples de testeurs qui ne s'entendaient pas s'entendent, ce qui est un gain. De l'autre côté, la coupure après 32 / 36 secondes d'appel en fonction des clients demeure. De même, le RTP autolearning d'Asterisk continue de foirer quelques fois. Mais, quand ça arrive, la communication pair-à-paire fonctionne systématiquement.

    Du coup, le VPN ASA est en cause sur l'un des trois problèmes (communication pair-à-pair dysfonctionnelle). Néanmoins, ce n'est pas lui qui fait parfois échouer le RTP autolearn ni qui provoque une coupure après 32 / 36 secondes d'appel.



    Ne sachant pas désactiver le RTP autolearn d'Asterisk, j'ai décidé de faire transiter les flux audio par le commutateur téléphonique. Ainsi, le résultat de l'apprentissage RTP aura peu d'importance, donc il n'y aura pas de bascule vers une communication pair-à-pair qui pose parfois problème avec notre VPN Cisco ASA.

    Pour ce faire, il faut ajouter une ligne directmedia=no dans la définition de chaque ligne SIP de télétravail dans le fichier sip.conf d'Asterisk ou dans l'onglet « Avancé » d'une ligne téléphonique dans XiVo. Comme le reste, on peut activer ça pour tous les clients SIP, mais on ne le veut pas afin de ne pas détraquer le reste du parc qui fonctionne très bien et de ne pas rendre caduc notre contrat d'assistance / maintenance.

    Ça fonctionne parfaitement. Tous les appels aboutissent. Aucun se termine après 32 / 36 secondes.

    VICTOIRE \o/

    Si tu ne veux pas charger ton commutateur téléphonique (d'après les pros de FRnOG, c'est relatif, c'est """"juste"""" de la copie de paquets RTP ) tout en obtenant le même résultat, tu peux le décharger en faisant transiter tes flux audio via un serveur TURN interne.


    Conclusion

    Que retenir de tout ça ?

    • Les softphones / logiciels de téléphonie indiquent n'importe laquelle de leur adresse IP dans la négociation SDP et souvent pas celle d'un VPN partiel / split tunnel / VPN sans route par défaut. Il y a parfois aucune constance dans le choix ;

    • La fonctionnalité magique RTP autolearn d'Asterisk est chatouilleuse. Même sans filtrage ni NAT et avec un VPN décent (OpenVPN), elle peut foirer et faire basculer une conversation en pair-à-pair (ce qui en soi n'est pas un problème sauf si des perturbateurs sont à l'œuvre sur le réseau, voir point suivant) ;

    • Un VPN Cisco ASA en niveau 3 avec lequel on ne fait ni filtrage ni NAT et sur lequel on désactive le SIP ALG et l'on configure des timeouts UDP et SIP élevés pose problème. Notamment, lors de la bascule pair-à-pair après échec de l'apprentissage RTP. Ça se produit pour certains clients, sans que j'ai trouvé un discriminant ;

    • Certaines versions de certains logiciels de téléphonie rattrapent des mauvais coups en douce. Exemple : Linphone 4.X gère une bascule sur le mode pair-à-pair quand le RTP learning échoue et qu'un Cisco ASA semble bidouiller le paquet alors que Linphone 3.X ne sait pas faire. De même, Linphone 4.X résiste au phénomène (qui ne peut pas être l'ASA puisque le problème se produit aussi avec un OpenVPN) qui provoque une coupure des appels 32 à 36 secondes après leur début, alors que Linphone 3.X ne sait pas faire ;

    • Il y a quand même des bugs curieux dans les logiciels de téléphonie. La version winwin de Linphone ne peut pas être réduite dans la zone de notification lors d'un appel sinon le son est coupé. La version Android de Linphone utilise parfois les mauvais serveurs DNS récursifs. Linphone 4.1.1 sous winwin ne peut pas être appelé pendant quelques dizaines de secondes après avoir raccroché un appel (même si c'est lui qui raccroche) alors qu'Asterisk voit bien la fin de l'appel. Linphone ignore parfois l'adresse IP obtenue via STUN. Etc. ;

    • La meilleure solution à (presque) tout ça est d'ajouter une ligne nat=force_rport,comedia et une autre ligne directmedia=no dans la définition de chaque ligne SIP dans le fichier sip.conf d'Asterisk ou dans les paramètres (onglet « Avancé » pour directmedia=no) d'une ligne dans XiVo. La première réécrit l'IP contenue dans le paquet SDP avec l'adresse IP source de ce paquet, garantissant ainsi que l'IP transmise à l'interlocuteur est la bonne. La deuxième fait circuler les flux audio via le commutateur téléphonique plutôt qu'en pair-à-pair, ce qui évite les ratés de l'apprentissage RTP, les bidouilles de l'ASA et la sensibilité de certains softphones.


    Conseils

    Lors d'un diagnostic de VoIP, ne prend pas les problèmes un par un, séparément, sinon tu ne vas pas t'en sortir. Si tu commences à noter que telle version de tel logiciel de téléphonie ne fonctionne pas ou que telle version a un comportement différent sous winwin et GNU/Linux ou que tel logiciel fonctionnait et ne fonctionne plus, tu ne vas pas t'en sortir car il y a trop d'éléments variants. Essaye de penser global, de revenir aux bases de la VoIP.

    Soit vigilant à l'environnement de test : un testeur qui lance deux instances du VPN et, vlam, la """"mauvaise"""" IP se retrouve dans le paquet SDP ; un testeur qui ré-active le pare-feu winwin et, pouf, tes conditions de test changent ; un testeur lance un appel entre deux Jitsi sur deux ordinateurs situés dans le même LAN et constate que ça fonctionne très bien… car le flux ne passe pas par le VPN, mais par le LAN, etc.



    Merci aux gens qui fréquentent FRnOG, une liste de discussion entre opérateurs de réseaux / téléphonie, pour leurs coups de main. :)

    Fri Apr 17 18:46:44 2020 - permalink -
    - http://shaarli.guiguishow.info/?7zueag
  • XiVO Solution téléphonie d'entreprise VOIP Open Source / Centre d'appels

    XiVo est une solution de téléphonie complète en logiciel libre (GPL, LGPL) développée en France. Elle est basée sur l'autocommutateur téléphonique Asterisk (je me suis déjà un peu amusé avec). XiVo propose une surcouche comme une interface web bien foutue et des API (pour changer les droits d'appel ‒ appels nationaux, internationaux, vers des numéros surtaxés, etc. ‒, pour changer le nom d'une ligne, etc.).

    XiVo sait faire toute la téléphonie d'entreprise habituelle : appels, interception d'appel, renvoi d'appel (tout ou conditionné), filtrage d'appel (dit patron/secrétaire), files d'attente, messagerie vocale, diffusion d'un message éventuellement conditionné à un calendrier, salon de conférence, etc. Je crois que le seul truc que ça ne fait pas, c'est des rapports de facturation genre agréger la consommation des lignes téléphoniques d'un service afin de faire de la refacturation interne (le service informatique paye l'intégralité de la facture de téléphone et refacture leur consommation aux autres services) et de présenter aux chefs la consommation de leurs sous-fifres sous une forme kikoo-jolie.

    Nous utilisons cette solution depuis 5 ans. Nous avons deux machines virtuelles Debian GNU/Linux + XiVo en failover sur deux sites géographiques pour la partie commutation, deux lignes téléphoniques T2 avec deux passerelles T2<>IP XiVo, des téléphones IP, des téléphones analogiques avec des rocades analogiques et des passerelles analogique<>IP Patton et Realtone, des logiciels de téléphonie (softphones) + XiVo client (qui permet des recherches dans l'annuaire, de voir qui nous appelle, de transférer simplement un appel, etc.), et des saloperies automatiques qui nécessitent une ligne de téléphone (ascenseurs, interphones, etc.) soit un total de 850-900 lignes.

    L'éditeur de XiVo, Avencall, propose des prestations d'intégration et de support pour tout le périmètre sus-cité, une liste de matériels totalement compatibles (genre un téléphone IP avec les touches de fonction ‒ intercepter l'appel d'une autre ligne, par exemple ‒ fonctionnelles, genre des casques audio avec les boutons de fonction ‒ muet, sourd, etc. ‒ fonctionnels) et de la revente de matos (genre des téléphones IP, des cordons de téléphone, etc.). D'autres prestataires / revendeurs existent sur le marché, mais nous avons été déçu par le précédent.

    Merci Seb' d'avoir monté et entretenu tout ça toutes ces années. :)

    Thu Feb 6 20:26:59 2020 - permalink -
    - https://www.xivo.solutions/
  • Au secours, mon log Asterisk déborde !

    Il y a quelques années, j'ai installé et configuré un serveur VOIP Asterisk sans prétention. L'ennui, c'est que des robots essayent en permanence de trouver un couple identifiant+mdp valide dans l'objectif de dénicher des appels nationaux / internationaux. Il suffit ensuite à leur propriétaire de souscrire à une offre de fourniture d'un numéro surtaxé puis de faire téléphoner ses robots au numéro ainsi obtenu afin d'encaisser de l'argent. Asterisk consigne toutes ces tentatives dans un fichier de log… qui grossit et sature notre espace disque (le conteneur LXC qui héberge ce serveur Asterisk est dimensionné pour juste ce qu'il faut).

    Soit on réduit la verbosité d'Asterisk, soit on ajuste la politique de conservation du log Asterisk, soit on filtre les pénibles. Je refuse la première solution, mais j'ai appliqué les deux autres.


    Debian, Asterisk et Logrotate

    La configuration de logrotate fournie par le paquet Debian contenant Asterisk ne compresse pas les logs. Changeons ça :

    • On évite que dpkg nous informe de la modification du fichier et nous demande ce que nous souhaitons faire à chaque mise à jour :

      sudo dpkg-divert --add --rename --divert /etc/logrotate.d/asterisk.dpkg-dist /etc/logrotate.d/asterisk
      sudo cp /etc/logrotate.d/asterisk.dpkg-dist /etc/logrotate.d/asterisk


    • Puis, on active la compression en ajoutant les lignes suivantes dans /etc/logrotate.d/asterisk :

      compress
      delaycompress



    La compression du log Asterisk a résolu mon problème à elle seule : l'espace disque n'est plus jamais saturé. Mais ça n'empêche pas de vouloir dégager les pénibles.


    Filtrer les pénibles

    Fail2ban

    Puisqu'on peut repérer une tentative pour trouver un couple identifiant+mdp depuis le log Asterisk, fail2ban est l'outil idéal : il va analyser ce fichier avec des regex et il bannira temporairement les pénibles avec iptables. Le paquet fail2ban fournit par Debian contient déjà un jeu de règles pour identifier quelques attaques contre un serveur VOIP.

    • Installer fail2ban : sudo apt-get install fail2ban

    • Contrairement à ce qu'expose la documentation de fail2ban, il n'est pas nécessaire d'activer le log de la sécurité (security log) même si l'on a un une version d'Asterisk >= 10. Activer ce log le rend encore plus verbeux ;

    • Activer les règles de filtrage Asterisk de fail2ban en créant un fichier /etc/fail2ban/jail.d/asterisk.conf contenant :

      [asterisk]
      enabled = true


    • Désactiver l'envoi d'un mail à root à chaque fois qu'une IP est bloquée en commentant la ligne %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"] dans la section [asterisk] du fichier /etc/fail2ban/jail.conf :

      sudo dpkg-divert --add --rename --divert /etc/fail2ban/jail.conf.dpkg-dist /etc/fail2ban/jail.conf
      sudo cp /etc/fail2ban/jail.conf.dpkg-dist /etc/fail2ban/jail.conf
      sudo $EDITOR /etc/fail2ban/jail.conf # commenter « %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"] » dans la section « [asterisk] »


    • Désactiver l'envoi d'un mail à root à chaque fois qu'un jeu de règles de filtrage est activé ou désactivé en créant un fichier /etc/fail2ban/action.d/sendmail-common.local contenant :

      [Definition]
      actionstart =
      actionstop =


    • Par défaut, fail2ban insère des règles netfilter qui envoient un message ICMP au robot spammeur bloqué (« -j REJECT »). On peut changer ce comportement :

      sudo dpkg-divert --add --rename --divert /etc/fail2ban/action.d/iptables-common.conf.dpkg-dist /etc/fail2ban/action.d/iptables-common.conf
      sudo cp /etc/fail2ban/action.d/iptables-common.conf.dpkg-dist /etc/fail2ban/action.d/iptables-common.conf
      sudo sed -i -e 's#blocktype = REJECT --reject-with icmp-port-unreachable#blocktype = DROP#' /etc/fail2ban/action.d/iptables-common.conf


    • On peut aussi désactiver le jeu de règles de filtrage pour sshd :

      sudo dpkg-divert --add --rename --divert /etc/fail2ban/jail.d/defaults-debian.conf.dpkg-dist /etc/fail2ban/jail.d/defaults-debian.conf
      sudo cp /etc/fail2ban/jail.d/defaults-debian.conf.dpkg-dist /etc/fail2ban/jail.d/defaults-debian.conf
      sudo sed -i -e 's#enabled = true#enabled = false#' /etc/fail2ban/jail.d/defaults-debian.conf


    • Si l'on veut toucher du doigt la modernitude, on peut activer un filtrage utilisant les ipsets. Dans la section [asterisk] du fichier /etc/fail2ban/jail.conf, on ajoute une ligne : banaction = iptables-ipset-proto4 ;

    • On redémarre fail2ban : sudo systemctl restart fail2ban ;

    • On profite du spectacle : sudo tail -f /var/log/asterisk/messages /var/log/fail2ban.log et sudo iptables -t filter L -n -v (et sudo ipset list f2b-asterisk-udp si l'on a activé l'utilisation des ipset).


    Rate-limiting avec netfilter

    En attendant d'avoir le temps de me pencher sur fail2ban pour la première fois, j'ai utilisé cette règle de filtrage :

    sudo iptables -A INPUT ! -s $SUBNET_RESEAU -d $IP_SERVEUR/32 -p udp -m udp --dport 5060 -m hashlimit --hashlimit-above 5/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name RL-SIP-GLOBL-v4 --hashlimit-srcmask 24 -m comment --comment "RL SIP QUERIES 5/min burst 10/min" -j DROP

    Elle autorise 5 paquets par minute destinés au port UDP 5060 du serveur VOIP en vitesse de croisière et 10 paquets/minute par à-coups. Les utilisateurs membres du réseau ont la garantie de ne pas être filtrés grâce à « ! -s $SUBNET_RESEAU ».

    Je rends cette règle de filtrage résistante à un redémarrage avec le logiciel netfilter-persistent.



    Si cette règle de filtrage n'est pas idéale, elle a le mérite de calmer le jeu. Elle n'empêche pas le trunk SIP avec notre fournisseur de fonctionner normalement en vitesse de croisière, mais il ne faut pas effectuer plusieurs tentatives d'appel en une minute. Bref, cette règle fonctionne uniquement parce que je connais la plage IP des usagers de ce serveur VOIP, qu'ils sont très peu nombreux, et qu'ils n'utilisent pas compulsivement le téléphone.



    En environ 3 mois d'utilisation, cette règle de filtrage a produit le résultat suivant :

    Chain INPUT (policy ACCEPT 13M packets, 1285M bytes)
    pkts bytes target prot opt in out source destination
    83M 31G DROP udp -- !$SUBNET_RESEAU $IP_SERVEUR/32 udp dpt:5060 limit: above 5/min burst 10 mode srcip srcmask 24

    Elle a filtré 31 Go (!!!) de merde, mais elle en a aussi laissé passer 1,2 Go. Bref, pas idéal.

    Fri Aug 17 12:29:44 2018 - permalink -
    - http://shaarli.guiguishow.info/?HISXbA
  • Société Civile des Producteurs Associés - Déclaration annuelle d'utilisation de musique d'attente téléphonique

    On a reçu ça au boulot il y a quelques temps (oui, je l'ai caviardé). Je ne savais pas à quoi ressemble cette déclaration, maintenant je sais.

    Je constate que, si l'on utilise des musiques libres de droit, il faut fournir un justificatif… Ce qui en décourage l'utilisation puisque les artistes engagés dans cette voie-là signe rarement un bout de papelard depuis l'autre bout du ternet… Dans notre cas, nous utilisons une solution commerciale qui intègre le logiciel libre Asterisk, XiVo, ainsi que l'une des "musiques" livrées par défaut avec Asterisk. La société qui vend cette solution nous a signé un papier pour satisfaire la SCPA.

    Je ne sais pas comment est calculée l'estimation du nombre de lignes… En cherchant dans l'annuaire ? En demandant le routage aux opérateurs téléphoniques ? Dans notre cas, c'est erroné. De plus, chez nous, toutes les lignes peuvent être jointes de l'extérieur (juste, ce n'est pas publié dans l'annuaire) et une musique d'attente peut être jouée sur chaque ligne. Ben oui, même si tu me téléphones sur ma ligne directe, je peux te mettre en attente. Il me semble que c'est un comportement standard… Donc la facturation est illogique.

    Chaque année, la SCPA nous envoie cette déclaration… Avec une estimation du nombre de lignes erronée… Sans tenir compte qu'on a déjà répondu xx fois qu'on utilise de la musique libre de droit… Tout ce papier gaspillé… Toute l'énergie humaine gaspillée pour taxer une niche (non mais sérieux, qui savoure une musique d'attente téléphonique ?!)… Tout cet argent qui nourrit des intermédiaires inutiles… Tout cet argent qui n'est pas redistribué aux artistes, aux interprètes et aux producteur⋅rice⋅s car les organismes de collecte ne font même pas l'effort de rechercher ces personnes afin de leur filer leur chèque…

    Sun Feb 18 16:34:24 2018 - permalink -
    - http://shaarli.guiguishow.info/data/uploads/2018/02/SCPA-_-Déclaration_annuelle_dutilisation_de_musique_dattente_telephonique.pdf
  • Asterisk auto-dial out - voip-info.org [ réveil VOIP avec Asterisk :D ]

    Après avoir vu la présentation « Wake up the geek way! » de Gaël Pasgrimaud à PSES 2015 dans laquelle il nous présente son logiciel-réveil configurable via IRC et qui ne sonne pas si Gaël a causé sur IRC avant l'heure programmée, j'ai eu l'idée de me faire un réveil aléatoire.

    Aléatoire sur une plage d'horaire définie. L'idée derrière, c'est est de privilégier un réveil naturel (sommeil léger, tout ça, on est toujours un peu réveillé inconsciemment dans une plage horaire autour de l'heure de réveil que notre cerveau assimile par habitude) sur un réveil en force comme le fait généralement un réveil. Tout ça sans utiliser de capteurs et des bidules connectés cheppaquoi. Alors oui, si je me couche plus tard (ou plus tôt), ça n'empêchera pas le réveil de me réveiller brutalement. Forcément, y'a des jours où l'aléatoire tombe pas au bon moment.

    À la différence de Gaël, je n'ai pas dev' un bout de python qui a la classe (simplement parce que la lib panoramisk n'est pas packagée dans Debian et que j'ai pas trouvé d'équivalent potable) mais j'ai choisi de le faire en mode adminsys et crade. Et vu que j'ai appris des choses sur le fonctionnement d'Asterisk bah ça m'a bien plu.



    Asterisk, le serveur VOIP standard, est capable d'exécuter des appels téléphoniques tout seul simplement en lui fournissant un fichier texte qui décrit l'appel à effectuer dans /var/spool/asterisk/outgoing . Mieux que ça, Asterisk ce sert du mtime (date de dernière modif') de ce fichier pour déterminer la date et l'heure à laquelle l'appel doit être effectué ! Bref, tout simple. On notera que tout ce mécanisme repose sur inotify. Voir https://wiki.asterisk.org/wiki/display/AST/Asterisk+Call+Files



    L'idée est donc la suivante : placer un script en cron.daily (qui sera exécuté tous les jours à 6h25) qui placera un fichier dans /var/spool/asterisk/outgoing avec un mtime tiré au sort. Asterisk me téléphonera sur mon 06. Évidemment, sur mon 06, je configure une sonnerie différente pour le numéro de la ligne SIP utilisée par Asterisk histoire d'être réveillé en douceur. Si je décroche, Asterisk raccroche et considére qu'il a terminé son boulot. Si je ne réponds pas ou que je rejette l'appel, on a l'équivalent d'un snooze : Asterisk me téléphonera à nouveau dans 15 minutes (paramètrable).



    La première étape, c'est la configuration d'Asterisk (je pars du principe qu'Asterisk est déjà configuré / en état de marche sinon, voir ici : http://shaarli.guiguishow.info/?vHS3rA )

    • Vu que c'est Asterisk lui-même qui passera l'appel, il est inutile de créer un nouveau compte utilisateur dans sip.conf ;

    • Dans extensions.conf, il faut créer une nouvelle extension qui décrit le déroulement de l'appel. Le fichier dans /var/spool/asterisk/outgoing demande un appel mais ne dit pas ce qu'il faut faire ensuite, lorsque l'interlocuteur répond : jouer un son, raccrocher, dire quelque chose avec la synthèse vocale, proposer plusieurs choix, etc. ? Perso, je veux juste qu'Asterisk raccroche :

      [Wake-Up]
      exten => s,1,wait(1)      ; On attend 1 seconde.
      exten => s,2,Hangup(16)   ; On raccroche. 16 est le code de retour qui, en SIP, indique que l'appel s'est terminé normalement, comme attendu


    • On reload le dialplan : sip reload depuis la console Asterisk ou sudo systemctl reload asterisk ;



    La deuxième étape, c'est de créer notre cronfile (/etc/cron.daily/reveil ):

    #!bin/bash
    
    cat<<EOF > /tmp/reveil.call
    Channel: SIP/<utilisateur_sip.conf OU numero_tel@ligne_SIP_sip.conf>
    Callerid: WakeUpCall    ; Le nom qui s'affichera si l'appel est effectué en SIP (sinon c'est le numéro de la ligne SIP…)
    MaxRetries: 3           ; Combien de fois Asterisk doit essayer de re-téléphoner si l'appel est rejetté ou si pas de réponse ? En plus de l'appel initial.
    RetryTime: 900          ; Combien de temps entre chaque re-essai ? Ici 15 minutes. Ce qui nous fait un snooze de 15 minutes.
    WaitTime: 45            ; Combien de temps Asterisk doit-il attendre avant de déclarer que l'appel est un échec ? Ici 45 secondes. Attention : si le numéro appelé à un répondeur, il faut une durée d'appel inférieure au déclenchement du répondeur sinon l'appel sera considéré comme un succès même si c'est votre répondeur qui répond. ;)
    Context: Wake-Up        ; Contexte, extension et priorité dans l'extension. Ce que l'on a défini dans extensions.conf. On peut remplacer tout ça par « Application / Data » pour exécuter une application tiers.
    Extension: s
    Priority: 1
    EOF
    
    # Asterisk a besoin de modifier mtime pour programmer le retry
    # du call. chmod 777 + proprio = root ne fonctionne pas…
    chown asterisk:asterisk /tmp/reveil.call
    
    # On veut que le réveil sonne entre 8h00 et 9h59
    touch -d "$(shuf -i8-9 -n1):$(shuf -i0-59 -n1):00" /tmp/reveil.call
    
    # mv pour garder datetime + proprio
    mv /tmp/reveil.call /var/spool/asterisk/outgoing/


    Dans mon cas, l'appel s'effectue en VOIP, en utilisant CSIPSimple sur mon ordiphone. L'appel ne passe jamais par le réseau commuté donc ça ne coûte rien.

    Voilà pour un usage bateau. On peut aller plus loin et créer une extension qui, quand elle est déclenchée via un appel, supprime l'alarme pour la journée. Ainsi, si vous êtes réveillé avant l'heure programmée, vous désactivez le réveil en un appel. :D

    Sat May 28 18:27:15 2016 - permalink -
    - http://www.voip-info.org/wiki/view/Asterisk+auto-dial+out
  • Monter un petit serveur VOIP Asterisk sans prétention

    J'ai égratigné un peu le sujet de la VOIP à la fac. Si vous voulez vous y mettre, je vous conseille le cours suivant : https://jitsi.org/Education/RTCSof . Depuis longtemps, j'avais envie d'aller plus loin, de monter un serveur SIP capable de communiquer avec des téléphones fixes et mobiles.

    Ça tombe bien : chez ARN, FAI associatif en Alsace, on a des ressources Internet uniques (un bloc d'adresses IPv4, un d'IPv6 et un numéro d'AS). Toutes les informations technico-administratives concernant ces ressources sont consignées dans des bases de données publiques, dans notre cas, celle du RIPE (qui gère la région Europe (au sens trèèèès large) + Moyen-Orient). Pour plus d'infos, voir http://www.guiguishow.info/2014/04/18/decouvrons-la-ripe-database/ . Cela inclu les emails et les numéros de téléphone de personnes responsables (mais pas forcément techniciennes) de ces ressources. Pour le mail, pas de problème : il s'agit d'alias et d'adresses avec un délimiteur donc en cas de spam, on change les adresses et basta, même pas besoin d'installer un antispam complexe. Pour les numéros de téléphone, c'est nos 06 persos et c'est bien là le blem. Bon, il faut être honnête : les spammeurs n'utilisent pas ces données : depuis l'allocation de nos ressources (en février 2013), soit bientôt 3 ans, nous avons reçu un seul appel commercial pour du transit IP (donc c'était du démarchage ciblé). Néanmoins, ça va servir de point de départ, de motivation, pour monter un serveur SIP dans l'asso.

    On veut donc un serveur SIP qui permet de recevoir et d'émettre des appels depuis/vers les fixes et les mobiles + émettre et recevoir des appels entre nous, les admins (comme Mumble mais en plus "j'me la pète corporate" voyez). Quand on reçoit un appel depuis un fixe ou un mobile, on transfert ça sur les 06 persos. Le premier admin ARN qui décroche gagne le droit de causer à l'interlocuteur.


    Pour faire le lien avec l'extérieur, on prend une ligne SIP chez OVH à 1,20€/mois. Attention quand même : elle permet un unique appel en simultanée donc quand nous recevrons un appel de l'extérieur, nous ne pourrons pas réémettre vers nos 06 persos (la seule ligne disponible sera occupée). Il faut donc que chaque admin installe un logiciel de VOIP sur son ordiphone. Pour les admins qui n'ont pas d'ordiphone baaaaaaah c'est perdu ou il faut prendre une ligne SIP à 6€/mois ce qu'on n'a pas voulu faire compte tenu de l'utilité de la chose. On notera donc que chaque appel émis coûte aussi à l'admin ARN s'il décroche alors qu'il est connecté en 3G/4G.

    Alors oui, on n'est pas obligé de brancher un serveur SIP derrière OVH, c'est totalement overkill puisqu'on pourrait très bien faire du renvoi d'appel depuis le manager mais je rappelle que le but initial c'est de découvrir plus en détail la VOIP, pas d'avoir un truc tout fait. :)


    Pour le choix du serveur SIP, j'en connais deux en logiciel libre : Asterisk et FreeSWITCH. Selon moi, ce qui les sépare c'est la même chose que ce qui différencie apache httpd de nginx : Asterisk est le standard, le plus complet et le plus documenté. FreeSWITCH est plus léger et modulaire. Niveau config, c'est texte pour Asterisk, XML pour FreeSWITCH, si ça peut vous aider. ;) Afin de comprendre pourquoi le standard du marché n'est pas adapté à notre cas d'usage, il faut l'expérimenter. Donc allons-y pour Asterisk.


    Pour configurer notre Asterisk, je me suis beaucoup servi de l'article publié dans GNU/Linux Pratique Essentiel numéro 90 de juillet-août 2015.

    On installe Asterisk (sans les voix, sans les sonneries, sans rien car nous n'en avons pas besoin) : apt-get install asterisk

    La config' par défaut est extrêmement complète, bien annotée avec beaucoup d'exemples. Il faut donc la conserver intacte : cd /etc/asterisk ; mv sip.conf sip.conf.origin ; mv extensions.conf extensions.conf.origin ; mv extensions.lua extensions.lua.origin . Attention à bien virer extensions.lua sinon vous aurez des comportements inattendus (Asterisk qui répond sur des numéros pour lesquels on n'aura pourtant rien configuré dans extensions.conf).

    À partir de là, nous allons travailler sur deux fichiers de conf' (vides puisqu'on vient de les déplacer ;) ) :
        * sip.conf qui sert à configurer les paramètres généraux du serveur (écoute sur tels protocoles, tels ports,...) + la liste des utilisateurs autorisés, leur mdp et leurs options spécifiques.

        * extensions.conf qui contient le dialplan, c'est-à-dire les associations entre un numéro de téléphone et les actions ordonnées à faire (1) décrocher, 2) lancer un message vocal, 3) faire suivre l'appel au bon interlocuteur selon le choix effectué par l'appelant, 4) prendre un message si l'interlocuteur ne décroche pas,...). C'est donc ici qu'on dit que, quand on est connecté au serveur en tant qu'abonné, le numéro de téléphone « 2 » permet de téléphoner à GuiGui et « 3 » à tonton. Notons que mon morceau de phrase « en tant qu'abonné », ça se nomme un contexte et ça ressemble à un VirtualHost : un numéro n'a pas le même sens (il ne permet pas de téléphoner à la même personne) dans deux contextes différents. Le contexte peut être vu comme une autorisation : je t'ai reconnu, tu es GuiGui, on t'a assigné le contexte « abonnés », donc tu peux téléphoner à tonton avec le numéro « 3 » et émettre des appels externes via la ligne SIP OVH. En revanche, quand tu te présentes avec l'identité GuiGui-tel, tu peux simplement recevoir des appels, pas émettre). Ce ne sont que des exemples, tout est possible avec Asterisk. :)


    Voici notre sip.conf :
    [general]
        ; On écoute sur UDP, en IPv4 et IPv6 (dépend de la valeur de bindv6only côté noyau), sur le port par défaut (5060)
        transport=udp
        udpbindaddr=::
        ; bindport=5061

        ; On écoute sur TCP, en IPv4 et IPv6 (même remarque), sur le port par défaut (5060)
        tcpenable=yes
        tcpbindaddr=::
        ; tcpbindport=5061

        ; Pour les appels inter-domaines, on peut utiliser les enregistrements DNS. Ça sort de notre cahier des charges donc non.
        srvlookup=no

        ; Un client s'enregistre pour 30 minutes. Une valeur plus petite augmente le trafic réseau inutile, une valeur plus grande détectera plus tard un changement d'IP du client, par exemple.
        defaultexpiry=1800

        ; On n'attend pas plus longtemps entre l'appui sur deux touches durant la composition d'un numéro.
        allowoverlap=no

        ; Les utilisateurs qui ne se sont pas authentifiés sur le serveur ne peuvent pas émettre des appels !
        allowguest=no

        ; Ne jamais dire si un login seul est valide mais toujours valider le couple login+mdp en entier.
        ; Un attaquant ne sait ainsi pas quels logins sont valides et donc sur quels logins il doit se concentrer pour trouver les mdps
        alwaysauthreject=yes

        ; Si on ne spécifie pas un contexte pour un utilisateur, il tombe dans le contexte nommé « ext »
        context=ext

        ; Asterisk doit s'enregistrer auprès de notre fournisseur SIP, à savoir OVH
        ; Le login est le numéro de téléphone attribué à la ligne au format international mais le « + » est remplacé par deux zéros. Exemple : 01 23 45 67 89 => 0033123456789
        register => <login>:<mdp>@sip3.ovh.fr

        ; Lors de la mise en relation entre deux utilisateurs de notre serveur, Asterisk envoie cette liste de codecs (les clients des deux interlocuteurs renégocieront après cette liste).
        ; Il est parfois utile d'avoir une petite liste de codec, par exemple pour éviter de crasher un SIP ALG. Voir http://shaarli.guiguishow.info/?h4fUtQ
        ; On peut aussi préciser les codecs utilisateur par utilisateur.
        ; disallow=all
        ; allow=speex32
        ; allow=speex16
        ; allow=alaw
        ; allow=ulaw
        allow=all

        ; Normalement, les flux audio/vidéo ne transitent pas par le serveur SIP, seulement la signalisation (à qui je veux téléphoner, ça sonne, fin d'appel,...) passe par le serveur SIP.
        ; Néanmoins, pour aider la traversée des NA(P)T, on peut demander à Asterisk de faire transiter les flux médias par lui-même.
        directmedia=no

    ; On définit tous les utilisateurs, y compris le fournisseur qu'est OVH.
    [guigui]
        type=friend                ; Défini le type d'appels : peer = appels sortants / user = appels entrants / friend = les deux.
        host=dynamic           ; L'utilisateur peur se connecter depuis n'importe où (on peut filtrer par adresse IP si elle est fixe ;) )
        secret=monMdP      ; Le mot de passe de cet utilisateur. Mettez un mdp résistant car il ne faudra que quelques minutes d'existence à votre serveur pour se faire bruteforcer.
        context=abonne       ; Dans quel contexte tombe cet utilisateur ?
        ; nat=yes                   ; Cet utilisateur est derrière un NAT, il faut donc être plus coulant (même si ça ne change pas grand'chose)

    [ovh]
        type=peer
        host=sip3.ovh.fr
        defaultuser=<login>  ; voir « register ci-dessus »
        secret=monMDP
        insecure=invite          ; pas besoin d'être authentifié pour téléphoner depuis ici
        dtmfmode=rfc2833   ; norme d'encodage des appuis sur les touches du téléphone (pour composer un numéro ou "communiquer" avec un serveur vocal interactif ("appuyez sur 1 pour joindre le service"...)
        ; Comme on n'a pas précisé le contexte, ovh tombera dans le contexte par défaut que l'on a défini, aka « ext » ;)


    Voici notre dialplan (extensions.conf) :
    [general]
        ; Défini si le dialplan peut être modifié dynamiquement et sauvegardé depuis la console (ici : non).
        static=yes
        writeprotect=yes

        ; Lorsqu'une extension arrive en manque de chose à faire, alors Asterisk termine l'appel de la manière qui lui semble appropriée (raccrocher normalement, raccrocher en occupé,...) au lieu d'attendre qu'une nouvelle extension soit utilisée lors d'un nouvel appel.
        ; C'est pourquoi, ci-dessous, je ne précise pas une étape après Dial() alors qu'on pourrait envisager une étape supplémentaire : Hangup(). ;)
        autofallthrough=yes

    ; Les personnes qui nous téléphonent depuis un fixe ou un portable (et qui passent donc par notre ligne OVH) tombent dans ce contexte...
    [ext]
        ; ... et leur seule action possible et de faire sonner les téléphones de guigui. Ils ne peuvent pas téléphoner à qui que ce soit d'autre ni même téléphoner à des numéros surtaxés.
        ; Le premier téléphone qui décroche cesse de faire sonner les autres téléphones.
        exten => s,1,Dial(SIP/guigui&SIP/guigui-tel) ; notons que cet exemple ne fonctionnera pas puisque l'utilisateur « guigui-tel » n'existe pas dans sip.conf.


    ; Nos utilisateurs enregistrés
    [abonne]
    ; Syntaxe : exten => X,Y,<Action>. X, c'est le numéro qu'il faudra composer. Y c'est l'ordre puisqu'on peut enchaîner plusieurs actions (1) décrocher, 2) lancer un message vocal, 3) faire suivre l'appel au bon interlocuteur selon le choix effectué par l'appelant, 4) prendre un message si l'interlocuteur ne décroche pas,...). Action est une action comme faire suivre l'appel (Dial), raccrocher (Hangout). Chaque action à des paramètres (Dial peut tenter de faire sonner l'interlocuteur Z secondes, par exemple).

        ; Ici, taper le numéro de téléphone « 1 » ou la chaîne de caractères « guigui » permet de téléphoner à l'utilisateur « guigui » défini dans sip.conf ;)
        exten => 1,1,Dial(SIP/guigui)
        exten => guigui,1,Dial(SIP/guigui)

        ; Ici, taper « 2 » téléphone à guigui mais sur un autre compte. Cet exemple ne fonctionnera pas puisque l'utilisateur « guigui-tel » n'est pas défini dans sip.conf ;)
        ; exten => 2,1,Dial(SIP/guigui-tel)
        ; exten => guigui-tel,1,Dial(SIP/guigui-tel)

        ; Taper « 22 » et Asterisk décroche et envoie « Je voudrais le 22 à Asnières », utile pour savoir si le serveur fonctionne sans avoir d'amis ;))))
        exten => 22,1,answer
        exten => 22,n,Morsecode("Je voudrais le 22 à Asnières.")

        ; Tout autre numéro sera envoyé sur la ligne OVH (Asterisk permet d'utiliser des regex sur les numéros).
        exten => _X.,1,Dial(SIP/${EXTEN}@ovh);
        ; On pourrait être plus rigoureux et filtrer pour n'envoyer que les numéros commençant par 01,02,03,04,05,06,07 et 09, ce qui éviterait les problèmes de facturation (08, tout ça) :
        ; exten => _0[1-7]XXXXXXXX,1,Dial(SIP/${EXTEN}@ovh)
        ; exten => _09XXXXXXXX,1,Dial(SIP/${EXTEN}@ovh)


    Il faut ensuite relancer le serveur SIP : sudo systemctl restart asterisk.


    Pour le debug, Asterisk possède une console accessible via la commande asterisk -r. Commandes utiles :
        * sip show registry pour vérifier qu'Asterisk s'enregistre bien chez les fournisseurs (OVH dans notre cas) ;

        * sip reload pour recharger la configuration comme le dialplan ;

        * sip show peers pour voir tous les utilisateurs, lesquels sont connectés, depuis quelle IP,... ;

        * dialplan show permet de voir le dialplan complet (tous fichiers de conf' confondus) ;

        * console dial <extension>@<contexte> permet de se faire appeler par Asterisk pour vérifier que ça fonctionne. Exemple : console dial 1@abonne ou console dial guigui@abonne téléphonera à l'utilisateur guigui dans notre cas ;

        * sip show channels permet de voir les dialogues en cours (tel utilisateur vient de s'enregistrer, un appel en est dans telle phase,...) ;

        * Si vous précisez « -vvv » pour entrer sur la console (« asterisk -r -vvv »), vous aurez le debug : qui appelle, comment Asterisk route l'appel (quelle partie du dialplan il a utilisée), problème de codec,...


    Passons maintenant à nos pires cauchemars :
        * Le NA(P)T et les pare-feux. En effet, le protocole SIP transmet juste la signalisation de l'appel (à qui je veux téléphoner, le téléphone du correspondant sonne, il décroche, fin de l'appel). Les flux médias sont transmis sur des sessions UDP différentes dont les numéros de ports sont échangés... dans le contenu SIP. Ça ne vous rappelle rien ? Si, les sessions données de FTP ou les transferts de fichiers sur IRC. Autrement dit, ça passe super mal les NAT et les pare-feux. Pour voir l'ampleur du problème et sa complexité, je vous recommande la lecture de http://www.asteriskguru.com/tutorials/sip_nat_oneway_or_no_audio_asterisk.html . Pour que ça fonctionne quand même, il faudra déployer toute la panoplie côté client : un routeur équipé d'un ALG/NAT helper, un logiciel client qui implémente STUN (afin qu'il obtienne sa véritable IP publique) voir des techniques plus pointues comme ICE... La prise en charge de ces techniques de contournement de NAT varie beaucoup d'un logiciel client à l'autre. IPv6 n'est d'aucun secours ici vu le faible support. Un VPN chez un FAI de la FFDN est, en revanche, une bonne idée puisque pas de NAT par défaut.

        * Les attaquants. Ils vont attaquer votre serveur dans l'optique d'obtenir des appels à l'international gratuit pour faire des campagnes de phishing téléphoniques et/ou vous ruiner. Il faut donc veiller à ce qu'un utilisateur pas défini dans sip.conf NE tombe PAS dans le contexte qui permet de sortir avec la ligne SIP OVH sinon la facture va être vraiment salée. Dans la même veine, il faut interdire aux utilisateurs non-identifiés sur votre serveur de passer des appels anonymes. C'est redondant avec la mesure précédente mais il vaut mieux ceinture et bretelles. Dans la continuité, il faut avoir des mots de passe solides pour vos utilisateurs car votre serveur sera bruteforcé en permanence.


    Pour utiliser votre serveur SIP, il vous faudra un logiciel de VOIP. J'en ai testé plusieurs, tous ont des lacunes, les résultats sont consignés là : http://shaarli.guiguishow.info/?EYkbVQ .


    Prolongement possible : je pense à ouvrir ce serveur SIP à tous les membres d'ARN. En configurant TLS (afin de ne pas faire fuiter les métadonnées, qui téléphone à qui, quand, selon quelle fréquence,...) et en demandant aux adhérents d'installer un logiciel simple d'utilisation mais supportant ZRTP (chiffrement des flux médias de bout en bout) sur son ordiphone comme CSipSimple, on obtient de la communication vocale sécurisée et conviviale entre adhérents de l'association.

    Pas besoin de Signal et autres applis kikoos modernes centralisées (voir ici pour mes critiques de ces applis http://shaarli.guiguishow.info/?CGDOlw et http://shaarli.guiguishow.info/?vungLg).

    Pourquoi ce n'est pas déjà en place ? Parce que je ne suis pas un VOIP guru et qu'avec le NAT que l'on a de partout de nos jours, il va falloir être prêt à debug comme des porcs (voir http://shaarli.guiguishow.info/?a5nv4A et http://shaarli.guiguishow.info/?h4fUtQ pour des exemples de merdes).
    Wed Jan 20 22:31:40 2016 - permalink -
    - http://shaarli.guiguishow.info/?vHS3rA
    nomarkdown
  • Le lulz de la VOIP - Tome 3 : Numericable

    Chez Numericable, avec un modem/routeur Netgear de 2011 (donc probablement le Netgear CG3100L), il est possible de s'enregistrer sur un serveur/proxy SIP externe perso avec Jitsi/Linphone (Ekiga peine parfois : il s'enregistre sans problème et se désinscrit aussitôt de sa propre volonté (« Erreur de transfert »...)). Il est tout aussi possible d'émettre des appels. Tout ça fonctionne en WiFi et en filaire.

    En revanche, au moindre appel entrant, BOOOM, la box reboot. Le reboot se produit pile-poil à la réception du message SIP INVITE. On remarque que le reboot désactive parfois le WiFi ou fait perdre la clé WPA2. Priceless. Attention, pour que cela se produise, il faut d'abord passer le NAT donc être un paquet d'une connexion existante (même IP source, même port source, même IP dest, même port dest), ça limite les dégâts possibles. ;)

    On remarque que :
        * Ce comportement se produit uniquement si le serveur/proxy SIP écoute sur 5060, ce qui fait qu'il envoie des paquets UDP SIP avec sport=5060 ;

        * Ce comportement se produit uniquement avec SIPoUDP. Aucun problème avec SIPoTCP, même si le serveur/proxy écoute sur 5060 ;

        * La box ne répond pas à l'INVITE donc c'est vraiment l'INVITE entrant la cause du problème.

        * On remarque que ça concerne tout paquet arrivant avec sport=5060, peu importe son contenu. Même un paquet de bourrage fait planter la box. La seule condition est que ce paquet dépasse 1645 octets. Rien à voir avec la fragmentation puisque le paquet est fragmenté bien avant ce seuil. Ça sent le buffer overflow des familles.

    Une recherche sur le web montre que c't'un problème connu : http://www.justneuf.com/forum/topic/126269-r%C3%A9gl%C3%A9-v%C3%A9rrouillage-de-certains-ports/ , http://www.netgear-forum.com/forum/index.php?showtopic=62375 , http://cablebox-news.com/forums/ne-peux-plus-recevoir-des-appels-voip-sur-un-client-sip-sur-pc-t1605.html , entre autres.

    Cela vient de la SIP ALG du modem/routeur Netgear. En cherchant sur le web, on trouve des tonnes d’occurrences... Et Netgear est loin d'être le seul constructeur à avoir une SIP ALG défectueuse (voir http://www.voip-info.org/wiki/view/Routers+SIP+ALG )... C'quoi une SIP ALG, d'abord ? Sous Netfilter, on nomme ça un nat helper (ou juste helper) : ça inspecte un protocole donné connu pour avoir des problèmes avec le NAT car faisant transiter des informations de couche 3/4 en couche 7 (FTP, SIP, IRC,...) afin d'y récupérer les ports sur lesquels la communication va continuer/avoir lieu et ainsi de pouvoir laisser passer les nouvelles connexions qui auront lieu sur ces ports en les considérant relatives à une connexion principale déjà ouverte.

    Aucune option dans la NCBox permet de virer la SIP ALG de Netgear donc pour avoir de la VOIP en état de marche, il reste : VPN ou changer le port d'écoute du serveur/proxy SIP ou passer en TCP ou, solution intéressante : restreindre la liste des codecs afin que l'offre SDP ne fasse pas exploser la taille du paquet SIP INVITE au-delà de 1645 octets.

    Ce dernier point se fait côté serveur SIP. Exemple avec Asterisk : il faut ajouter ce qui suit dans sip.conf, section « general » (ou sur un peer SIP donné concerné par le problème) :
    « disallow=all
    allow=speex32
    allow=speex16
    allow=alaw
    allow=ulaw »

    Pour mettre ce problème amusant en évidence, il faut un compte SIP sur un serveur/proxy externe et on peut utiliser mon bout de Python pour générer des faux INVITE SIP : http://www.guiguishow.info/wp-content/uploads/2015/11/sipFakeINVITE.py
    Wed Nov 25 02:21:31 2015 - permalink -
    - http://shaarli.guiguishow.info/?h4fUtQ
    nomarkdown
  • ~x0r - Orange voit rouge

    « Ma motivation principale était celle d'utiliser un PBX Asterisk sous Linux sur ma ligne Livebox.

    [...]

    'ai alors décidé de creuser plus loin afin de savoir quels étaient les identifiants SIP utilisés pour s'authentifier auprès du proxy SIP Orange. Il s'avère que le client SIP officiel n'utilise aucun mot de passe, mais obtient un des secrets nécessaires pour l'échange RFC 2617 (authentification HTTP Digest) par une méthode totalement propre à Orange. Ces secrets étaient impossibles à obtenir sans décompiler l'application d'origine. Impossible donc d'exploiter sa ligne SIP sans autre chose que les applications proposées par Orange.

    C'est en modifiant le processus d'authentification qu'Orange cassait l'interopérabilité avec les autres implémentations SIP conformes à la RFC 3261, empêchant ceux-ci de s'enregistrer directement auprès de l'infrastructure d'Orange.

    Je m'inscrivais donc dans une double démarche d'interopérabilité : la possibilité d'utiliser un terminal SIP « RFC 3261 » avec ma ligne téléphonique comprise dans l'abonnement que je paye d'une part, et la réimplémentation des extensions propriétaires d'Orange sous Linux et FreeBSD d'autre part.

    [...]

    Je fais en effet l'objet de pressions de la part d'Orange visant à me faire cesser le développement et la diffusion de siproxd_orange. Après avoir consulté plusieurs personnes dont un avocat spécialisé en droit d'auteur, j'ai estimé plus prudent d'abandonner la diffusion de ce projet.

    [...]

     Mais je suis surtout triste de devoir prendre des décisions contraires à mes valeurs de curiosité scientifique et de partage du savoir.

    Il s'agissait de mon plus gros projet de rétroingénierie jusqu'à maintenant. Même en mettant hors ligne les archives des sources de siproxd_orange, je n'accepterai pas l'idée d'avoir sacrifié tous ces week-ends, toutes ces soirées et toutes ces pages de mon cahier de brouillon en vain.

    L'étape d'après serait d'obtenir les informations nécessaires à l'interopérabilité par une autre voie que la décompilation, par une méthode qui m'autoriserait à les publier. Je n'en dirai pas plus ; je sais désormais que des salariés d'Orange ouvertement hostiles à ce projet me lisent.

    En tout cas, je n'ai pas dit mon dernier mot. »
    Thu Jan 29 17:27:01 2015 - permalink -
    - http://x0r.fr/blog/47
    nomarkdown
Links per page: 20 50 100
page 1 / 1
Mentions légales identiques à celles de mon blog | CC BY-SA 3.0

Shaarli - The personal, minimalist, super-fast, database free, bookmarking service by the Shaarli community